銀行家演算法( banker's algorithm )由 dijkstra(1065)提出。他將死鎖的問題演示為乙個銀行家貸款的模型。
乙個銀行家向一群客戶發放信用卡,每個客戶有不同的信用額度。每個客戶可以提出信用額度內的任意額度的請求,直到額度用完後再一次性還款。銀行家承諾每個客戶最終都能獲得自己需要的額度。
所謂「最終」,是說銀行家可以先掛起某個額度請求較大的客戶的請求,優先滿足小額度的請求,等小額度的請求還款後,再處理掛起的請求。這樣,資金能夠永遠流通。
銀行家演算法可以用以下圖表表示:
每個客戶和銀行家都有交易限額。銀行家只能和限額小於自己限額的客戶進行交易。一旦銀行家的限額小於所有客戶的限額,便發生了死鎖。
如上圖所示。銀行家分別和客戶1,客戶2,客戶3進行了交易。第一次交易時,所有客戶的限額都小於銀行家的限額,任何客戶都可以實現借款;第二次交易時,客戶3的限額大小銀行家的限額,這時銀行家會掛起客戶3 的請求;第三次交易時,只有客戶3可以進行交易,其它的交易都會被掛起。直到客戶3還款後,銀行家才會考慮處理其它客戶的交易。
銀行家演算法其核心是:保證自己的限額至少不小於乙個客戶的限額。
我們可以用填表法來快速解決銀行家演算法。
建立乙個二維**:每列資料表示每次交易各個參與者的限額。這個**第一列資料是銀行家是客戶的交易限額,每發生一次交易,增加一列,同時將銀行家和發生交易的客戶的限額減小。直到銀行家的限額小於某個客戶的限額時,交易不能繼續進行。否則便發生死鎖。
例題:1、作業系統分配資源時的乙個重要考慮是避免死鎖的發生.若系統中有同類資源 16 個,由四個程序 p1、p2、p3 和 p4 共享該資源。已知 p1、p2、p3、p4 所需的資源總數分別為 8、5、9、6。各程序請求資源的次序如下表,若系統採用銀行家演算法為它們分配資源,那麼_(1)__依次申請分配會使系統進入不安全狀態。
程序申請資源的情況
序號 程序 申請量
1 p1 6
2 p2 4
3 p3 5
4 p4 1
5 p1 1
6 p2 1
a.3、4 b.3、5 c.4、5 d.5、6
答案是c
我們初始化乙個二維**
到完成第三個請求到達的時候,資源只有乙個了。此時只能滿足p2的請求。所以,第四個和第五個請求會被系統掛起。第六個請求p2到達後會被處理。等p2事務結束釋放資源後,系統會再處理掛起的請求,這樣就不會發生死鎖。一旦在第三步後將剩下的唯一的乙個資源分配給其它的程序,(如請求4或請求5),則請求4和5可能會因需要不止乙個資源而繼續等待,則發生了死鎖。
銀行家演算法
我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。為保證資金的安全,銀行家規定 1 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客 2 顧客可以分期貸款,但貸款的總數不能超過最大需求量 3 當銀行家現有的...
銀行家演算法
銀行家演算法 banker s algorithm 是乙個避免死鎖 deadlock 的著名演算法,是由艾茲格 迪傑斯特拉在1965年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。就像我們從銀行貸快一樣,首先銀行會考慮到我們有沒有償還能力...
銀行家演算法
死鎖是作業系統層面的乙個錯誤,是程序死鎖的簡稱,最早在 1965 年由 dijkstra 在研究銀行家演算法時提出的,它是計算機作業系統乃至整個併發程式設計領域最難處理的問題之一。事實上,計算機世界有很多事情需要多執行緒方式去解決,因為這樣才能最大程度上利用資源,才能體現出計算的高效。但是,實際上來...