死鎖與銀行家算法
1. 死鎖定義
指多個進程在運行過程中,因爭奪資源而造成的一種僵局。當進程處於這種狀態時,若無外力作用,它們都將無法再向前推進。
2. 死鎖與飢餓
-
死鎖(Deadlock): 指進程之間無休止地互相等待!
-
飢餓(Starvation):指一個進程無休止地等待!
3. 產生死鎖的原因
- 競爭資源
- 進程間推進順序非法
3. 產生死鎖的必要條件 (四個條件都具備就會死鎖,缺一就不會死鎖)
- 互斥條件
- 請求和保持條件
- 不剝奪條件
- 環路等待條件
4. 處理死鎖的基本方法:
1)事先預防:預防死鎖、避免死鎖
2)事後處理: 檢測死鎖、解除死鎖
5. 預防死鎖的方法:
- 摒棄“請求和保持”條件
- 摒棄“不剝奪”條件: 允許進程先運行,但當提出的新要求不被滿足時必須釋放它已保持的所有資源,待以後需要時再重新申請。
- 摒棄“環路等待”條件
6. 避免死鎖:
只要使系統始終處於安全狀態,便可避免發生死鎖。
-
安全狀態:系統能按某種進程順序爲每個進程分配所需資源,直至滿足每個進程對資源的最大需求,並能順利完成。
-
不安全狀態:系統無法找到一種使多個進程能夠順利分配資源執行完的安全序列。
不是所有的不安全狀態都是死鎖狀態。
7. 死鎖的檢測
檢測時機:
- 當進程等待時檢測死鎖
- 定時檢測
- 系統資源利用率下降時檢測死鎖
死鎖定理:
- 利用資源分配圖簡化法來檢測死鎖。
簡化方法如下:
1.在資源分配圖中找出一個既不阻塞又非獨立的進程結點Pi,在順利的情況下運行完畢,釋放其佔有的全部資源。
2.由於釋放了資源,這樣能使其它被阻塞的進程獲得資源繼續運行。消去了Pi的邊。
3.經過一系列簡化後,若能消去圖中所有邊,使結點都孤立,稱該圖是可完全簡化的。 - S狀態爲死鎖狀態的充分條件是當且僅當S狀態的資源分配圖是不可完全簡化的。<死鎖定理>
死鎖檢測算法:
- 每個進程和資源指定唯一編號
- 設置一張資源分配表
記錄各進程與其佔用資源之間的關係 - 設置一張進程等待表
記錄各進程與要申請資源之間的關係
8. 死鎖的解除
- 剝奪資源。從其他進程剝奪足夠數量的資源給死鎖進程以解除死鎖狀態。
- 撤銷進程。最簡單的是讓全部進程都死掉;溫和一點的是按照某種順序逐個撤銷進程,直至有足夠的資源可用,使死鎖狀態消除爲止。
9. 死鎖處理方法比較
10. 銀行家算法
最有代表性的避免死鎖的算法,是Dijkstra的銀行家算法。由於該算法能用於銀行系統現金貸款的發放而得名。
【思路描述】 隨時對系統中的所有資源信息進行統計,包括每種資源的數量、已分配給各進程的數量;每當進程提出某種資源請求時判斷該請求分配後是否安全,如果安全才分配。對每個資源請求的處理都要保證系統始終從一個安全狀態到另一個安全狀態。
銀行家算法中的數據結構
- 各類可利用資源的數量
向量Available
最大需求矩陣Max - 每個進程對每類資源的需求
最大需求矩陣Max
已分配矩陣Allocation
還需求的矩陣Need
避免死鎖的算法過程(銀行家算法)
- 構建資源分配表
- 判斷向下運行過程中,各進程對資源的需求是否安全
- 系統試探着把資源分配給進程Pi ,並修改相應數據結構的值(假設性操作)
- 系統執行安全性算法,判斷新的資源分配狀態是否是安全的
安全性算法
- 需要一些記錄信息的數據結構,設置兩個向量:
工作向量work
算法開始時work=Available;
系統找安全序列的過程需要不斷判斷和修改當前資源數量,不能直接修改原始數據記錄Aailable。
標誌向量Finish
表示每個進程是否有足夠的資源使之運行完成。開始時所以進程都設置初值Finish[i]:=false;
找安全序列的過程相當於使所有Finish[i]:=true。 - 找安全序列的過程
從 Finish[i] = false 的進程集合中找一個進程
IF Need[i,j] <= work[j]
THEN 執行步驟 a;
ELSE 執行步驟 b;
a) 假設Pi獲得資源順利執行完,釋放出分配給它的資源,修改相應的值:
work【j】 = work【i】+ Allocation【i,j】;
Finish【i】= true;
goto step (2); //返回去繼續找下一個進程。
b)當算法不再在 2 . 、a)步間循環找進程,到達本步時,若所有Finish[i]=true都滿足,則表示所有進程都按某個順序執行完了,系統處於安全狀態;否則,系統當前所處的資源分配狀態是不安全狀態。
百度百科-銀行家算法 https://baike.baidu.com/item/銀行家算法/1679781?fr=aladdin