p.v.
專業術語
PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對信號量進行操作。利用PV操作實現進程的同步和互斥。
闡述P,V原語的理論不得不提到的一個人便是赫赫有名的荷蘭科學家 E.W.Dijkstra。如果你對這位科學家沒有什麼印象的話,提起解決圖論中最短路徑問題的Dijkstra演演算法應當是我們再熟悉不過的了。P,V原語的概念以及P,V操作當中需要使用到的信號量的概念都是由他在1965年提出的。
信號量是最早出現的用來解決進程同步與互斥問題的機制(也可實現進程通信),包括一個稱為信號量的變數及對它進行的兩個原語操作。信號量為一個整數,我們設這個信號量為:sem。很顯然,我們規定在sem大於等於零的時候代表可供併發進程使用的資源實體數,sem小於零的時候,表示正在等待使用臨界區的進程的個數。根據這個原則,在給信號量附初值的時候,我們顯然就要設初值大於零。
p操作和v操作是不可中斷的程序段,稱為原語。P,V原語中P是荷蘭語的Proberen(測試), V是荷蘭語的Verhogen(增加)。
且在P,V原語執行期間不允許有中斷的發生。
對於具體的實現,方法非常多,可以用硬體實現,也可以用軟體實現。這種信號量機制必須有公共內存,不能用於分散式操作系統,這是它最大的弱點。
PV操作由P操作原語和V操作原語組成(原語是不可中斷的過程),對信號量進行操作,具體定義如下:
P(S):①將信號量S的值減1,即S=S-1;
②如果S>=0,則該進程繼續執行;否則該進程置為等待狀態,排入等待隊列。
V(S):①將信號量S的值加1,即S=S+1;
②如果S>0,則該進程繼續執行;否則釋放隊列中第一個等待信號量的進程。
PV操作的意義:我們用信號量及PV操作來實現進程的同步和互斥。PV操作屬於進程的低級通信。
信號量(semaphore)的數據結構為一個值和一個指針,指針指向等待該信號量的下一個進程。信號量的值與相應資源的使用情況有關。當它的值大於0時,表示當前可用資源的數量;當它的值小於0時,其絕對值表示等待使用該資源的進程個數。注意,信號量的值僅能由PV操作來改變。
一般來說,信號量S>=0時,S表示可用資源的數量。執行一次P操作意味著請求分配一個單位資源,因此S的值減1;
當S<0時,表示已經沒有可用資源,請求者必須等待別的進程釋放該類資源,它才能運行下去。而執行一個V操作意味著釋放一個單位資源,因此S的值加1;
若S<=0,表示有某些進程正在等待該資源,因此要喚醒一個等待狀態的進程,使之運行下去。
利用信號量和PV操作實現進程互斥的一般模型是:
進程P1 進程P2 …… 進程Pn
…… …… ……
P(S); P(S); P(S);
臨界區;臨界區;臨界區;
V(S); V(S); V(S);
…… …… …… ……
其中信號量S用於互斥,初值為1。
使用PV操作實現進程互斥時應該注意的是:
(1)每個程序中用戶實現互斥的P、V操作必須成對出現,先做P操作,進臨界區,后做V操作,出臨界區。若有多個分支,要認真檢查其成對性。
(2)P、V操作應分別緊靠臨界區的頭尾部,臨界區的代碼應儘可能短,不能有死循環。
(3)互斥信號量的初值一般為1。
利用信號量和PV操作實現進程同步
PV操作是典型的同步機制之一。用一個信號量與一個消息聯繫起來,當信號量的值為0時,表示期望的消息尚未產生;當信號量的值非0時,表示期望的消息已經存在。用PV操作實現進程同步時,調用P操作測試消息是否到達,調用V操作發送消息。
信號量機制主要有整形信號量、記錄性信號量、信號量集機制。
信號量是一個整形變數,根據控制對象的不同賦不同的值。信號量可分為公用信號量和私用信號量兩類。
公用信號量:實現進程間的互斥,初值=1或資源的數目
私用信號量:實現進程間的同步,初值=0或某個整數
信號量S的物理意義:S>=0時表示某資源的可用數,s<0時其絕對值表示阻塞隊列中等待該資源的進程數。P、V操作是實現進程同步與互斥的常用方法。
P操作表示申請一個資源,V操作表示釋放一個資源。
P操作的定義:S=S-1,若S>=0,則執行P操作的進程繼續執行;若S<0,則置該進程為阻塞狀態,並將其插入阻塞隊列。
Procedure P(Var S:Semaphore);
Begin
S:=S-1;
If S<0 then w(S) {執行P操作的進程插入等待隊列}
End;
V操作定義:S=S+1,若S>0則執行V操作的進程繼續執行;若S<0,則從阻塞狀態喚醒一個進程,並將其插入就緒隊列,執行V操作的進程繼續執行。
Procedure V(Var S:Semaphore);
Begin
S:=S+1
If S<=0 then R(s) {從阻塞隊列中喚醒一個進程}
End;
利用PV操作實現進程的互斥
令信號量mutex的初值為1,當進入臨界區時執行P操作,退出臨界區時執行V操作。這樣利用PV操作實現進程互斥的代碼段如下:
P(mutex)
臨界區
V(mutex)
使用PV操作實現進程同步時應該注意的是:
(1)分析進程間的制約關係,確定信號量種類。在保持進程間有正確的同步關係情況下,哪個進程先執行,哪些進程后執行,彼此間通過什麼資源(信號量)進行協調,從而明確要設置哪些信號量。
(2)信號量的初值與相應資源的數量有關,也與P、V操作在程序代碼中出現的位置有關。
(3)同一信號量的P、V操作要成對出現,但它們分別在不同的進程代碼中。