2015-06-15 11 views
1

以下是在沒有忙等待旗語signal()操作的代碼(沒有忙等待)「S->值<= 0」信號()中旗語執行沒有忙等待

執行 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

您在信號量隊列和就緒隊列之間混淆。 該解決方案是爲了滿足有界等待條件。

當一個進程必須等待一個信號量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 
     } 
    } 

負值表示正在等待的進程數。 希望這有助於。