0.进程三种状态图
u=2354234515,1090077856&fm=26&gp=0.jpg1.有N个进程共享同一临界资源,如用信号量机制,实现对一临界资源的互斥访问,则信号量的变化范围是?
A:1----N B:1----(-N) C:1----(N-1) D:1----[-(n-1)]
D 。当没有进程使用时是1 且最多是1.
当有进程申请时便减1 第一个申请是0 第二个是-1 类推可得D
2.设两个进程共用一个临界资源的互斥信号量mutex=1,当mutex=-1时表示()。
A一个进程进入了临界区,另一个进程等待
B没有一个进程进入临界区
C两个进程都进入临界区
D两个进程都在等待
D互斥信号量不采用自旋锁的方式实现,mutex初始值为1,当一个准备进入临界区时,mutex - 1 = 0,该进程进入临界区;
另一个进程准备进入临界区时,mutex - 1 = -1,mutex < 0时将该进程挂起到mutex的列表中,等待被唤醒。
因此一个进程已经进入临界区,另一个进程在等待。
3.下面关于线程的叙述中, 正确的是( )。
A.不论是系统支持线程还是用户级线程, 其切换都需要内核的支持。
B.线程是资源的分配单位, 进程是调度和分配的单位。
C.不管系统中是否有线程, 进程都是拥有资源的独立单位。
D.在引入线程的系统中, 进程仍是资源分配和调度分派的基本单位。
C
4.在下面的叙述中, 正确的是( )。
A.引入线程后, 处理机只在线程间切换。
B.引入线程后, 处理机仍在进程间切换。
C.线程的切换, 不会引起进程的切换。
D.线程的切换, 可能引起进程的切换。
D 属于同一进程的多个线程之间的切换不会引起进程的切换,只有属于不同进程的线程之间的切换才会引起进程的切换。
5.当一进程因在记录型信号量S上执行P(S)操作而被阻塞后,S的值为()。
A>0
B<0
C≥0
D≤0
对于记录型信号量,当 s<0 的时候,请求进程会阻塞
对于整型信号量,当s<=0的时候,请求进程不会阻塞,而是进入盲等状态
记录型信号量 S=0表示资源全部用完,没有阻塞。选B
看看记录型信号量的wait(S)的代码,就明确了。
既然执行P(S)操作能被阻塞(block),说明if语句的判断为真,所以S<0。
procedure wait(S)
var S:semaphore;
begin
S.value:=S.value-1;
if S.value<0 then block(S,L);
end
6.当一进程因在记录型信号量S上执行V(S)操作而导致唤醒另一进程后,S的值为()。
A>0
B<0
C≥0
D≤0
D唤醒另一进程,说明有进程可被唤醒,就是说有进程在等待进行临界区,若V操作前只有一个进程在等待,则V操作之后S=0,若V操作前有多个进程在等待,是V操作之后S<0,所以,综合来说,S<=0
①记录型信号量不会出现“忙等”的现象,就是S<=0时不会不停while循环尝试,所以题目说是唤醒另一个进程。
②记录型信号量有一个进程链表指针L,V(S)之后,判断是否S<=0,是的话,就说明等待队列上有进程,所以就wakeup(S.L)唤醒一个等待队列里的进程。目的是提醒这个进程可以占用刚刚释放掉的这个资源了。记录型信号量不会忙等,就是因为采用了这种机制。
看看记录型信号量下面这段代码就更明确了。
既然执行V(S)操作能导致唤醒另一进程,说明if语句的判断为真,所以S<=0。
跟唤醒另一进程是否又P(S)没关系,后面的过程不考虑了。
procedure signal(S)
var S:semaphore;
begin
S.value:=S.value+1;
if S.value≤0 then wakeup(S,L);
end
7.如果有3个进程共享同一互斥段,而且每次最多允许两个进程进入该互斥段,则信号量的应设置为()。
A.3
B.2
C.1
D.0
正确答案:B
解析:信号量的初值应设为与最多允许进入互斥段的进程数相同,所以为2
8.在下列解决死锁的方法中,属于死锁预防策略的是 ()
A.银行家算法
B.资源静态分配
C.剥夺资源法
D.资源分配图化简法
正确答案:B
银行家是来避免死锁的
剥夺资源法解除死锁
资源分配图化简法检测死锁
资源静态分配,摒弃“请求和保持” 条件,预防死锁
9.某系统中有3个并发进程,都需要同类资源4 个,试问该系统不会发生死锁的最少资源数是:
A9
B10
C11
D12
B
三个进程1、2、3的执行都需要A、B、C、D四个资源,那么最少的分配情况就是,我给你3个A,3个B,3个C,1个D,然后你们三个进程分别得到了ABC,差个D就可以进行任务了,然后三个进程就去抢夺这个D,而这个过程是不会发生死锁的。
抢夺资源这个过程本身不会发生死锁,因为资源是一整块的,可以用原子性来理解,所以不存在一个进程占有这个资源的一半的这种情况。而当D被其中一个进程占用后,其他两个进程是无法进行资源抢占的,所以就阻塞等待直到资源释放,再抢夺再等待
死锁的发生是因为:我进程1要执行一个任务,这个任务同时需要资源A、B,而我进程1在抢占了A资源后要抢占B时发现B已经被另一个进程抢占了,这个时候另一个进程又不放手资源B,所以就僵持到天亮
10.某车站售票厅, 任何时刻最多可容纳 20 名购票者进入, 当售票厅中少于 20 购票者时, 则厅外的购票者可立即进入, 否则需在外面等待。 若把一个购票者看作一个进程, 请用P、 V 操作管理这些并发进程时, 应怎样定义信号量? 写出信号量的初值以及信号量各种取值的含义。
答: 设置一个信号量 S, 表示售票厅里还可以容纳的人数, 初值为 20。 每个购票者的
描述如下:
Semaphore S=20;
Buyer()
{
wait(S);
进入售票厅;
购票;
退出售票厅;
signal(S);
}
11.理发店里有一位理发师、 一把理发椅和 N 把供等候理发的顾客坐的椅子。 如果没有顾客, 理发师便在理发椅上睡觉。 当一个顾客到来时, 它必须叫醒理发师。 如果理发师正在理发时又有顾客来到, 如果有空椅上可坐, 顾客就坐下来等待, 否则就离开理发店。
答: 本题使用 3 个信号量和一个控制变量: 控制变量 waiting 用来记录等候理发的顾客
数, 初值为 0; 信号量 customers 用来记录等候理发的顾客数, 并用作阻塞理发师进程, 初
值为 0; 信号量 barbers 用来记录正在等候顾客的理发师数, 并用作阻塞顾客进程, 初值为 0;
信号量 mutex 用于互斥, 初值为 1。 同步算法描述如下:
semaphore customers=0; /*等候理发的顾客数*/
semaphore barberers=0; /*等候顾客的理发师数*/
semaphore mutex=1;
int waiting=0;
main()
{
cobegin
barbers();
customers();
coend
}
barber()
{
while(true)
{
wait(customers); /*是否有等候的顾客*/
wait(mutex);
waiting=waiting-1; /*顾客数减 1*/
signal(barbers); /*理发师开始理发*/
signal(mutex);
理发;
}
}
customer()
{
wait(mutex);
if(waiting<N)
{
waiting=waiting+1; /*若有空椅子, 等候的顾客数加 1*/
signal(customers);
signal(mutex);
wait(barbers);
坐下等候服务;
}
else
{
signal(mutex); /*无空椅子则离开*/
}
}
2019426-230209.jpg
2019426-230818.jpg
网友评论