死鎖小結
阿新 • • 發佈:2018-12-26
資源的分類
計算機系統中的資源分為兩類:可搶佔的和不可搶佔的。
可搶佔資源可以從擁有它的程序中搶佔而不會產生任何副作用,例如儲存器就是一類可搶佔的資源;不可搶佔資源是指在不引起相關的計算失敗的情況下,無法把它從佔有它的程序處搶佔過來,例如一個程序已開始刻盤,突然將CD燒錄機分配給另一個程序,那麼將劃壞CD盤,在任何時刻CD燒錄機都是不可搶佔的。
總的來說,死鎖和不可搶佔資源有關。
死鎖概述
一. 死鎖定義 如果一個程序集合中的每個程序都在等待只能由該程序集合中的其他程序才能引發的事件,那麼該程序集合就是死鎖的。 二. 資源死鎖 在大多數情況下,每個程序所等待的事件是釋放該程序集合中的其他程序已經佔有的資源。換言之,這個死鎖程序集合中的每一個程序都在等待另一個死鎖的程序已經佔有的資源。但是由於所有程序都不能執行,它們中的任何一個都無法釋放資源,所以沒有一個程序可以被喚醒。這種死鎖稱為資源死鎖。 三. 資源死鎖的四個必要條件
死鎖處理
有四種處理死鎖的策略:
是否存在一種演算法總能做出正確的選擇從而避免死鎖呢?答案是肯定的,但條件是事先要獲得一些特定的資訊。但從本質上來說,死鎖避免是不可能的,因為它需要獲知未來的請求,而這些請求時不可知的。
一. 利用資源軌跡圖
如下圖所示,我們看到一個處理兩個程序和兩種資源的模型。橫軸表示程序A執行的命令,縱軸表示程序B執行的命令。程序A在I1處請求一臺印表機,在I3處釋放,在I2處請求一臺繪圖儀,在I4處釋放。程序B在I5到I7之間需要繪圖儀,在I6到I8之間需要印表機。
兩個程序交替執行,一旦系統進入由I1、I2和I5、I6組成的矩形區域,那麼最後一定會到達I2和I6的交叉點,因為程序的執行不可能後退,程序的運動方向只可能是向上或向右,這時就會產生死鎖。
二. 利用銀行家演算法 考慮這樣一個系統,有5個程序P0 ~ P4,3種資源型別A、B、C。資源型別A有10個例項,資源型別B有5個例項,資源型別C有7個例項,假定在時刻T0,系統狀態如下:
一. 死鎖定義 如果一個程序集合中的每個程序都在等待只能由該程序集合中的其他程序才能引發的事件,那麼該程序集合就是死鎖的。 二. 資源死鎖 在大多數情況下,每個程序所等待的事件是釋放該程序集合中的其他程序已經佔有的資源。換言之,這個死鎖程序集合中的每一個程序都在等待另一個死鎖的程序已經佔有的資源。但是由於所有程序都不能執行,它們中的任何一個都無法釋放資源,所以沒有一個程序可以被喚醒。這種死鎖稱為資源死鎖。 三. 資源死鎖的四個必要條件
- 互斥條件:每個資源要麼已經分配給了一個程序,要麼就是可用的
- 佔有並等待條件:已經得到了某個資源的程序可以再請求新的資源
- 不可搶佔條件:已經分配給一個程序的資源不能強制性地被搶佔,它只能被佔有它的程序顯式地釋放。
- 環路等待條件:死鎖發生時,系統中一定有由兩個或兩個以上的程序組成的一條環路,該環路中的每個程序都在等待著下一個程序所佔有的資源
- 採用鴕鳥演算法:最簡單的解決方法是鴕鳥演算法,把頭埋到沙子裡,假裝根本沒有問題發生。
- 檢測死鎖並恢復:讓死鎖發生,檢測它們是否發生,一旦發生死鎖,採取行動解決問題。
- 仔細對資源進行分配:通過仔細地對資源進行分配,動態地避免死鎖
- 從源頭處預防死鎖產生:通過破壞引起死鎖的四個必要條件之一,從源頭處防止死鎖產生
二. 利用銀行家演算法 考慮這樣一個系統,有5個程序P0 ~ P4,3種資源型別A、B、C。資源型別A有10個例項,資源型別B有5個例項,資源型別C有7個例項,假定在時刻T0,系統狀態如下:
- Allocation:定義每個程序現在所分配的各種資源型別的例項數量
- Max:定義每個程序的最大需求
- Available:定義每種資源型別僅存的例項數量
- Need:定義每個程序還需要的剩餘的資源
- 存在問題:很多程序知道執行時才知道它需要多少資源;這種方法的資源利用率不是最優的。