死鎖避免屬於事先預防策略,但它並不是事先採取限制措施破壞產生死鎖的必要條件,而是在資源分配的動態過程中,防止系統進入不安全狀態,從而避免發生死鎖。這種方法所施加的措施不嚴,可以使系統的性能得到有效的發揮。
一:系統安全狀態
避免死鎖的方法中,允許進程動態的申請資源,但系統在進行資源分配之前,應先計算分配資源後是否會進入不安全狀態。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程;否則,拒絕分配。
安全狀態即指,系統能按某種進程推進序列{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發出資源請求後,系統按如下步驟進行檢查:
- 若Request_i[j]<=Need_i[j] ,則轉向步驟2;否則認爲出錯,因爲它所要求申請的資源已經超出它所需要的最大值。
- 若Request_i[j]<=Available_i[j],則轉向3;否則認爲沒有足夠的資源,進程Pi尚需等待;
- 系統試探着把資源分配給進程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]
- 系統執行安全性算法,檢查此次匹配之後,系統是否處於安全狀態,若處於安全狀態,則完成此次分配,並讓系統繼續運行。否則,此次的分配作廢,系統收回此次分配的資源,進程Pi處於等待狀態。
(3)安全性算法
- 初始時安全序列爲空
- 從Need矩陣中找出一行小於Available的元素,且該行 i 對應的進程Pi不在安全序列內,若找到,則將該Pi進程加入安全序列,轉 3;否則,若找不到的話,轉4.
- 進程Pi進入安全序列後,可順利執行直至完成,完成後可釋放該進程Pi所需要的資源,則可以令Available=Allocation[i]+Available,轉2
- 若此時安全序列包含所有進程,則說明分配資源後系統處於安全狀態;否則,系統處於不安全狀態。
三:安全性算法舉例
假設系統中有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)
找不到安全序列,此時系統處於不安全狀態