避免死鎖 銀行家演算法

2021-09-24 04:35:07 字數 2554 閱讀 8609

了解了什麼是死鎖,以及死鎖產生的原因,懂得如何去避免死鎖。在前面 作業系統之【死鎖問題】 已經提到。在死鎖的避免上有現今有兩種比較著名的方案,一是有序資源分配法,二是銀行家演算法。這裡講述一下銀行家演算法。

銀行家演算法(banker's algorithm)是乙個避免死鎖(deadlock)的著名演算法,是由艾茲格·迪傑斯特拉在2023年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。

在銀行中,客戶申請貸款的數量是有限的,每個客戶在第一次申請貸款時要宣告完成該專案所需的最大資金量,在滿足所有貸款要求時,客戶應及時歸還。銀行家在客戶申請的貸款數量不超過自己擁有的最大值時,都應盡量滿足客戶的需要。在這樣的描述中,銀行家就好比作業系統,資金就是資源,客戶就相當於要申請資源的程序。

銀行家演算法是一種最有代表性的避免死鎖的演算法。在避免死鎖方法中允許程序動態地申請資源。系統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。

先舉乙個例子:

乙個銀行家共有20億財產

第乙個開發商:已貸款15億,資金緊張還需3億。

第二個開發商:已貸款5億,運轉良好能收回。

第三個開發商:欲貸款18億

在這種情況下,如果你是銀行家,你怎麼處理這種情況?乙個常規的想法就是先等著第二個開發商把錢收回來,然後手裡有了5個億,再把3個億貸款給第乙個開發商,等第乙個開發商收回來18個億,然後再把錢貸款給第三個開發商。

這裡面什麼值得學習呢?最重要的就是眼光放長一點,不要只看著手裡有多少錢,同時要注意到別人欠自己的錢怎麼能收回來。

銀行家是資源,開發商是程序。在作業系統中,有記憶體,硬碟等等資源被眾多程序渴求著,那麼這些資源怎麼分配給他們才能避免「銀行家破產」的風險?

(1)當乙個程序對資源的最大需求量不超過系統的資源數時,可以接納該程序。

(2)程序可以分期請求資源,但請求的總數不能超過最大需求量

(3)當系統現有的資源不能滿足系統尚需資源數時,對程序的需求可以推遲分配。但總能使程序在有限時間裡得到資源。

假設系統中有三類互斥資源r1、r2、r3,可用資源數分別是9、8、5。在t0時刻系統中有p1、p2、p3、p4和p5五個程序,這些程序對資源的最大需求量和已分配資源數如下所示。程序應當如何序列執行,系統才是安全的?

稍作分析:對於p1程序而言,它的最大需求量r1、r2、r3分別是6、5、2,並且系統已經給他分配r1、r2、r3分別是1、2、1。如此,對於p1程序而言還需要的r1、r2、r3資源數為5、3、1。依次類推。計算還需要的資源數。

對於r1資源來說,系統中一共是9個,而p1-->p5一共佔據了1+2+2+1+1 = 7個資源,說明系統中還剩餘r1資源為9 - 7 =2 個。

如此我們可以計算出 剩餘的系統資源數r1、r2、r3來。

r1 = 9 -(1+2+2+1+1) = 2 

r2 = 8 - (2+1+1+2+1) = 1

r3 = 5 - (1+1+3) = 0

這樣我們就可以用系統所剩餘資源與p1-->p5程序所需要的資源進行比較,保證一點就是程序所需資源不得超過系統所剩餘資源。第一次判斷,為p2先進行執行。當p2程序執行完畢後,p2程序中之前所占有的資源數會歸給系統資源,所以此時p2資源執行完畢後系統資源所剩餘的資源數為現有+已經分配r1、r2、r3分別是4、2、1。

依次類推,得出結論為:

1,分布式系統詳解--基礎知識(概論)

2,分布式系統詳解--基礎知識(執行緒)

3,idea和eclipse的比較

4,intellij idea(最新)安裝-破解詳解--親測可用

5,作業系統之【死鎖問題】

6,【由淺入深】爬蟲技術,值得收藏,來了解一下~

7,akka 簡介及簡單原理

8,spark-集群安裝、部署、啟動、測試(1.6.3)穩定版

9,spark-rdd簡介以及運算元例項

10,分布式系統詳解(apache hive 入門-簡介)

死鎖,銀行家演算法

我們知道作業系統中很多種資源,如cpu,記憶體,io裝置等,每種資源又有很多例項,對於這些資源,程序該如何訪問?請求 獲取 申請空閒資源 使用 占用 程序占用資源 釋放 資源狀態由占用變為空閒 為了更好的了解死鎖,我們將資源分類 1 預防死鎖。這是一種較簡單和直觀的事先預防的方法。方法是通過設定某些...

死鎖與銀行家演算法

死鎖定義 死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。死鎖條件 1 互斥條件 指程序對所分配到的資源進行排它性使用,即在一段時間內某資源...

程式設計時要盡量避免死鎖(銀行家演算法)

import threading import time class mythread1 threading.thread defrun self 對mutexa上鎖 mutexa.acquire mutexa上鎖後,延時1秒,等待另外那個執行緒 把mutexb上鎖 print self.name ...