以下是信号量中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
意味着有可用的资源。
有没有人可以用简单的英语向我解释?
答案 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
}
}
负值表示等待的进程数。 希望这会有所帮助。