计数信号上的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,
第一点: 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的值为-1意味着只有1个进程将等待资源,而刚才,一个进程被阻塞。所以这仍然是事实。
案例2: 如果Yb的值为1,则为0。共有3个进程将访问共享资源(根据计数信号量,最多2个进程可以访问共享资源),s的值为-1表示只有1个进程将等待资源,但没有进程等待资源。所以这是错误的。
见本报告问题2 https://www.geeksforgeeks.org/operating-systems-set-10/
这个解决方案是由 尼蒂卡·班萨尔