计数信号量的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的初始值分别是
(A) 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设为零。
现在假设又有一个进程出现,则Xb将为0,但s将为-1,这将使该进程进入循环(s <0),并导致调用Vb(Xb)和Pb(Yb)操作。 Vb(Xb)将导致Xb为1,Pb(Yb)将导致Yb的值递减。
情况1:如果Yb的值为0,它将为-1,它将进入等待状态并被阻塞。总共2个进程将访问共享资源(根据计数信号量,最多3个进程可以访问共享资源)和的值s为-1意味着只有1个进程将在等待资源,而现在,一个进程被阻塞了。所以这仍然是事实。
情况2:如果Yb的值为1,则它将为0。总共3个进程将访问共享资源(根据计数信号量,最大2个进程可以访问共享资源),而s的值为-1意味着仅1个进程将在等待需要资源,但是没有等待资源的进程。所以这是错误的。
请参阅https://www.geeksforgeeks.org/operating-systems-set-10/的问题2
该解决方案由Nitika Bansal提供
这个问题的测验