lU5*_*5er 0 operating-system semaphore ipc
我的书说的答案是x。
但是那怎么可能呢?我只是从计数信号量和二进制信号量之间的差异中学到的,计数信号量具有正值,因此多个进程可以访问关键部分。因此,在那种情况下-怎么可以说x个进程正在等待,因为到达0时,下一个等待信号将忙于等待一个进程,并且信号量永远不能小于0。
现在,我认为可能还有第二种情况。就像将计数信号量初始化为1一样。现在,当一个进程访问它时,它变为0。
while(s <= 0);
Run Code Online (Sandbox Code Playgroud)
然后下一个过程将其设为-1。因此,单个进程等待使信号量值为-1。
因此,我可以得出结论,对于-x,x个进程正在等待!
有人可以澄清我是对还是错?任何帮助表示赞赏。提前致谢。
计数信号量的实现方式如下:
struct semaphore{
int value;
Queue L;
}
Run Code Online (Sandbox Code Playgroud)
在此,变量“值”可以取正值,负值或“ 0”作为值,这取决于其初始值和尝试访问它的进程数。变量“值”的初始值指示可以同时访问它的进程数。
wait()方法实现为:
wait(semaphore s){
s.value--;
if(s.value < 0){
put the process in the queue s.L;
sleep();
}
Run Code Online (Sandbox Code Playgroud)
因此,当进程尝试访问信号量时,如果该值小于“ 0”,它将进入睡眠状态,因为没有更多的权限可以访问资源。
因此,进程尝试访问信号的次数,其值将减少很多次,一旦值变为负数,进程将在等待队列中等待,直到被signal()方法唤醒,从而获得绝对值等于尝试访问失败的进程数。