銀行家演算法

2021-07-22 09:05:57 字數 1598 閱讀 6274

死鎖是作業系統層面的乙個錯誤,是程序死鎖的簡稱,最早在 1965 年由 dijkstra 在研究銀行家演算法時提出的,它是計算機作業系統乃至整個併發程式設計領域最難處理的問題之一。

事實上,計算機世界有很多事情需要多執行緒方式去解決,因為這樣才能最大程度上利用資源,才能體現出計算的高效。但是,實際上來說,計算機系統中有很多一次只能由乙個程序使用的資源的情況,例如印表機,同時只能有乙個程序控制它。在多通道程式設計環境中,若干程序往往要共享這類資源,而且乙個程序所需要的資源還很有可能不止乙個。因此,就會出現若干程序競爭有限資源,又推進順序不當,從而構成無限期迴圈等待的局面。我們稱這種狀態為死鎖。簡單一點描述,死鎖是指多個程序迴圈等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個程序都將永遠處於封鎖狀態。

系統發生死鎖現象不僅浪費大量的系統資源,甚至導致整個系統崩潰,帶來災難性後果。所以,對於死鎖問題在理論上和技術上都必須予以高度重視。

乙個銀行家如何將一定數目的資金安全地借給若干個客戶,使這些客戶既能借到錢完成要幹的事,同時銀行家又能收回全部資金而不至於破產。銀行家就像乙個作業系統,客戶就像執行的程序,銀行家的資金就是系統的資源。

銀行家演算法需要確保以下四點:

1、當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;

2、顧客可以分期貸款, 但貸款的總數不能超過最大需求量;

3、當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款;

4、當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金。

死鎖問題是多執行緒特有的問題,它可以被認為是執行緒間切換消耗系統效能的一種極端情況。在死鎖時,執行緒間相互等待資源,而又不釋放自身的資源,導致無窮無盡的等待,其結果是系統任務永遠無法執行完成。死鎖問題是在多執行緒開發中應該堅決避免和杜絕的問題。

一般來說,要出現死鎖問題需要滿足以下條件:

1、互斥條件:乙個資源每次只能被乙個執行緒使用。

2、請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。

3、不剝奪條件:程序已獲得的資源,在未使用完之前,不能強行剝奪。

4、迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

public class threaddeadlock    

}

class syncthread implements runnable

@override

public void run()

system.out.println(name + " released lock on "+obj2);

}

system.out.println(name + " released lock on "+obj1);

system.out.println(name + " finished execution.");

}

private void work() catch (interruptedexception e)

}

}

銀行家演算法

我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。為保證資金的安全,銀行家規定 1 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客 2 顧客可以分期貸款,但貸款的總數不能超過最大需求量 3 當銀行家現有的...

銀行家演算法

銀行家演算法 banker s algorithm 是乙個避免死鎖 deadlock 的著名演算法,是由艾茲格 迪傑斯特拉在1965年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。就像我們從銀行貸快一樣,首先銀行會考慮到我們有沒有償還能力...

銀行家演算法

include include define m 30 資源 define n 20 程序 using namespace std int n 程序的個數 int m 資源的種類數 int wp 所要請求資源的程序 int wp m 請求各個資源的值 int process end n 判斷是否是已...