銀行家演算法---------概念&舉例
銀行家演算法是一種用來避免作業系統死鎖出現的有效演算法,所以在引入銀行家演算法的解釋之前,有必要簡單介紹下死鎖的概念。
死鎖:是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
死鎖的發生必須具備以下四個必要條件:
1)互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個程序佔用。如果此時還有其它程序請求資源,則請求者只能等待,直至佔有資源的程序用畢釋放。2)請求和保持條件:指程序已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程序佔有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。
3)不搶佔條件
4)迴圈等待條件:指在發生死鎖時,必然存在一個程序——資源的環形鏈,即程序集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
避免死鎖演算法中最有代表性的演算法就是Dijkstra E.W 於1968年提出的銀行家演算法,銀行家演算法是避免死鎖的一種重要方法,防止死鎖的機構只能確保上述四個條件之一不出現,則系統就不會發生死鎖。
為實現銀行家演算法,系統必須設定若干資料結構,同時要解釋銀行家演算法,必須先解釋作業系統安全狀態和不安全狀態。
安全序列:
安全狀態:如果存在一個由系統中所有程序構成的安全序列P1,…,Pn,則系統處於安全狀態。安全狀態一定是沒有死鎖發生。
不安全狀態:不存在一個安全序列。不安全狀態不一定導致死鎖。
資料結構:
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個R(j)型別的資源。當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];
說了這麼多基本的概念,下面就讓我們通過實際案例來體會銀行演算法吧。銀行家演算法之例:
解析:
從圖中資料我們可以利用銀行家演算法的四個資料結構,來描述當前的系統狀態
Max | Allocation | Need | Available | |||||||
A | B | C | A | B | C | A | B | C | A B C | |
P1 | 5 | 5 | 9 | 2 | 1 | 2 | 3 | 4 | 7 | 2 3 3 |
P2 | 5 | 3 | 6 | 4 | 0 | 2 | 1 | 3 | 4 | |
P3 | 4 | 0 | 11 | 4 | 0 | 5 | 0 | 0 | 6 | |
P4 | 4 | 2 | 5 | 2 | 0 | 4 | 2 | 2 | 1 | |
P5 | 4 | 2 | 4 | 3 | 1 | 4 | 1 | 1 | 0 |
(1)在T0時刻,由於Availabel大於等於Need中 P5 所在行的向量,因此Availabel能滿足 P5 的執行,在 P5 執行後,系統的狀態變更為如下圖所示:
Work | Need | Allocation | Work+Allocation | finsh | |||||||||
A | B | C | A | B | C | A | B | C | A | B | C | ||
P5 | 2 | 3 | 3 | 1 | 1 | 0 | 3 | 1 | 4 | 5 | 4 | 7 | true |
P4 | 5 | 4 | 7 | 2 | 2 | 1 | 2 | 0 | 4 | 7 | 4 | 11 | true |
P3 | 7 | 4 | 11 | 0 | 0 | 6 | 4 | 0 | 5 | 11 | 4 | 16 | true |
P2 | 11 | 4 | 16 | 1 | 3 | 4 | 4 | 0 | 2 | 15 | 4 | 18 | true |
P1 | 15 | 4 | 8 | 3 | 4 | 7 | 2 | 1 | 2 | 17 | 5 | 20 | true |
因此,在T0時刻,存在安全序列:P5,P4,P3,P2,P1(並不唯一)
(2)P2請求資源,P2發出請求向量Request(i)(0,3,4),系統根據銀行家演算法進行檢查;① P2 申請資源Reuqest(i)(0,3,4)<=Need中 P2 所在行向量Need(i)(1,3,4)
② P2 申請資源Reuqest(i)(0,3,4)>=可以利用資源向量Availabel(2,3,3),所以,該申請不給於分配
(3)P4請求資源,P4發出請求向量Request(i)(2,0,1),系統根據銀行家演算法進行檢查;
①Reuqest(i)(2,0,1)<= Need(i)(2,2,1)
② Reuqest(i)(2,0,1 <= Availabel(2,3,3)
③對 P4 的申請(2,0,1)進行預分配後,系統的狀態為:
Max | Allocation | Need | Available | |||||||
A | B | C | A | B | C | A | B | C | A B C | |
P1 | 5 | 5 | 9 | 2 | 1 | 2 | 3 | 4 | 7 | 0 3 2 |
P2 | 5 | 3 | 6 | 4 | 0 | 2 | 1 | 3 | 4 | |
P3 | 4 | 0 | 11 | 4 | 0 | 5 | 0 | 0 | 6 | |
P4 | 4 | 2 | 5 | 4 | 0 | 5 | 0 | 2 | 0 | |
P5 | 4 | 2 | 4 | 3 | 1 | 4 | 1 | 1 | 0 |
可利用資源向量Availabel=(0,3,2),大於Need中 P4 所在行的向量(0,2,0),因此可以滿足 P4 的執行。P4 執行結束後,系統的狀態變為:
Work | Need | Allocation | Work+Allocation | finsh | |||||||||
A | B | C | A | B | C | A | B | C | A | B | C | ||
P4 | 0 | 3 | 2 | 0 | 2 | 0 | 4 | 0 | 5 | 4 | 3 | 7 | true |
P5 | 4 | 3 | 7 | 1 | 1 | 0 | 3 | 1 | 4 | 7 | 4 | 11 | true |
P3 | 7 | 4 | 11 | 0 | 0 | 6 | 4 | 0 | 5 | 11 | 4 | 16 | true |
P2 | 11 | 4 | 16 | 1 | 3 | 4 | 4 | 0 | 2 | 15 | 4 | 18 | true |
P1 | 15 | 4 | 18 | 3 | 4 | 7 | 2 | 1 | 2 | 17 | 5 | 20 | true |
同理依次推導,可計算出存在安全序列P4,P5,P3,P2,P1(並不唯一)
(4)P1請求資源,P1發出請求向量Request(i)(0,2,0),系統根據銀行家演算法進行檢查;
①Request(i)(0,2,0)<= Need(i)(3,4,7)
② Request(i)(0,2,0)<= Availabel(2,3,3)
③對 P1 的申請(0,2,0)進行預分配後,系統的狀態為:
Max | Allocation | Need | Available | |||||||
A | B | C | A | B | C | A | B | C | A B C | |
P1 | 5 | 5 | 9 | 2 | 3 | 2 | 3 | 2 | 7 | 0 1 2 |
P2 | 5 | 3 | 6 | 4 | 0 | 2 | 1 | 3 | 4 | |
P3 | 4 | 0 | 11 | 4 | 0 | 5 | 0 | 0 | 6 | |
P4 | 4 | 2 | 5 | 2 | 0 | 4 | 2 | 2 | 1 | |
P5 | 4 | 2 | 4 | 3 | 1 | 4 | 1 | 1 | 0 |
由於Availabel不大於等於 P1 到 P5 任一程序在Need中的需求向量,因此係統進行預分配後
處於不安全狀態,所以對於 P1 申請資源(0,2,0)不給予分配。
注意:因為(4)是建立在第(3)問的基礎上的所以Available=(0,3,2)-(0,2,0)=(0,1,2)
總結:通過上述的解釋,我相信大家對理解這種類似的題目應該遊刃有餘了吧,如果實在不懂的話那我就推薦一個網站,那裡面有個專門講這個銀行家演算法的案例,個人覺得比較詳細,
銀行家演算法視訊