作業系統(10)程序--死鎖概念;死鎖處理方法:死鎖預防、死鎖避免、銀行家演算法、死鎖檢測
文章目錄
1. 死鎖概念
死鎖是指:由於競爭資源或者通訊關係,兩個或更多執行緒在執行中出現,永遠相互等待只能由其他程序引發的事件。
- 死鎖示例
- 程序訪問資源的流程
在系統裡,存在各種型別的資源R1,R2,…,Rm:比方說CPU執行時間、記憶體空間、I/O裝置等。
- 資源分類
- 資源分配有向圖
描述資源和程序之間的分配和佔用關係
- 出現死鎖的必要條件
下圖4個條件都成立則可能出現死鎖
2. 死鎖處理方法
1. 死鎖預防
死鎖預防是指採用某種策略,限制併發程序對資源的請求,使系統在任何時刻都不滿足死鎖的必要條件。也就是說上節中的四個必要條件,有任何一個不滿足就可以。辦法有:
互斥:把互斥的共享資源封裝成可同時訪問
持有並等待:程序請求資源時,要求它不佔有任何其他資源,也就是它必須一次性申請到所有資源,這種方法會導致資源效率低。
非搶佔:如程序不能立即分配資源,則釋放已佔有的資源。也就是隻在能夠同時獲得所有需要資源時,才執行分配操作
迴圈等待:對資源進行排序,要求程序按順序請求資源
2. 死鎖避免
利用額外的先驗資訊,在分配資源時,判斷是否會出現死鎖,只在不會死鎖時分配資源。
- 系統資源分配的安全狀態
- 安全狀態與死鎖的關係
3. 銀行家演算法
-
背景
銀行家演算法是實現死鎖避免的一種方法,它的背景如下圖
-
資料結構(需要維護的資訊)
-
安全狀態判斷演算法
把現在可用的資源複製到work中,作為當前進行判斷的場所,在這個情況下,去判斷現有的這些資源是否能滿足當前所有程序的總的需求,能滿足,則說明是安全的。
-
演算法詳細步驟
-
演算法例項
假設初始狀態如下圖:
示例1:在上圖的初始狀態,如果T2請求R1和R3各一個資源,這個操作會允許麼?因為在上圖中,request[2][1](1)<Need[2][1](1), request[2][3](1)<Need[2][3](2),就可以轉到銀行家演算法的第2步,然後request[2][1]<work[1],request[2][3]<work[3]就進入銀行家演算法的第3步,然後進入下圖狀態
在上圖,依據安全狀態判斷演算法第二步的尋找執行緒,Need[2][3]<=work[3],分配一個R3資源給T2,這樣T2就可以正常執行完,然後將它的資源回收,進入下圖
在上圖中,會發現任何一個Need[i][j]<=work[j],假設將資源分配給T1,然後執行完T1,再回收資源,進入下圖
然後按照安全判斷演算法執行下去就發現此時的系統狀態是安全的。
所以T2請求R1和R3各一個資源這個操作會允許。
示例2:在上圖的初始狀態,如果T1請求R1和R3各一個資源,這個操作會允許麼?
因為在上圖中,request[1][1](1)<Need[1][1](1), request[1][3](1)<Need[1][3](2),就可以轉到銀行家演算法的第2步,然後request[1][1]<work[1],request[1][3]<work[3]就進入銀行家演算法的第3步,然後進入下圖狀態
依據安全判斷演算法,會發現四個執行緒的Need[i]>work,直接跳到第4步,判定系統不安全,也就是不允許這個操作
4. 死鎖檢測
- 死鎖檢測概念
不同於前面的死鎖預防和死鎖避免,死鎖檢測允許系統進入死鎖狀態,它所做的工作如下圖
- 死鎖檢測演算法
- 資料結構
- 檢測詳細步驟
- 資料結構
-
死鎖檢測演算法例項
示例1:
初始狀態如下
由上圖可以看出T0、T2執行緒沒有資源請求了,那就先讓這兩個執行緒執行完(先執行T0),並回收資源,得下圖
在上圖可以看到,當前可用資源是可以滿足其他執行緒繼續執行的,所以示例1沒有死鎖
示例2
初始狀態
由上圖可以看出,T0沒有資源請求,先執行完T0並回收資源,但這時就會發現只有B資源有一個例項,而剩餘的4個執行緒或需要A資源、或需要C資源,無法正常執行,也就是死鎖了
- 死鎖恢復-程序終止選擇
- 死鎖恢復-程序終止方式