銀行家算法
銀行家算法(英語:Banker's Algorithm)是一個避免死鎖的著名算法,是由荷蘭計算機科學家艾茲赫爾·戴克斯特拉在1965年為T.H.E作業系統設計的一種避免死結產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全運行。
背景
在銀行中,客戶申請貸款的數量是有限的,每個客戶在第一次申請貸款時要聲明完成該項目所需的最大資金量,在滿足所有貸款要求時,客戶應及時歸還。銀行家在客戶申請的貸款數量不超過自己擁有的最大值時,都應儘量滿足客戶的需要。在這樣的描述中,銀行家就好比操作系統,資金就是資源,客戶就相當於要申請資源的進程。
處理程序
Allocation Max Available ABCD ABCD ABCD P1 0014 0656 1520 P2 1432 1942 P3 1354 1356 P4 1000 1750
我們會看到一個資源分配表,要判斷是否為安全狀態,首先先找出它的Need,Need即Max(最多需要多少資源)減去Allocation(原本已經分配出去的資源),計算結果如下:
NEED ABCD 0642 0510 0002 0750
然後加一個全都為false的欄位
FINISH false false false false
接下來找出need比available小的(千萬不能把它當成4位數 他是4個不同的數)
NEED Available ABCD ABCD 0642 1520 0510<- 0002 0750
P2的需求小於能用的,所以配置給他再回收
NEED Available ABCD ABCD 0642 1520 0000 +1432 0002------- 0750 2952
此時P2 FINISH的false要改成true(己完成)
FINISH false true false false
接下來繼續往下找,發現P3的需求為0002,小於能用的2952,所以資源配置給他再回收
NEED Available ABCD A B C D 0642 2 9 5 2 0000 +1 3 5 4 0000---------- 0750 3 12 10 6
依此類推,做完P4→P1,當全部的FINISH都變成true時,就是安全狀態。
安全和不安全的狀態
如果所有Process都可以完成並終止,則一個狀態(如上述範例)被認為是安全的。由於系統無法知道什麼時候一個過程將終止,或者之後它需要多少資源,系統假定所有進程將最終試圖獲取其聲明的最大資源並在不久之後終止。在大多數情況下,這是一個合理的假設,因為系統不是特別關注每個進程運行了多久(至少不是從避免死鎖的角度)。此外,如果一個進程終止前沒有獲取其能獲取的最多的資源,它只是讓系統更容易處理。
基於這一假設,該算法通過嘗試尋找允許每個進程獲得的最大資源並結束(把資源返還給系統)的進程請求的一個理想集合,來決定一個狀態是否是安全的。不存在這個集合的狀態都是不安全的。
虛擬碼(pseudo-code)[1]
P - 進程的集合
Mp - 進程p的最大的請求數目
Cp - 進程p當前被分配的資源
A - 當前可用的資源
while (P != ∅) { found = FALSE; foreach (p ∈ P) { if (Mp − Cp ≤ A) { /* p可以獲得他所需的資源。假設他得到資源後執行;執行終止,並釋放所擁有的資源。*/ A = A + Cp ; P = P − {p}; found = TRUE; } } if (! found) return FAIL; } return OK;
參考文獻
引用
- ^ Concurrency (PDF). [2009-01-13]. (原始內容存檔 (PDF)於2014-01-06).