開篇
死結是作業系統中的重要概念,和作業系統中的其他重要概念一樣,對它的正確理解將協助你寫出更加高效、優秀的程式。
這裡沒有晦澀的定義,只有易懂的描述和生動的例子。相信你看了之後會有所收穫。
什麼是死結
簡單的說,死結就是電腦裡的硬體資源或者軟體資源不夠用了。
為什麼會有這種情況呢?比如說A佔有資源m,請求資源n。B佔有資源n請求資源m。進程A和B都會因為請求不到自己的資源而睡眠。
下面將進一步介紹。
更形象的描述-死結建模:
為了能對死結進行更好的分析,我們為死結建模。就是用一個有向圖來表示進程和資源的使用方式,圓形節點表示進程,方形節點表示資源。
資源指向進程的邊表示該進程佔有該資源,進程指向資源表示進程請求分配資源。
a): 進程A佔有資源R。b)進程B申請資源S。
c):進程D佔有資源T,申請資源U
進程C佔有資源U,申請資源T。
如上c) 出現死結。進程C等待著資源T,資源T被進程D佔有,進程D有等待進程C佔有的資源U。這樣兩個進程就這麼等待下去。
死結的定義
有了上面的基礎,現在來看死結的規範定義:
A set of processes is deadlocked if each process in the set is waiting for an
event that only another process in the set can cause.
一個進程集合中的每個進程都在等待只有該進程集合中的進程才能引發的事件
死結產生的條件:
1、互斥條件:每個資源要麼已經分配給一個進程,要麼是可用的。
2、佔有和等待條件:已經佔有資源的進程可以申請其他資源。
3、不可搶佔條件:已經被佔有的資源不能被其他的進程搶佔, 只有佔有它的進程才能顯示釋放。
4、環路等待條件:死結發生時,系統中有兩個或兩個以上的進程一條環路,該環路中的每一個進程都在等待下一個進程所佔有的資源。
死結發生時,以上的四個條件必須同時滿足,如果有其中的一個條件不滿足,死結就不會發生。
那麼 ,只要讓上面的條件不滿足就能避免死結的發生了嗎?是的,這將在下文死結的預防中討論.
死結的檢測
每種類型一個資源的死結檢測:
通過上面的描述,應該對死結有了一些認識了吧。那麼,如何檢測一個進程集合中是否會存在死結呢?
有了上面的經驗,只要吧進程集合中的每個進程和各自佔有和請求的資源用剛才的死結建模表示出來,然後再判斷,如果存在圈,
就能證明裡面有死結的存在了。
用執行個體能更好的說明問題:裡面有A到G七個進程,R到W六中資源;
1、進程A佔有資源R,請求資源S
2、進程B不佔有任何資源,請求資源T
3、進程C不佔任何資源,請求資源S
4、D佔有資源U,請求資源S和T
5、E有資源T,請求資源V
6、F有資源W,請求資源S
7、G有資源V,需要資源U
以上進程集合和資源的關係可用表示:
很直觀的,就能看到圖中存在一個圈,所以存在死結。
還是簡單的分析下吧 :從D點入手,D需要T,T被E佔有,E需要V,V被G佔有,G需要U,U被D佔有。圈裡的每個進程都在等待他的下一個
所佔有的資源,所有的進程就無限的等待下去。顯然, 上述進程集合發生了死結。
所以對於這種情況,可以記錄下進程集合中各個進程和資源的關係,通過判斷圖中是否存在圈的方法來檢測是否存在死結。
判斷圖中是否存在圈可以用圖的深度優先搜尋來實現,可以參考前面的博文:圖的深度優先搜尋詳解/Depth-first search/C++
大家可能已經注意到了,從開始到現在我們討論的資源都有一個特點,就是每一種類型的資源只有一個。如上面的例子中,資源R只有1個,
S也是一樣只有一個。對於電腦中的某些資源,某些資源可能確實只有一個,比如印表機,掃描器等等,而還有很多類型的資源,可以存在多個。比如記憶體空間,寄存器等。
剛才分析了每種類型資源只有一個的死結的情況,下面看每種類型資源有多個的情況:
每種類型多個資源的死結檢測:
對於這種情況,就需要另外的一種表示方法了。對於任何問題的分析,總是要先把它表述出來。
下面對資源和進程分開討論;
資源:
對於一個資源,它要麼被某個進程佔有,要麼可以被申請佔有。這裡假設資源類型編號為1、2、、、、m的資源。
資源的總數用E1,E2、、、Em來表示
剩餘的資源用A1,A2、、、Am來表示
比如資源類型E2表示掃描器,那麼E2=1就表示系統中有一台掃描器。A2=0表示剩餘的掃描器為0;
進程:假設進程集合中有編號為1、2、、、、n的進程。
由於我們考慮的是死結,對於一個進程,我們要記錄的是它佔有的資源,它需要的資源。
這裡用兩個矩陣表示:Cij 的值表示進程i佔有資源j的數目。Rij表示進程i需要資源j的個數;
參見:
每種資源的總數=已被進程佔有的數量+剩餘數量 根據,用數學運算式表述為:
對於任意的一個進程 i 如果Ri1,Ri2、、、Rim都小於對應的A1,A2、、、、Am,說明這個進程可以被執行,所以可以先看進程集合裡面有沒有這中可以被執行的進程,讓他們執行,完成後釋放所佔有的資源。這時候剩餘資源變多了,在判斷進程集合中是否還有可以被執行的進程,如果有,就執行,然後釋放資源。重複以上過程,如果最後進程集合中所有進程都被執行了,說明不存在死結,反之,如果最後進程集合中還有不能被執行的進程,那麼進程集合存在死結。光說理論太枯燥了,而且不容易理解。下面用執行個體說話;
先看資源和進程的狀態圖吧:
圖中共有四種資源,總數和剩餘數量分別用E和A表示出來了
共有3個進程,他們佔有的資源和需要的資源分別用矩陣C和R表示。
進程1:需要第一種資源2個,第四種資源1個,而第四資源沒有了,所以進程1不能被先執行。
進程2:需要第一種資源1個,第三種資源1個,剩餘資源也不能滿足需要,所以不能執行。
進程3:需要第一種資源2個,第二種資源1個,剩餘資源可滿足請求,所以進程3執行。
進程3執行後,釋放佔有資源。更新A:(2,2,2,0),這時進程2可以執行了,繼而進程1也能執行 ,所以該進程集合不存在死結。
假中情況有所改變,進程2需要第四種資源1個,資源二1個和資源一兩個,那麼所有的請求都得不到滿足,系統進入死結。
這篇博文主要闡述了死結的定義和死結的檢測、
死結的恢複、死結的避免、死結的預防將在下一篇博文中闡述。
如有轉載請註明出處:
一條魚@部落格園 http://www.cnblogs.com/yanlingyin/
2011-12-29