進程管理之死結

來源:互聯網
上載者:User

1.進程同步之臨界地區問題及Peterson演算法

2.進程同步之訊號量機制(pv操作)及三個經典同步問題

介紹了進程管理中進程同步的諸多問題,下面為大家詳細解讀進程管理中死結的問題及其解決方案。

1.什麼是死結?在多道程式設計環境下,多個進程可能競爭一定數量的資源。一個進程申請資源,如果資源不可用,那麼進入等待狀態。如果所申請的資源被其他等待進程佔有,那麼該等待進程有可能無法改變狀態,這種情況稱為死結(deadlock) 。
設系統有一台印表機(R1),一台讀卡機(R2),兩進程共用這兩台裝置。
用訊號量S1表示R1是否可用,初值為1;
用訊號量S2表示R2是否可用,初值為1; 這兩個進程在並發執行過程中,可能會發生如下的情況。
即P1佔用R1,P2佔用R2,同時P1和P2又分別申請R2和R1的資源。於是造成了死結。
大家可以思考一下,如何修改A、B進程才不會發生死結。帶著這個問題我們往下看。2.產生死結的原因競爭系統資源 如循環圖表所示: 系統中只有一台印表機R1和一台讀卡機R2,可供進程P1和P2共用。R1、R2已經分別分配給P1、P2使用,當P1、P2在不釋放資源R1、R2而又同時分別申請R2、R1(),形成環路,這樣會產生死結。

進程的推進不當如前面的例子可知他只是可能發生死結,也就是說進程的推進不同會導致不同的結果。
3.產生死結的必要條件

互斥條件

進程要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一進程所佔用。

佔有並等待條件

當進程因請求資源而阻塞時,對已獲得的資源保持不放。

非搶佔條件

進程已獲得的資源在未使用完之前,不能剝奪,只能在使用完時由自己釋放。

迴圈等待條件

在發生死結時,必然存在一個進程--資源的環形鏈。
4.解決死結的基本方法1.預防死結前面我們降到了死結的必要條件,那麼只要一個條件不滿足的話,就不會發生死結了。所以我們可以從必要條件的角度來預防死結。a.互斥條件對於非共用資源,必須有互斥條件。而共用資源是不會涉及死結。所以通常不能通過否定互斥條件來預防死結:有些資源本身是非共用的。b.佔有並等待為了確保該條件不在系統內出現,必須保證:當一個進程申請一個資源時,它不能佔有其他資源。資源一次性分配可以解決這個問題。實現這一分配有兩種協議 1.每個進程在執行前申請並獲得所有資源。 2.允許進程在沒有資源時才可申請資源。
兩種協議的缺點: 1.資源使用率不高 2.可能發生饑餓(磁帶用到一般被搶了)c.非搶佔允許當前進程被其他進程搶過去。缺點:可能發生饑餓(磁帶用到一般被搶了)d.迴圈等待條件確保此條件不成立的方法就是對所有資源類型進行完全排序,且要求每個進程按遞增順序來申請資源。 實現方法:資源有序分配法遵循兩種協議: 1.每個進程只按遞增順序申請資源。(第一次可以申請多個,但之後申請編號必須比前面大) 2.進程申請編號比擁有資源編號小時必須先釋放大編號資源。

這樣進程如果需要磁帶機和繪圖機,那進程必須先申請磁帶機,再申請繪圖機。如果再想申請印表機,則必須先釋放繪圖機。
2.避免死結通過前面介紹想必大家也看到了在預防死結的過程中會嚴重系統效能。因此在避免死結中我們不得不施加較弱的限制,從而獲得比較滿意的效能。
由於在避免死結的策略中,允許進程動態地申請資源。因而,系統在進行資源分派之前預先計算 資源分派的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分派給進程;否則,進程等待。
最具代表性的避免死結的演算法是銀行家演算法。由於銀行家演算法比較複雜,我將在下篇部落格中詳細解讀。

一般來說,由於作業系統有並發,共用以及隨機性等特點,通過預防和避免的手段達到排除死結的目的是很困難的。這需要較大的系統開銷,而且不能充分利用資源。為此,一種簡便的方法是系統為進程分配資源時,不採取任何限制性措施,但是提供了檢測和解脫死結的手段:能發現死結並從死結狀態中恢複出來。因此,在實際的作業系統中往往採用死結的檢測與恢複方法來排除死結。 死結檢測與恢複是指系統設有專門的機構,當死結發生時,該機構能夠檢測到死結發生的位置和原因,並能通過外力破壞死結發生的必要條件,從而使得並發進程從死結狀態中恢複出來。

1.一個用來檢查系統狀態從而確定是否出現了死結演算法。即死結檢測 2.一個用來從死結狀態中恢複的演算法。即恢複演算法
3.死結檢測首先可以通過畫分配圖來判斷是否發生了死結。但如何用演算法來判斷呢?
死結檢測演算法。演算法使用的 資料結構是如下這些:
佔有矩陣A:n*m階,其中n表示並發進程的個數,m表示系統的各類資源的個數,這個矩陣記錄了每一個進程當前佔有各個資源類中資源的個數。
申請矩陣R:n*m階,其中n表示並發進程的個數,m表示系統的各類資源的個數,這個矩陣記錄了每一個進程當前要完成工作需要申請的各個資源類中資源的個數。
空閑向量T:記錄當前m個資源類中空閑資源的個數。
完成向量F:布爾型向量值為真(true)或假(false),記錄當前n個並發進程能否進行完。為真即能進行完,為假則不能進行完。
臨時向量W:開始時W:=T。
演算法步驟:
(1)W:=T,
對於所有的i=1,2,...,n,
如果A[i]=0,則F[i]:=true;否則,F[i]:=false
(2)找滿足下麵條件的下標i:
F[i]:=false並且R[i]〈=W
如果不存在滿足上面的條件i,則轉到步驟(4)。
(3)W:=W+A[i]
F[i]:=true
轉到步驟(2)
(4)如果存在i,F[i]:=false,則系統處於死結狀態,且Pi進程參與了死結。什麽時候進行死結的檢測取決於死結發生的頻率。如果死結發生的頻率高,那麽死結檢測的頻率也要相應提高,這樣一方面可以提高系統資源的利用率,一方面可以避免更多的進程捲入死結。如果進程申請資源不能滿足就立刻進行檢測,那麽每當死結形成時即能被發現,這和死結避免的演算法相近,只是系統的開銷較大。為了減小死結檢測帶來的系統開銷,一般採取每隔一段時間進行一次死結檢測,或者在CPU的利用率降低到某一數值時,進行死結的檢測。
4.死結的恢複一旦在死結檢測時發現了死結,就要消除死結,使系統從死結狀態中恢複過來。

(1)最簡單,最常用的方法就是進行系統的重新啟動,不過這種方法代價很大,它意味著在這之前所有的進程已經完成的計算工作都將付之東流,包括參與死結的那些進程,以及未參與死結的進程。

(2)撤消進程,剝奪資源。終止參與死結的進程,收回它們佔有的資源,從而解除死結。這時又分兩種情況:一次性撤消參與死結的全部進程,剝奪全部資源;或者逐步撤消參與死結的進程,逐步收回死結進程佔有的資源。一般來說,選擇逐步撤消的進程時要按照一定的原則進行,目的是撤消那些代價最小的進程,比如按進程的優先順序確定進程的代價;考慮進程運行時的代價和與此進程相關的外部作業的代價等因素。

此外,還有進程回退策略,即讓參與死結的進程回退到沒有發生死結前某一點處,並由此點處繼續執行,以求再次執行時不再發生死結。雖然這是個較理想的辦法,但是操作起來系統開銷極大,要有堆棧這樣的機構記錄進程的每一步變化,以便今後的回退,有時這是無法做到的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.