对计数信号量的 P 和 V 操作,其中 s 是计数信号量,定义如下:
P(s) : s = s - 1;
if (s < 0) then wait;
V(s) : s = s + 1;
if (s <= 0) then wakeup a process waiting on s;
假设 Pb 和 Vb 提供了对二进制信号量的等待和信号操作。两个二进制信号量 Xb 和 Yb 用于实现信号量操作 P(s) 和 V(s) 如下:
P(s) : Pb(Xb);
s = s - 1;
if (s < 0) {
Vb(Xb) ;
Pb(Yb) ;
}
else Vb(Xb);
V(s) : Pb(Xb) ;
s = s + 1;
if (s <= 0) Vb(Yb) ;
Vb(Xb) ;
Xb 和 Yb 的初始值分别为
(一) 0 和 0
(B) 0 和 1
(C) 1 和 0
(D) 1 和 1答案: (C)
解释:假设 Xb = 0,那么由于 P(s): Pb(Xb) 操作,Xb 将为 -1,进程将被阻塞,因为它将进入等待部分。
因此,Xb 将是其中之一。
假设s=2(表示2个进程正在访问共享资源),取Xb为1,
第一个 P(s): Pb(Xb) 操作将使 Xb 为零。 s 将为 1,然后将执行 Vb(Xb) 操作,这将增加 Xb 的计数为 1。然后将重复相同的过程,使 Xb 为 1,s 为 0。
现在假设还有一个进程,那么 Xb 将为 0,但 s 将为 -1,这将使该进程进入循环(s <0)并导致调用 Vb(Xb) 和 Pb(Yb) 操作。 Vb(Xb) 将导致 Xb 为 1,而 Pb(Yb) 将导致 Yb 的值递减。
情况1:如果Yb的值为0,则为-1,进入等待并被阻塞。共有2个进程将访问共享资源(根据信号量,最多3个进程可以访问共享资源)和值s is -1 表示只有 1 个进程在等待资源,而刚才,有一个进程被阻塞了。所以它仍然是真的。
情况2:如果Yb的值为1,则为0。 共有3个进程将访问共享资源(根据计数信号量,最多2个进程可以访问共享资源)并且s的值为-1表示只有1个进程将在等待为资源,但没有进程等待资源。所以它是假的。
参见 https://www.geeksforgeeks.org/operating-systems-set-10/ 的问题 2
此解决方案由Nitika Bansal 提供
这个问题的测验