1.死鎖的定義
由於競爭資源或者通信關係,兩個或者多個線程在執行中出現,永遠相互等待只能有其他進程發起的事件。
可重用資源:資源不可以被刪除且在任何時刻只能有一個進程使用、進程釋放資源後、其他資源可重用
硬件:處理器、I/O通道、主婦存儲器、設備等
軟件:文件、數據庫和信號量等數據結構
可能出現死鎖
消耗資源:資源創建和銷燬。
在I/O緩衝區的中斷、信號和消息
可能出現死鎖
2.出現死鎖的必要條件
互斥:任何時刻只能有一個進程使用一個資源實例。
持有並等待:進程保持持有至少一個資源,並正在等待獲取其他進程保持的資源。
非搶佔:資源只有在進程使用後自願放棄
循環等待:
3.死鎖處理方法
3.1 死鎖預防:保證系統永遠不會進入死鎖狀態
1)互斥
把互斥的共享資源封裝成可同時訪問
2)持有並等待
進程請求資源時,要求它不持有任何其他資源
僅允許進程在開始執行時,一次請求所有需要的資源
資源利用效率太低
3)非搶佔
如果進程請求不能立即分配資源,則釋放已佔有資源
只有在能夠同時獲得所有需要資源時,才執行分配操作
4)循環等待
對資源排序,要求進程按順序請求資源
3.2 死鎖避免:在使用之前進行檢測,只允許不會出現死鎖的進程請求資源
銀行家算法:死鎖避免的方法
基本思路:我當前的剩餘資源能夠滿足某個進程或者線程未來的需要,並且這種迭代到最後能夠滿足所有線程的需要。
eg:
第一步:當前最大需求矩陣內沒有一個進程大於系統資源向量即可以繼續往下,然後減去已經分配的資源矩陣後得到當前資源請求矩陣與當前可用資源向量,我們發現當前可用資源能夠支持T2運行並回收T2。
第二步:剩下的資源可以支持T1運行,運行完成後回收。。。。直到收回所有的資源爲止。
3.3 死鎖檢測和恢復:在檢測到運行系統進入死鎖狀態,進行恢復
死鎖檢測:允許系統進入死鎖、維護系統的資源分配圖、定期調用死鎖檢測算法來搜索圖中是否存在死鎖、出現死鎖時,用死鎖恢復機制進行恢復。
死鎖檢測算法:
eg:如圖所示我們可以看到通過第一個和第二個矩陣可以看到,T0和T2是可以執行完畢並回收的,當前可用資源數就會增加,直到所有的finish都爲true
死鎖檢測算法的使用:
死鎖恢復:進程終止、資源搶佔
進程的優先級越小、已經運行時間越短的進程越容易被終止。批處理通常優先被禁止。