下面是一个并发进程的程序代码,正确的说法是( )。 semaphore x1=x2=y=1; int c1=c2=0: cobegin procedure P1 procedure P2

admin2021-08-17  17

问题 下面是一个并发进程的程序代码,正确的说法是(    )。
    semaphore x1=x2=y=1;
int c1=c2=0:
cobegin
procedure P1                        procedure P2
    P(x1);                             P(x2)
    if(++c1=1)P(y);                    if(++c2=1)P(y);
    V(x1);                             V(x2);
    computer(A);                       computer(B);
    P(x1);                             P(x2);
    if(--c1=0)V(y);                    if(--c2=0)V(y);
    V(x1);                             V(x2);
end                                 end
coend

选项 A、进程不会死锁,也不会饥饿
B、进程不会死锁,但是会饥饿
C、进程会死锁,但是不会饥饿
D、进程会死锁,也会饥饿

答案B

解析 本题考查PV操作与死锁以及饥饿的关系。仔细考察程序代码,我们似曾相识,可以看出是一个扩展的“单行线”的问题。也就是说,某单行线只允许单方向的车辆通过,在单行线的人口设置信号量y,在告示牌上显示某一时刻各方向来车的数量c1和c2,要修改告示牌上的车辆数量必须互斥进行,为此设置信号量x1和x2。若某方向的车辆需要通过时,首先要将该方向来车数量c1或c2增加1,并查看自己是否是第一个进入单行线的车辆,若是,则获取单行线的信号量y,进入单行线。通过此路段以后出单行线时,将该方向的车辆数c1或c2减1(当然是利用x1或x2来互斥修改),并察看自己是否是最后一辆车,若是,则释放单行线的互斥量y,否则,保留信号量y,让后继车辆继续通过。双方的操作如出一辙。考虑出现一个极端情况,即当某方向的车辆首先占据单行线并后来者络绎不绝时,另一个方向的车辆就再没有机会通过该单行线了。从而造成饥饿。由于有信号量的控制,死锁的可能性没有了(即双方同时进入单行线,在中间相遇,造成双方均无法通过的情景)。
转载请注明原文地址:https://kaotiyun.com/show/hX3i777K
0

相关试题推荐
最新回复(0)