假设我们要使用二进制信号S和T同步两个并发的进程P和Q。下面显示了进程P和Q的代码。
Process P:
while (1) {
W:
print '0';
print '0';
X:
}
Process Q:
while (1) {
Y:
print '1';
print '1';
Z:
}
同步语句只能在W,X,Y和Z点插入
以下哪项将确保输出字符串永远不包含格式为01 ^ n0或10 ^ n1的子字符串,其中n为奇数?
(A) W处的P(S),X处的V(S),Y处的P(T),Z,S和T处的V(T)最初为1
(B) W处的P(S),X处的V(T),Y处的P(T),Z,S和T处的V(S)最初为1
(C) W处的P(S),X处的V(S),Y处的P(S),Z,S处的V(S)最初为1
(D)在W处的V(S),在X处的V(T),在Y处的P(S),在Z,S和T处的P(T)最初为1答案: (C)
说明: P(S)表示等待信号量“ S”,而V(S)表示等待信号量“ S”。这些函数的定义是:
Wait(S) {
while (i <= 0) ;
S-- ;
}
Signal(S) {
S++ ;
}
最初,S = 1和T = 0以支持过程“ P”和“ Q”中的互斥。由于S = 1,将执行过程’P’,并且函数Wait(S)将减小’S’的值。因此,S = 0。同时,在过程’Q’中,T = 0。因此,在过程“ Q”中,控制将停留在while循环中,直到时间过程“ P”打印“ 00”并通过调用函数V(T)来增加“ T”的值。当控件处于过程“ Q”时,S = 0,过程“ P”将停留在while循环中。直到时间“ Q”打印“ 11”并通过调用函数V(S)使S = 1时,过程“ P”才会执行。
因此,过程“ P”和“ Q”将继续重复以给出输出“ 00110011……”。
如果您在以上文章中发现任何错误,请在下面发表评论。
这个问题的测验