信号量中的“S->值< = 0”signal()实现,没有忙碌的等待

时间:2015-06-15 05:54:57

标签: synchronization signals semaphore

以下是信号量中signal()操作的代码,没有忙碌的等待(没有忙等待)

signal()的实施:

signal (semaphore *S) {
    S->value++; 
    if (S->value <= 0) { 
        remove a process P from S->list; 
        wakeup(P);  
    } 
}

我对“if-condition”有疑问。

我认为,S->value为零或负数意味着没有可用资源,因此不应允许wakeup()。 但正如您所看到的,每当调用signal()操作时,无论S->value的状态如何,都会唤醒进程(处于等待列表中)。

所以在我看来, 不平等的标志S->value >= 0是自然的,也是有道理的,因为S->value > 0意味着有可用的资源。

有没有人可以用简单的英语向我解释?

1 个答案:

答案 0 :(得分:4)

您在Semaphore的队列和就绪队列之间感到困惑。 这个解决方案是为了满足有限的等待条件。

当进程必须等待信号量S时,它被阻塞并放在信号量的队列中。 signal()从队列中删除一个进程并将其移至Ready队列。 因为signal()总是从刚完成其临界区的进程中调用。因此,就绪队列中将添加一个新进程。

如果在信号量值为正时将进程添加到就绪队列,则它没有意义,因为您可以直接使用信号量,而无需加入就绪队列。

    signal (semaphore *S) {
        S->value++; 
        if (S->value <= 0) { 
        remove a process P from S->list; 
        wakeup(P);  //move one process P from S->list to ready list
        } 
    }

负值表示等待的进程数。 希望这会有所帮助。