1. 產生死鎖的必要條件
- 互斥:任何時刻只能有一個進程使用一個資源實例。
- 持有並等待:進程保持至少一個資源,並正在等待獲取其他進程持有的資源。
- 非搶佔:資源只能在進程使用後自願釋放。
- 循環等待。
2. 處理方法
鴕鳥策略:把頭埋在沙子裏,假裝根本沒發生問題。
死鎖預防:確保系統永遠不會進入死鎖狀態。
- 破壞互斥條件:把互斥的共享資源封裝成可同時訪問。
- 破壞佔有和等待條件:進程請求資源時,要求它不持有任何其他資源;僅允許進程在開始執行時,一次請求所有需要的資源。
- 破壞不可搶佔條件:如進程請求不能立即分配的資源,則釋放已有佔有資源;只在能夠同時獲得所有所需資源時,才執行分配操作。
- 破壞環路等待:對資源排序,要求進程按順序請求資源。
死鎖避免:在使用前進行判斷,只允許不會出現死鎖的進程請求資源。
銀行家算法:
如果沒有死鎖發生,並且即使所有進程突然請求對資源的最大需求,也仍然存在某種調度次序能夠使得每一個進程運行完畢,則稱該狀態是安全的。如果一個狀態不是安全的,需要拒絕進入這個狀態。
死鎖檢測和恢復:在檢測到運行系統進入死鎖狀態後,進行恢復。
檢測:每種類型一個資源的死鎖檢測可採用有向圖環路檢測算法;每種類型多個資源的死鎖檢測採用基於矩陣的算法。
恢復:進程終止;資源搶佔;進程回退。