假设我们要使用二进制信号量 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 点插入同步语句。
以下哪项将始终导致输出以 ‘001100110011’ 开头?
(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 处的 V(S),S 最初为 1,T 最初为 0
(C) W 处的 P(S),X 处的 V(T),Y 处的 P(T),Z、S 和 T 处的 V(S) 最初为 1
(D) W 处的 P(S),X 处的 V(S),Y 处的 P(T),Z 处的 V(T),S 最初为 1,T 最初为 0答案:(乙)
说明: 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 的值。
整个过程将重复以给出输出 00 11 00 11 … 。
因此,B 是正确的选择。
观看 GeeksforGeeks 视频说明:
如果您发现上面的帖子有任何错误,请在下面发表评论。这个问题的测验