PV原語的邊界條件寫的太精簡,所以我稍微詳細點的表示。
https://www.cnblogs.com/cocowool/archive/2012/06/11/2544823.html這篇文章中精簡的表示如下:
PV原語
P原語:P是荷蘭語Proberen(測試)的首字母。為阻塞原語,負責把當前進程由運行狀態轉換為阻塞狀態,直到另一個進程喚醒它。具體操作為:申請一個空閑資源(把信號量減1),若成功,則退出;若失敗,則該進程被阻塞。
V原語:V是荷蘭語Verhogen(增加)的首字母。為喚醒原語,負責把一個被阻塞的進程喚醒,他有一個參數表,存放着等待被喚醒的進程信息。具體操作為:釋放一個被占用的資源(把信號量加1),如果發現有被阻塞的進程,則選擇一個喚醒。
表示方法
P(S):表示將信號量S的值減一,即S=S-1;如果S>=0,則該進程繼續執行,否則該進程置為等待狀態,排入等待隊列(隊列Q)。
V(S):表示將信號量S的值加一,即S=S+1;如果S>0,則該進程繼續執行,否則釋放隊列(Q)中第一個等待信號量的進程。
我的稍微詳細點表示方法
P(S):表示將信號量S的值減一,即S1= S; S2=S1-1;如果S2>=0,也就是S1>=1,說明有現成的資源直接可以用,不用等!,則該進程繼續執行,否則(也就是S2<0變成負數)該進程置為等待狀態,排入等待隊列(隊列Q)。
V(S):表示將信號量S的值加一,即S1=S; S2=S1+1;如果S2>0,也就是S1>-1也就是S1>=0,也就是說明V操作之前S1不是負數,說明根本不存在等待資源的進程,等待隊列是空的!,則該進程繼續執行,否則(也就是V操作之后釋放了一個資源,又有至少一個正在等待資源的進程,那就去喚醒這個進程)釋放隊列(Q)中第一個等待信號量的進程。