銀行家演算法(戰爭舉例、便於理解)
1 銀行家演算法
作業系統的程序可以動態地申請資源,但系統在進行資源分配之前,應先計算此次資源分配的安全性。(若此次分配為安全的,作業系統則將資源分配給程序,否則令程序等待)
避免死鎖的實質在於:系統在進行資源分配時,如何使系統不進入不安全狀態。
1.1 舉例理解
戰爭舉例:
大將軍(作業系統)有一個部隊(代分配的資源),當然部隊中有各種兵種(弓箭手、騎兵等,每個兵種就能完成特定的戰爭)人有若干(人數固定,大將軍也只有這點兵),現在在我方的城池(很多個城池,當然每個城池每個兵種都有一定的人駐紮在這裡,已分配的資源)有敵方突襲(每個城池都僵持著,沒戰勝敵方之前不能從這個城池把各個兵種的人撤走),這時每個城池都給大將軍發出了能戰勝敵方每個兵種的需求數量
銀行家演算法就是來判斷能否贏取整個戰爭。
1.2 銀行家演算法的資料結構(以例子作為出發點)
-
可利用資源向量Available(代表大將軍的部隊,部隊中各個兵種的人有若干個) 這是一個含有m個元素的陣列,其中的每一個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可用資源的數目,其數值隨該類資源的分配和回收而動態地改變。如果Available[j]=K,則表示系統中現有Rj類資源K個。
-
最大需求矩陣Max(代表一個城池中能夠戰勝敵方每個兵種需要全部的數量) 這是一個n×m的矩陣,它定義了系統中n個程序中的每一個程序對m類資源的最大需求。如果Max[i,j]=K,則表示程序i需要Rj類資源的最大數目為K。
-
分配矩陣Allocation(代表城池中已經駐紮的各個兵種的數量) 這也是一個n×m的矩陣,它定義了系統中每一類資源當前已分配給每一程序的資源數。如果Allocation[i,j]=K,則表示程序i當前已分得R j類資源的數目為K。
-
需求矩陣Need(代表城池傳送給大將軍每個兵種需要支援的數量)
這也是一個n×m的矩陣,用以表示每一個程序尚需的各類資源數。如果Need[i,j]=K,則表示程序i還需要R j類資源K個,方能完成其任務。
存在關係:Need[i, j]=Max[i, j]-Allocation[i, j];(城池的發出請求每個兵種的數量 = 戰勝敵方所需每個兵種數量 - 城池中已有每個兵種數量)
1.3 銀行家演算法例項
假定系統中有五個程序{P0,P1,P2,P3,P4}和三類資源{A,B,C},各種資源的數量分別為10、5、7,在T0時刻的資源分配情況如圖示。 (先忽略P1第二行的括號)
描述:有若干城池(P0 — P4),大將軍有可利用的每個兵種的人數Available(3,3,2),就拿P0來說,P0解決戰鬥每個兵種的需要的總人數Max(7,5,3),在城池中每個兵種已經有的人數Allocation(0,1,0),P0完成這場鬥爭需要的兵的數量Need(7,4,3)【Need[i]=Max[i]-Allocation[i]】
解決步驟:首先大將軍比較P0發現直接的兵Available(3,3,2),不能滿足P0的需求Need(7,4,3),於是走到下一個城池P0,發現可以打贏這場戰爭,於是戰鬥解放了城池,因此部隊也得到了增強到Available(5,3,2),依次類推尋找可以戰勝戰爭的城池,獲得最終的勝利。
戰鬥順序:p1 -> P3 ->P4 -> P2 -> P0
計算方法:迴圈執行緒Pi,每次把Available跟Pi的Need比較,如果發現Available中每個元素都大於Need的每個元素,則進行資源分配,程序工作完後把Available=(Available+Allocation),依次迴圈找到執行緒分配序列。