计数信号量的值为-x。有多少个等待进程?

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个进程正在等待!

有人可以澄清我是对还是错?任何帮助表示赞赏。提前致谢。

Aka*_*tra 5

计数信号量的实现方式如下:

    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()方法唤醒,从而获得绝对值等于尝试访问失败的进程数。