1. 程式人生 > >利用銀行家演算法避免死鎖的介紹與舉例

利用銀行家演算法避免死鎖的介紹與舉例

一、資料結構

  1.多個程序: { P0,P1,P2,P4 } 代表1,2,3,4四個需要臨界資源的程序

  2.幾種資源:{ A, B ,C } 代表A,B,C三種臨界資源

  3.Max:最大需求矩陣(程序完成執行需要的各資源總量)

    Allocation:分配矩陣(某個程序現在已經擁有的各資源量)

    Need:需求矩陣(某個程序仍需要的各資源量)

    Available:可利用資源向量 (系統保有的供分配的資源量)

    其中:Need = Max - Allocation ,很容易理解嘛,仍然需要的量等於總需求量減去擁有的量

二、銀行家演算法

  設 Request是程序 P的請求向量,如果 Request[j] = K,表明程序需要K個Rj型別的資源。當Pi發出資源請求後,系統按照如下步驟進行檢查:

  (1)如果 Requesti [j] <= Need[i,j],便轉向步驟(2),否則認為出錯,因為它所需要的資源數已經超過它所宣佈的最大值。

  (2)如果 Request[j] <= Available[j],便轉向步驟(3),否則表示尚無足夠資源,Pi 需等待。

  (3)系統試探性的把資源分配給程序Pi

 ,並修改下面資料結構中的數值:

    Available[j] = Available[j] - Request[j];

    Allocation[i,j] = Allocation[i,j] + Request[j];

    Need[i,j] = Need[i,j] -  Request[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)後,系統能否將資源分配給它?

  答:不能,按照銀行家演算法,首先檢查Request[j] 是否小於等於 Need[i,j],在這裡(1,2,2,2) < (2,3,5,6)滿足條件,則再判斷Request[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