【Java多線程】銀行家算法

目錄

銀行家算法中的數據結構 

算法過程

安全性算法 

例子


以下內容摘自:湯子瀛的《計算機操作系統》第三版。

最有代表性的避免死鎖的算法,是 Dijkstra 的銀行家算法。爲實現銀行家算法,系統中必須設置若干數據結構。 

銀行家算法中的數據結構 

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

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

(3) 分配矩陣 Allocation。 這也是一個 n×m 的矩陣, 它定義了系統中每一類資源當前已分配給每一進程的資源數。如果 Allocation[i,j]=K,則表示進程 i 當前已分得 R j類資源的數目爲 K。 

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

上述三個矩陣間存在關係: Need[i, j]=Max[i, j]-Allocation[i, j] 。在初始時Max[i,j] = Need[i,j],隨着進程i不斷地請求資源j(大部分情況下進程i一次請求一點資源,不是一次性請求完),每次請求完都有Need[i,j] - = 分配的資源數。

算法過程

銀行家算法的主要內容就是安全性檢查,這也是該算法能避免死鎖的關鍵。

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

安全性算法 

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

(1) 設置兩個向量: 
① 工作向量 Work, 它表示系統可提供給進程繼續運行所需的各類資源數目, 它含有 m個元素,在執行安全算法開始時,Work:=Available。 
② 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 都滿足,則表示系統處於安全狀態;否則,系統處於不安全狀態。 

注意:如果找到進程p併爲其分配資源,說明可用資源能滿足該進程所有的資源需求,於是將剩餘資源分配給p,等p運行完後將p的資源全部回收,進行下一波進程查找;若回收p的資源後,可用資源不能滿足其它任一請求進程的所有資源需求(Need[i,j]≤Work[j]),則進入死鎖(系統處於不安全狀態)。

例子

場景見下圖文字,下圖是一個安全狀態的場景。(a)中2(7)表示C1已經借了2個資金單位,還差7個資金單位。

不安全的場景如下:

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