作業系統-程序(7)死鎖和銀行家演算法
阿新 • • 發佈:2018-12-09
允許多個程序併發執行共享系統資源時,系統必須提供同步機制和程序通訊機制。然而,對這種機制使用不當的話,可能會出現程序永遠被阻塞的現象。例如,兩個程序分別等待對方佔有的一個資源,於是兩者都不能執行而處於永遠等待,這種現象稱為死鎖。
死鎖產生的四個必要條件:
死鎖檢測程式定時檢測這兩張表,若有程序Pi等待資源R,且資源R被程序Pj佔用,則說Pi和Pj具有“等待佔用關係”,記為W(Pi, Pj)
死鎖檢測程式反覆檢測這兩張表,可以列出所有的“等待佔用關係”
如果出現W(Pi, Pj)、W(Pj, Pt)、……、W(Pm, Pn)、W(Pn, Pi)時,系統中存在一組迴圈等待資源的程序,也就是說出現了死鎖
把兩張表格中記錄的程序使用和等待資源的情況用一個矩陣A來表示
死鎖檢測程式可用Warshall的傳遞閉包演算法檢測是否有死鎖發生,該演算法通過動態規劃將問題分段,R(k)矩陣只允許路徑中包含前k個頂點作為中間頂點,通過一系列n階矩陣R(k)來構造最終階段n階傳遞閉包矩陣R(n),即R(k)由它的前趨R(k-1)計算得到。
- 互斥條件: 程序應互斥使用資源,任一時刻一個資源僅為一個程序獨佔
- 佔有和等待條件: 一個程序請求資源得不到滿足而等待時,不釋放已佔有的資源
- 不剝奪條件: 任一程序不能從另一程序那裡搶奪資源
- 迴圈等待條件: 存在一個迴圈等待鏈,每一個程序分別等待它前一個程序所持有的資源
for也可以用類似銀行間演算法的方法檢測死鎖的存在。最後留在程序集合中的程序就是處於死鎖中的程序。 檢測出死鎖後,解除系統死鎖的方法主要有: (1)結束所有程序的執行並重新啟動作業系統 (2)撤銷陷入死鎖的所有程序,解除死鎖,繼續執行 (3)逐個撤銷陷入死鎖的程序,回收其資源並重新分派,直至死鎖解除。先撤銷的程序可以選擇CPU消耗時間最少者、產生的輸出量最少者、預計剩餘執行時間最長者、分得的資源數量最少者、優先順序最低者 (4)剝奪陷入死鎖的程序所佔用的資源,但不撤銷程序,直到死鎖解除 (5)根據系統儲存的檢查點讓所有程序回退,直到足以解除死鎖(要求系統建立儲存檢查點、回退、重啟機制)k:=1 to n do for i:=1 to n do for j:=1 to n do bij:= bij ∨ (bik ∧ bkj)