【问题标题】:"S->value <= 0" signal() implementation in semaphore with no busy waiting信号量中的“S->value <= 0”信号()实现,没有忙等待
【发布时间】:2015-08-30 12:55:45
【问题描述】:

以下是信号量中signal()操作无忙等待(无忙等待)的代码

signal()的实现:

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

我对“if-condition”有疑问。

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

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

有谁可以用简单的英语给我解释一下吗?

【问题讨论】:

    标签: synchronization signals semaphore


    【解决方案1】:

    您在这里混淆了 Semaphore 的队列和就绪队列。 这个解就是满足有界等待条件。

    当进程必须等待信号量 S 时,它会被阻塞并放入信号量的队列中。 signal() 从队列中删除一个进程并将其移动到就绪队列。 因为 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
            } 
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 2014-10-21
      相关资源
      最近更新 更多