文章目錄
- 一、死鎖概念
- 二、造成死鎖的條件
- 三、解決死鎖
- 1.死鎖防止
- 2.死鎖避免
- 3.死鎖檢測和恢復
- 3.1檢測
- 3.2恢復
一、死鎖概念
當執行緒A持有獨占鎖a,并嘗試去獲取獨占鎖b的同時,執行緒B持有獨占鎖b,并嘗試獲取獨占鎖a的情況下,就會發生AB兩個執行緒由于互相持有對方需要的鎖,而發生的阻塞現象,我們稱為死鎖,
二、造成死鎖的條件
造成死鎖必須達成的4個條件(原因):
- 互斥條件:一個資源每次只能被一個執行緒使用,
- 請求與保持條件:一個執行緒因請求資源而阻塞時,對已獲得的資源保持不放,
- 不剝奪條件:執行緒已獲得的資源,在未使用完之前,不能強行剝奪,
- 回圈等待條件:若干執行緒之間形成一種頭尾相接的回圈等待資源關系,
例子:
- 行程順序不當
- PV操作使用不妥
- 同類資源分配不均
- 對某些資源的使用未加限制
三、解決死鎖
- 死鎖防止
- 死鎖避免
- 死鎖檢測和恢復
1.死鎖防止
防止死鎖就是破壞造成死鎖的,若干條件中的任意一個,
- 互斥條件 —> 獨占鎖的特點之一,
- 請求與保持條件 —> 獨占鎖的特點之一,嘗試獲取鎖時并不會釋放已經持有的鎖
- 不剝奪條件 —> 獨占鎖的特點之一,
- 回圈等待條件 —> 唯一需要記憶的造成死鎖的條件,
在并發程式中,避免了邏輯中出現復數個執行緒互相持有對方執行緒所需要的獨占鎖的的情況,就可以防止死鎖,
2.死鎖避免
在程式運行時避免發生死鎖,
3.死鎖檢測和恢復
3.1檢測
不試圖阻止死鎖,而是當檢測到死鎖發生時,采取措施進行恢復,
- 如果行程 - 資源分配圖中無環路,此時系統沒有發生死鎖,
- 如果行程 - 資源分配圖中有環路,則可分為以下兩種情況:
- 每種資源類中僅有一個資源,則系統發生了死鎖,此時,環路是系統發生死鎖的充分必要條件,環路中的行程就是死鎖行程,
- 每種資源類中有多個資源,則環路的存在只是產生死鎖的必要不充分條件,系統未必會發生死鎖,
3.2恢復
-
資源剝奪法
剝奪陷于死鎖的行程所占用的資源,但并不撤銷此行程,直至死鎖解除, -
行程回退法
根據系統保存的檢查點讓所有的行程回退,直到足以解除死鎖,這種措施要求系統建立保存檢查點、回退及重啟機制, -
行程撤銷法
撤銷陷入死鎖的所有行程,解除死鎖,繼續運行,
逐個撤銷陷入死鎖的行程,回收其資源并重新分配,直至死鎖解除,
可選擇符合下面條件之一的先撤銷: 1.CPU消耗時間最少者 2.產生的輸出量最小者
3.預計剩余執行時間最長者 4.分得的資源數量最少者后優先級最低者 -
系統重啟法
結束所有行程的執行并重新啟動作業系統,這種方法很簡單,但先前的作業全部作廢,損失很大,
更多方案參考https://zhuanlan.zhihu.com/p/61221667
參考
https://www.jianshu.com/p/44125bb12ebf
https://zhuanlan.zhihu.com/p/61221667
本文鏈接https://blog.csdn.net/qq_39903567/article/details/115531838
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/274441.html
標籤:其他
