利用銀行家演算法避免死鎖的介紹與舉例
一、資料結構
1.多個程序: { P0,P1,P2,P4 } 代表1,2,3,4四個需要臨界資源的程序
2.幾種資源:{ A, B ,C } 代表A,B,C三種臨界資源
3.Max:最大需求矩陣(程序完成執行需要的各資源總量)
Allocation:分配矩陣(某個程序現在已經擁有的各資源量)
Need:需求矩陣(某個程序仍需要的各資源量)
Available:可利用資源向量 (系統保有的供分配的資源量)
其中:Need = Max - Allocation ,很容易理解嘛,仍然需要的量等於總需求量減去擁有的量
二、銀行家演算法
設 Requesti 是程序 Pi 的請求向量,如果 Requesti [j] = K,表明程序需要K個Rj型別的資源。當Pi發出資源請求後,系統按照如下步驟進行檢查:
(1)如果 Requesti [j] <= Need[i,j],便轉向步驟(2),否則認為出錯,因為它所需要的資源數已經超過它所宣佈的最大值。
(2)如果 Requesti [j] <= Available[j],便轉向步驟(3),否則表示尚無足夠資源,Pi 需等待。
(3)系統試探性的把資源分配給程序Pi
Available[j] = Available[j] - Requesti [j];
Allocation[i,j] = Allocation[i,j] + Requesti [j];
Need[i,j] = Need[i,j] - Requesti [j];
(4)系統執行安全性演算法,檢查此次資源分配後系統是否處於安全狀態(不會產生死鎖),若安全,才正式將資源分配給程序Pi ,以完成本次分配;否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓程序Pi
三、安全性演算法
(1)設定兩個向量:
1> 工作向量Work,它表示系統可提供給程序繼續執行所需的各類資源數目,它含有m個元素,在執行演算法開始時,Work = Available;
2> Finish:它表示系統是否有足夠的資源分配給程序,使之完成執行。開始時先做Finish[i] = false;當有足夠資源分配給程序時,再令Finish[i] = true;
(2)從程序集合中找到一個能滿足下述條件的程序:
①Finish[i] = false;
②Need[i,j] <= Work[j];
若找到,執行步驟(3),否則,執行步驟(4)
(3)當程序Pi獲得資源後,可順利執行,直至完成,並釋放出分配給它的資源,故應執行:
Work[j] = Work[j] + Allocation[i,j];
Finish[i] = true;
go to step 2;
(4)如果所有程序的Finish[i] = true都滿足,則表示系統處於安全狀態;否則,系統處於不安全狀態。
四、銀行家演算法舉例
在銀行家演算法中,若出現下述分配情況,試問:
Process | Allocation | Need | Available |
P0 | 0, 0, 3, 2 | 0, 0, 1, 2 | 1, 6, 2, 2 |
P1 | 1, 0, 0, 0 | 1, 7, 5, 0 | |
P2 | 1, 3, 5, 4 | 2, 3, 5, 6 | |
P3 | 0, 3, 3, 2 | 0, 6, 5, 2 | |
P4 | 0, 0, 1, 4 | 0, 6, 5, 6 |
(1)該狀態是否安全?
答:安全,可以按照P0 - P3 - P4 - P1 - P2或者P0 - P3 - P1 - P4 - P2又或者P0 - P3 - P1 - P2 - P4的順序,可以順利執行完所有程序,並不會出現死鎖的情況
(首先看錶發現 Available > Need 的程序只有P0,所以先執行P0,P0執行完成後回收資源(1,6,2,2)+ (0,0,3,2), 現在Available變成了(1,6, 5,4),再看發現只有P3可以執行,再執行P3,Available增加到了(1,9,8,6),可以執行P1和P4,兩者都可以,這裡選擇先執行P4,後Available變成了(1,9,9,10),再執行P1,Available增到(2,9,9,10),最後執行P2)
(2)若程序P2提出請求Request(1,2,2,2)後,系統能否將資源分配給它?
答:不能,按照銀行家演算法,首先檢查Requesti [j] 是否小於等於 Need[i,j],在這裡(1,2,2,2) < (2,3,5,6)滿足條件,則再判斷Requesti [j] 是否小於等於 Available[j],這裡1,2,2,2) <(1,6,2,2)滿足!然後便試探性的將資源分配給P2,此時P2的Allocation項變為(2,5,7,6),Need項變為(1,1,3,4),Available項變為(0,4,0,0),執行安全性演算法,第一步就發現找不到一個程序使得Need[i,j] <= Work[j];所以安全性檢查失敗,這個Request請求會造成死鎖,系統將處於不安全狀態,故本次試探分配作廢,恢復原來的資源分配狀態,讓程序P2等待
筆記:若有m個資源,n個程序,每個程序至少需要1個資源(到底需要幾個不確定),那麼保證系統無死鎖的條件是:∑ni=1Max < m+n