wait
和signal
是記錄型信號量機制中用于實現進程同步與互斥的兩個重要操作,
wait 操作
wait(semaphores *S) {S->value --;if (S->value<0) block(S->list)
}
- 請求資源:
S->value --;
?這一步表示進程請求一個單位的資源,將信號量?S
?的?value
?值減 1 。比如信號量原本表示有 3 個空閑資源(value
?為 3 ) ,執行這一步后,就表示剩余 2 個空閑資源 。 - 判斷與阻塞:
if (S->value<0) block(S->list)
?,在資源數量減少后,判斷?value
?值是否小于 0 。如果?value
?小于 0 ,說明當前沒有足夠的空閑資源供進程使用 。此時,block(S->list)
?操作會將該進程阻塞,并把進程放入信號量?S
?的等待隊列?list
?中 。例如,value
?初始為 1 ,有兩個進程先后執行?wait
?操作,第一個進程執行后?value
?變為 0 ,還能獲取資源;第二個進程執行后?value
?變為 -1 ,就會被阻塞放入等待隊列 。 block
方法:作用是將調用它的進程掛起,使其從運行態進入阻塞態 。在?wait
?操作中,當信號量?S->value
?小于 0 ,意味著沒有足夠資源,此時調用?block(S->list)
?,把該進程添加到信號量?S
?的等待隊列?list
?里 ,讓其等待資源可用 。比如餐廳沒座位了,顧客就得在候座區排隊等待 。
signal 操作
signal(semaphores *S) {S->value++;if (S->value<=0) wakeup(S->list);
}
- 釋放資源:
S->value++;
?表示進程釋放一個單位的資源,將信號量?S
?的?value
?值加 1 。假設信號量?value
?原本為 -2 (表示有 2 個進程在等待資源 ) ,執行這一步后,value
?變為 -1 ,代表還有 1 個進程在等待,但資源數量增加了 。 - 喚醒進程:
if (S->value<=0) wakeup(S->list);
?,在資源數量增加后,判斷?value
?值是否小于等于 0 。如果?value
?小于等于 0 ,說明等待隊列中還有進程在等待資源 ,wakeup(S->list)
?操作會從等待隊列?list
?中喚醒一個進程 ,讓其有機會重新獲取資源并繼續執行 。比如?value
?為 -1 時,執行此操作就會喚醒一個等待的進程 。 wakeup
方法:功能是喚醒處于阻塞態的進程 。在?signal
?操作里,當信號量?S->value
?加 1 后小于等于 0 ,表明等待隊列有進程在等資源,執行?wakeup(S->list)
?,從等待隊列中喚醒一個進程 ,讓其從阻塞態變為就緒態 ,獲得再次競爭 CPU 執行的機會 。就像餐廳有座位空出來,服務員從候座區叫一位顧客去就餐 。
總體而言,wait
和signal
操作通過對信號量?value
?值的增減以及對等待隊列中進程的阻塞和喚醒,實現了對資源的合理分配與管理,保障了進程間的同步與互斥 。