**
一.概念引入
銀行家演算法( banker's algorithm )由 dijkstra於1965提出,關鍵是將死鎖的問題演示為乙個銀行家貸款的模型,由於能用於銀行系統的現金貸款而出名。乙個銀行家向一群客戶發放信用卡,每個客戶有不同的信用額度。每個客戶可以提出信用額度內的任意額度的請求,直到額度用完後再一次性還款。銀行家承諾每個客戶最終都能獲得自己需要的額度。所謂「最終」,是說銀行家可以先掛起某個額度請求較大的客戶的請求,優先滿足小額度的請求,等小額度的請求還款後,再處理掛起的請求。這樣,資金能夠永遠流通。所以銀行家演算法其核心是:保證銀行家系統的資源數至少不小於乙個客戶的所需要的資源數。
銀行家演算法是一種最有代表性的避免死鎖的演算法。在避免死鎖方法中允許程序動態地申請資源,但銀行家演算法在系統在進行資源分配之前(並不是真的不分配,這樣就沒法做了,只不過是試探性分配,不滿足的話再恢復),應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。為實現銀行家演算法,系統必須設定若干資料結構。要解釋銀行家演算法,必須先解釋作業系統安全狀態和不安全狀態。安全序列是指存在乙個程序序列是安全的,不會死鎖(至少兩個執行緒占有某資源a,但是都不滿足,剩餘的資源a分配給誰仍然無法滿足),安全狀態如果存在乙個由系統中所有程序構成的安全序列p1,…,pn,則系統處於安全狀態,安全狀態一定是沒有死鎖發生;不安全狀態不存在乙個安全序列,不安全狀態不一定導致死鎖。
本演算法在理論上是出色的,能非常有效地避免死鎖,但從某種意義上說,它缺乏實用價值,因為很少有程序能夠在執行前就知道其所需資源的最大值,且程序數也不是固定的,往往在不斷地變化(如新使用者登入或退出),況且原來可用的資源也可能突然間變成不可用(如印表機、磁帶機可能被損壞)。
二.演算法原理
銀行家演算法的基本思想是分配資源之前,判斷系統是否是安全的;若是,才分配。每分配一次資源就測試一次是否安全,不是資源全部就位後才測試,注意理解checkerror函式的迴圈順序。
我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。
為保證資金的安全,銀行家規定:
當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客(試探性分配)
顧客可以分期貸款,但貸款的總數不能超過最大需求量(可能一次並不能滿足所需要的全部資源)
當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款(不存在死鎖)
當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金(執行後釋放)
作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能存在安全狀態,則按當前的申請量分配資源,否則也要推遲分配。
銀行家演算法
我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。為保證資金的安全,銀行家規定 1 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客 2 顧客可以分期貸款,但貸款的總數不能超過最大需求量 3 當銀行家現有的...
銀行家演算法
銀行家演算法 banker s algorithm 是乙個避免死鎖 deadlock 的著名演算法,是由艾茲格 迪傑斯特拉在1965年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。就像我們從銀行貸快一樣,首先銀行會考慮到我們有沒有償還能力...
銀行家演算法
死鎖是作業系統層面的乙個錯誤,是程序死鎖的簡稱,最早在 1965 年由 dijkstra 在研究銀行家演算法時提出的,它是計算機作業系統乃至整個併發程式設計領域最難處理的問題之一。事實上,計算機世界有很多事情需要多執行緒方式去解決,因為這樣才能最大程度上利用資源,才能體現出計算的高效。但是,實際上來...