天天看點

銀行家算法 - sou78

View Post

銀行家算法

銀行家算法是最有代表性的避免死鎖的算法。為實作銀行家算法,需要設定若幹個資料結構。

1.銀行家算法中的資料結構

(1)可利用的資源向量Available。這是一個含有m個元素的數組,其中的每一個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可用資源的數目,其數值随該資源的配置設定和回收而動态地改變。如果Available[j]=K,則表示系統中現有Rj類資源K個。

(2)最大需求矩陣Max。這是一個n*m的矩陣,它定義了系統中n個程序中的每一個程序對m類資源的最大需求。如果Max[i,j]=K,則表示程序i需要Rj類資源的最大數目為K。

(3)配置設定矩陣Allocation。這也是一個n*m的矩陣,它定義了系統中每一類資源目前已非配給每一程序的資源數。如果Allocation[i,j]=K,則表示程序i目前已分得Rj類資源的數目為K。

(4)需求矩陣Need。這也是一個n*m的矩陣,用以表示每一個程序尚需的各類資源數。如果Need[i,j]=K,則表示程序i還需要Rj類資源K個,方能完成其任務。

上述三個矩陣間存在的關系:

        Need[i,j]=Max[i,j]-Allocation[i,j]

2.銀行家算法

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

(1)如果Request(i)[j]<=Need[i,j],便轉向步驟(2);否則認為出錯,因為它所需要的資源超出了它宣布的最大值。

(2)如果Request(i)[j]<=Avaiable[j],便轉向步驟(3);否則表示尚無足夠資源,P(i)須等待。

(3)系統試探着把資源非配給程序P(i),并修改下面資料結構中的數值:

  Available[j]=Available[j]-Request(i)[j];

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

  Need[i,j]=Need[i,j]-Request(i)[j];

(4)系統執行安全性算法,檢查此資源配置設定後系統是否處于安全狀态。若安全,才正式将資源配置設定給程序P(i),以完成本次配置設定;否則,将本次的試探配置設定廢棄,恢複原來的資源配置設定狀态,讓程序P(i)等待。

3.安全性算法

系統所執行的安全性算法可描述如下:

(1)設定兩個向量;

工作向量work,它表示系統可提供給程序繼續運作所需的各類資源數目,它含有m個元素,在執行安全算法開始時,Work=Available

Finish,它表示系統是否有足夠的資源配置設定給程序,使之運作完成。開始時先做Finish[i]=false;當有足夠的資源配置設定給程序時,再令Finish[i]=true。

(2)從程序集合中找到一個能滿足下述條件的程序:

Finish[i]=false;

Need[i,j]<=Work[j];若找到,執行步驟(3),否則執行步驟(4)。

(3)當程序P(i)獲得資源後,可順序執行,直至完成,并釋放出配置設定給它的資源,故應執行:

Work[j]=Work[j]+Allcation[i,j];

Finish[i]=true;

go to step 2;

(4)如果所有程序的Finish[i]=true都滿足,則表示系統處于安全狀态;否則,系統處于不安全狀态。