1. 程式人生 > >死鎖避免:銀行家演算法

死鎖避免:銀行家演算法

概念

Dijksta提出(1965): 仿照銀行家發放貸款時採取的控制方式而設計的一種死鎖避免演算法。

應用條件

  1. 固定數量的程序中共享數量固定額資源
  2. 每個程序預先制定完成工作所需的最大資源數量
  3. 程序不能申請比系統中可用資源總數還多的資源
  4. 程序等待資源的時間是有限的。
  5. 如果系統滿足了程序對資源的最大需求,那麼程序應該在有限的時間內使用資源,然後
    歸還給系統。

具體實現

演算法結構

  1. 可利用資源向量Available  ARRAY[1…m]of interger
    是個含有m個元素的陣列,其中的每一個元素代表一類可利用的資源數目。如果Available[j]=K,則表示系統中現有Rj類資源K個。   
  2. 最大需求矩陣Max   ARRAY[1…n,1…m]of interger
    這是一個n×m的矩陣,它定義了系統中n個程序中的每一個程序對m類資源的最大需求。如果Max[i,j]=K,則表示程序i需要Rj類資源的最大數目為K。   
  3. 分配矩陣Allocation  ARRAY[1…n,1…m]of interger 
    這也是一個n×m的矩陣,它定義了系統中每一類資源當前已分配給每一程序的資源數。如果Allocation[i,j]=K,則表示程序i當前已分得Rj類資源的 數目為K。   
  4. 需求矩陣Need   ARRAY[1…n,1…m]of interger
    這也是一個n×m的矩陣,用以表示每一個程序尚需的各類資源數。如果Need[i,j]=K,則表示程序i還需要Rj類資源K個,方能完成其任務。   
    Need[i,j]=Max[i,j]-Allocation[i,j]
  5. Request ARRAY[1…n,1…m]of interger
    本次程序對資源的申請多少。
    註釋:為了方便一下簡寫為:AVAILABLE;Max[i]; Allocation[i]; Need[i]; Request[i]

銀行家演算法具體實現:

當程序Pi提出資源申請時,系統執行下列步驟:
1. 如果Request[i]<= Need[i] ,則轉(2) ;否則,報錯返回。
2. 如果Request[i]<= AVAILABLE[i] ,則轉(3) ;否則,程序等待。
3. 假如系統分配資源,則有:
AVAILABLE[i]=AVAILABLE[i]-Request[cusneed][i];
Allocation[cusneed][i]=Allocation[i]+Request[cusneed][i];
Need[i]-=Request[i];
到此時系統進入了一個新的狀態,需要進行判斷


4. 系統執行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統恢復原狀, 程序等待。

安全性檢查演算法

  1. 資料結構
    Work ARRAY[1…m]of interger
    Finish ARRAY[1…m]of Boolean
  2. 安全性檢查步驟
    (1) Work=AVAILABLE;
    FINISH = false;
    (2) 從程序集合中找到一個滿足下述條件的程序i,
    Finish[i]==false;
    Need[i]<=Work;
    如找到,執行(3) ; 否則,執行(4)
    (3) 設程序獲得資源,可順利執行,直至完 成,從而釋放資源。
    Work+=ALLOCATION[i];
    Finish[i]=true;
    轉到(2)
    (4) 如所有的程序i,Finish= true ,則表示安全;否則系統不安全。

作業系統安全狀態和不安全狀態:   

全序列是指一個程序序列{P1,…,Pn}是安全的,如果對於每一個程序Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩餘資源量與所有程序Pj (j < i )當前佔有資源量之和。
如果存在一個由系統中所有程序構成的安全序列P1,…,Pn,則系統處於安全狀態。安全狀態一定是沒有死鎖發生。
  不存在一個安全序列。不安全狀態不一定導致死鎖(有的數上說是一定,不一定的應該是動態分配資源吧)。