銀行家算法

目的

  瞭解多道程序系統中,多個進程併發執行的資源分配。

設計要求

  管理員可以把一定數量的作業供多個用戶週轉使用,爲保證作業的安全,管理員規定:當一個用戶對作業的最大需求量不超過管理員現有的資金就要接納該用戶;用戶可以分期貸款,但貸款的總數不能超過最大需求量;當管理員現有的作業不能滿足用戶的所需數時,對用戶的請求可以推遲支付,但總能使用戶在有限的時間裏得到請求。當用戶得到所需的全部作業後,一定能在有限的時間裏歸還所有的作業。

數據結構

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]

解決思路

銀行家算法

設Request i是進程Pi的申請向量,如果Request i[j]=K,則表示進程Pi需要K個Rj類型的資源。當Pi發出資源請求後,系統按下述步驟進行檢查:
1) 如果Request i[j]<=Need[i,j],便轉向步驟2);否則認爲出錯,因爲它所需要的資源數已經超過它所宣佈的最大值。
2) 如果Request i[j]<=Available[i,j],便轉向步驟3);否則,表示尚無足夠資源,Pi需等待。
3) 系統試探着把資源分配給進程Pi,並修改下面數據結構中的數值:
     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) 系統執行安全性算法,檢查此次資源分配後系統是否處於安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配;否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。

安全性算法

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

1) 設置兩個向量

① 工作向量Work,它表示系統可提供給進程繼續運行所需的各類資源數目,它含有m個元素,在執行安全算法開始時,Work:=Available。
② Finish,它表示系統是否有足夠的資源分配給進程,使之運行完成。開始時先做Finish[i]:=false;當有足夠資源分配給進程時,再令Finish[i]:=ture.

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都滿足,則表示系統處於安全狀態;否則,系統處於不安全狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章