原語
P原語:P是荷蘭語Proberen(測試)的首字母。為阻塞原語,負責把當前進程由運行狀態轉換為阻塞狀態,直到另外一個進程喚醒它。操作為:申請一個空閒資源(把信號量減1),若成功,則退出;若失敗,則該進程被阻塞;
V原語:V是荷蘭語Verhogen(增加)的首字母。為喚醒原語,負責把一個被阻塞的進程喚醒,它有一個參數表,存放著等待被喚醒的進程信息。操作為:釋放一個被占用的資源(把信號量加1),如果發現有被阻塞的進程,則選擇一個喚醒之。
三種情況
具體PV原語對信號量的操作可以分為三種情況:
1)把信號量視為一個加鎖標誌位,實現對一個共享變數的互斥訪問。
實現過程:
P(mutex); // mutex的初始值為1 訪問該共享數據;
V(mutex);
非臨界區
2)把信號量視為是某種類型的共享資源的剩餘個數,實現對一類共享資源的訪問。
實現過程:
P(resource); // resource的初始值為該資源的個數N 使用該資源;
V(resource); 非臨界區
3)把信號量作為進程間的同步工具
實現過程:
臨界區C1;
P(S);
V(S);
臨界區C2;