死鎖避免涉及到的銀行家算法(操作系統)

死鎖避免屬於事先預防策略,但它並不是事先採取限制措施破壞產生死鎖的必要條件,而是在資源分配的動態過程中,防止系統進入不安全狀態,從而避免發生死鎖。這種方法所施加的措施不嚴,可以使系統的性能得到有效的發揮。

一:系統安全狀態

   避免死鎖的方法中,允許進程動態的申請資源,但系統在進行資源分配之前,應先計算分配資源後是否會進入不安全狀態。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程;否則,拒絕分配。

   安全狀態即指,系統能按某種進程推進序列{P1,P2......Pn}來爲每個進程Pi分配所需的資源,直至滿足每個進程對資源的最大需求,使每個進程都可順序完成,此時稱P1,P2,..........Pn爲安全序列。若系統無法找到一個安全序列,則稱此係統爲不安全狀態。

  並非所有的不安全狀態都是死鎖狀態,但當系統進入不安全狀態後,便有可能發生死鎖。反之,若系統處於安全狀態,便可避免發生死鎖。(除非新加入進程)

二:銀行家算法

  銀行家算法是著名的死鎖避免算法,其思想是:把操作系統視爲銀行家,操作系統管理的資源視爲銀行家所管理的資金,進程向操作系統申請分配資源相當於用戶向銀行家貸款。操作系統按銀行家制定的規則爲進程分配資源,當進程首次向系統申請資源時,系統要測試該進程對資源的最大需求量,若系統現存的資源可以滿足他的最大需求量,則按當前申請的資源數目分配給它;否則,就推遲分配。當該進程在運行過程中再次申請資源時,測試申請的資源數目和已分配的資源數目之和是否大於最大需要量,若超過,則拒絕分配。若沒有超過,則測試該進程尚需資源的最大需求量是否小於當前系統現有的資源,若能滿足則按當前申請的資源數目分配。否則,推遲分配。

(1)數據結構描述

可利用資源向量Available:含有m個元素的數組,其中每個元素代表一類可用的資源數目,Available[j]=k表示Rj類資源有k個

最大需求矩陣Max:n×m矩陣,定義系統中n個進程中的每個進程對m類資源的最大需求量。直接來說,一行代表一個進程,一列代表一類資源。Max[i,j]=k表示第i個進程需要Rj類資源k個。

分配矩陣Allocation:n×m矩陣,定義系統中n個進程中的每個進程當前已分配的m類資源的數目。Allocation[i,j]=k表示當前進程i已分配j類資源k個。

需求矩陣Need:n×m矩陣,定義系統中n個進程中的每個進程當前還需要的m類資源的數目。Need[i,j]=k表示當前進程i需要m類資源k個。

Need=Max-Allocation

(2)銀行家算法描述

設  Request _i是進程Pi的請求向量,Request_i[j]=k表示進程 i 仍然需要 j 類資源k個。當Pi發出資源請求後,系統按如下步驟進行檢查:

  1. 若Request_i[j]<=Need_i[j] ,則轉向步驟2;否則認爲出錯,因爲它所要求申請的資源已經超出它所需要的最大值。
  2. 若Request_i[j]<=Available_i[j],則轉向3;否則認爲沒有足夠的資源,進程Pi尚需等待;
  3. 系統試探着把資源分配給進程Pi,並修改以下兩個數據的值                                                                                                                Available_i[j]=Available_i[j]-Request_i[j]                                                                                                                                  Allocation_i[j]=Allocation_i[j]+Request_i[j]                                                                                                                                Need_i[j]=Need_i[j]-Request_i[i]
  4. 系統執行安全性算法,檢查此次匹配之後,系統是否處於安全狀態,若處於安全狀態,則完成此次分配,並讓系統繼續運行。否則,此次的分配作廢,系統收回此次分配的資源,進程Pi處於等待狀態。

(3)安全性算法

  1. 初始時安全序列爲空
  2. 從Need矩陣中找出一行小於Available的元素,且該行 i 對應的進程Pi不在安全序列內,若找到,則將該Pi進程加入安全序列,轉 3;否則,若找不到的話,轉4.
  3. 進程Pi進入安全序列後,可順利執行直至完成,完成後可釋放該進程Pi所需要的資源,則可以令Available=Allocation[i]+Available,轉2
  4. 若此時安全序列包含所有進程,則說明分配資源後系統處於安全狀態;否則,系統處於不安全狀態。

三:安全性算法舉例

假設系統中有5個進程{P1,P2,P3,P4,P5}和三類資源{A,B.C},各種資源的數量分別爲10、6、8,在T0時刻的資源分配情況見下表所示

進程\資源情況

Max

A B C

Allocation

A B C 

Available

A B C

P1 7 6  4 2  3  3  1 3  1
P2 3 1  2 1  0  0
P3 1 2 5 0  2  2
P4 2 3 1  2  1  1
p5 1 1 2 0  1  0

 

(1)從圖中可以看到各個進程對應的Max和Allocation矩陣,進而兩者相減可以得到各個進程的Need矩陣

P1 7 6 4 2 3 3 5 3 1
P2 3 1 2 1 0 0  2 1 2
P3 1 2 5 0 2 2 1 0 3
P4 2 3 1 2 1 1 0 2 0
P5 1 1 2 0 1 0 1 0 2

(2)然後將Need矩陣與Available進行比較,哪行符合Need<=Available

  P4  (0,2,0)<(1,3,1)  Available=(1,3,1)+(2,1,1)=(3,4,2)

然後 P2符合 Available=(3,4,2)+(1,0,0)=(4,4,2)

然後P5符合 Available=(4,4,2)+(0,1,0)=(4,5,2)

找不到安全序列,此時系統處於不安全狀態
 

 

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