進程同步與PV操作

來源:互聯網
上載者:User

雖然從理論上講,每一個進程都是獨立的實體,但在並發執行過程中,或因競爭資源,或者合作完成同一任務,相互之間會產生一些制約關係。一般來講,因競爭資源產生的制約關係稱為互斥關係,因合作完成同一任務而產生的制約關係稱為同步關係。
例如系統中有A、B兩個進程,在某一時間段,進程A正在使用印表機,而這時進程B也需要使用同一印表機,由於進程A尚未用完,那末進程B就需要等待。這樣,進程B的運行受到了進程A的制約。這種制約關係就是互斥關係。
進程互斥是由共用臨界資源(Critical Resource)引起的。所謂臨界資源,簡單來講就是一次僅供一個進程使用的資源。事實上,系統中的許多資源都是臨界資源,例如印表機、資料檔案等。由於臨界資源不能被多個進程同時訪問,所以對臨界資源的訪問必須互斥地進行。因此,臨界資源也稱為互斥資源。進程對資源的使用是通過執行程式來實現的,進程中對臨界資源進行操作的程式段稱為臨界區(或互斥段)。
又如函數g(x,y)=f1(x)+f2(y)由進程A、B合作計算,進程A計算g1=f1(x);進程B計算f2(y),並在最後求出g(x,y)的值。可以看出,在計算f1(x)和f2(y)時,進程A和進程B各自獨立(即並發)地執行,但是在進程B計算g1+f2(y)時受到進程A的制約,即進程A必須完成g1=f1(x)的 計算。進程A、B間的這種制約關係就是同步關係。
上面的例子說明,系統中並發執行著的進程往往需要互斥或同步。那麼怎樣才能使進程根據需要自動進行互斥或同步呢?為實現進程互斥和同步,作業系統中採用了許多方法,比如用添加程式段實現進程互斥和同步的所謂軟體法、用加鎖原語和解鎖原語實現的鎖操作法,還有訊號量與P、V操作以及管程等。其中訊號量與P、V操作由於效果好而成為現代作業系統中實現進程互斥和同步的基本常用方法。所以,我們僅介紹訊號量與P、V操作及其相關的進程同步方法。
(1) 訊號量與P、V操作
訊號量是一種整型變數,通常用S表示。訊號量S的物理意義是:若S≥0,則S的值表示系統中與S聯絡著的某類可用資源的個數;若S<0,則S的絕對值表示S的阻塞隊列中進程的個數。P、V操作實際是關於訊號量S的兩個原語,其定義如下:
P(S): ① S=S-1;
② 若S≥0,則調用P(S)的進程繼續運行;
③ 若S<0,則調用P(S)的進程被阻塞,並把它插入到等待訊號量S的阻塞隊列中。
V(S): ① S=S+1;
② 若S>0,則調用V(S)的進程繼續運行;
③ 若S≤0,從等待訊號量S的阻塞隊列中喚醒頭一個進程,然後調用V(S)的進程繼續運行。

⑵ 利用訊號量和P、V操作實現進程互斥
設進程P1、P2需互斥地使用某一臨界資源R,為此設定一個公用訊號量S,共置初值S=1,表明該臨界資源未被佔用;然後給進程P1和P2的臨界區兩端分別添加P、V操作P(S)和V(S),即可實現兩進程的互斥。程式段如下:
P1:                             P2:
P(S)                          P(S)
critical section        critical section
V(S)                           V(S)
由於訊號量的初值為1,故第一個進程P1執行P操作後訊號量S的值減為0,表明臨界 資源空閑,可分配給該進程,使之進入臨界區。若此時又有第二個進程P2欲進入臨界區,也應先執行P操作,結果使S=-1,表示臨界資源已被佔用,因此第二進程變為阻塞狀態。當第一個進程在臨界區內將程式執行完畢,然後執行V操作,釋放該資源而使訊號量S的值恢複到0,又喚醒了第二個進程P2。待第二個進程P2完成對臨界資源的使用後,又執行V操作,最後使訊號量S恢複到初值1。

例1 設一民航售票系統有n個售票處。每個售票處通過終端訪問系統中的公用資料區,假定公用資料區中的一些單元Xk(k=1,2,...)分別存放×月×日×次航班的現存票數。設P1,P2,…,Pn表示各售票處的處理進程,R1,R2,…,Rn表示各進程執行時所用的工作單元。用訊號量實現進程間互斥的程式如下:
begin
S=1
cobegin
Process Pi(i=1,2,......,n)
begin
按旅客訂票要求找到Xk;
P(S)
Ri=Xk;
If Ri>=1 then begin
Ri=Ri-1;
Xk=Ri;
V(S)
輸出一張票
end
else begin
V(S);
輸出“票已售完”
end
end
coend
end

⑶ 利用訊號量和P、V操作實現進程同步
下面通過一個執行個體來說明利用訊號量和P、V操作實現進程同步的方法。
例2 設進程A、B是兩個相互合作的進程,共用一個緩衝區。進程A負責從卡片輸入機讀入卡片送到緩衝區,進程B取走緩衝區中的卡片資訊,並進行加工處理。進程A在完成將卡片送入緩衝區後,給進程B發一訊號。進程B收到訊號後,從緩衝區取走卡片資訊,然後給進程A發一訊號。這一過程重複進行。這也是一個進程同步問題。為此,可利用兩個私用訊號量S1和S2。S1初值為1,S2初值為0,訊號量S1表示緩衝區是否有卡片資訊,S2表示緩衝區資訊是否被取走。利用P、V操作實現進程A、B的同步演算法如下:

生產者(進程) 消費者(進程)
┌─────┐ ┌─────┐
↓                    │ ↓ │
生產一個產品│ P(S0) │
P(Sn)             │ P(S) │
P(S)               │ 從緩衝池取出一個產品│
向緩衝池放入一個產品│ V(S) │
V(S)               │ V(Sn) │
V(S0)            │ 消耗該產品 │
↓                   │ ↓ │
└─────┘ └─────┘ 

 
現在可對上述同步演算法作一簡單解釋。假定進程A開始執行,它啟動讀卡機工作,執行P(S1),使得S1的值由1變為0;由於S1=0,進程A繼續運行,將卡片資訊送入緩衝區;然後執行V(S2),使S2=1,表示緩衝區已裝入卡片資訊。這時,如果進程A再執行P(S1),則S1變為-1,於是進程A進入阻塞隊列。發送器調度進程B執行,進程B執行P(S2),使S2=0,進程B繼續運行,將緩衝區資訊取出,再執行V(S1),使S1=1,則喚醒進程A,使其變為就緒,然後進程B繼續執行,如果返回到執行P(S2),使S2=-1,則進程B進入阻塞隊列,停止執行。發送器將在下一次把處理機分配給進程A時,進程A和進程B又重複上述過程,如此迴圈,直至讀卡機上的全部卡片讀完為止。
類似地,也可以用訊號量和P、V操作實現計算進程和列印進程之間的同步。每當計算進程將所得結果送入緩衝區,由列印進程將該結果從緩衝區取走,進行列印輸出。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.