進程死鎖
死鎖的概念
死鎖(deadlock):一個進程集合中的每個進程都在等待只能由該集合中的其他一個進程才能引發的事件(釋放佔有資源/進行某項操作)
死鎖的形成條件
互斥 資源同一時間只能被一個進程擁有
佔有並等待 一個進程必須佔有至少一個資源,並等待另一個資源,而該資源爲其他進程佔有
非搶佔 進程不能被搶佔,資源只有被擁有資源的進程自願釋放
循環等待 若干進程之間形成頭尾相接的資源等待關係
死鎖的處理策略
預防死鎖,避免死鎖,檢測死鎖,解除死鎖,鴕鳥策略
死鎖預防
基本思想:使死鎖形成條件的一個或多個不成立
-
打破互斥條件,允許多進程同時訪問資源
-
打破佔有並等待條件 進程運行前申請所有需要資源(無需等待),不滿足則不運行,或者只允許進程不佔有資源時才能申請資源(不佔有) 很多情況下無法預知進程需要的所有資源,會降低資源利用率,降低進程併發性
-
打破非搶佔條件 允許進程強行從佔有者中奪取資源
-
打破循環等待 實行資源有序分配策略,對所有資源排序編號,所有進程對資源的請求必須嚴格按資源序號遞增的順序提出,只有佔有了小號資源才能申請大號資源
死鎖避免
基本思想動態檢測資源分配狀態,確保循環等待條件不成立,防止系統進入不安全狀態。
有兩種策略,一種是拒絕啓動進程策略,一種是拒絕資源請求策略
銀行家算法屬於拒絕資源請求策略
-
優點
比死鎖預防限制少
無須死鎖檢測中的資源剝奪和進程重啓 -
缺點
必須事先聲明每個進程請求的最大資源
考慮的進程必須是無關的,即它們執行的順序沒有任何同步要求的限制
分配的資源數目必須是固定的
在佔有資源時進程不能退出
死鎖檢測
死鎖檢測沒有任何預先限制措施(死鎖預防乾的事情),也不會在進程創建或資源分配時檢查系統是否會進入不安全狀態(死鎖避免乾的事情),而是週期性地檢查系統是否出現死鎖,出現死鎖後進行恢復
- 檢測方法
單個資源實例:檢測資源分配圖中是否存在環路(依據——死鎖定理)
多個資源實例:類似銀行家算法的安全檢查
鴕鳥策略
假設系統不會發生死鎖,在發生死鎖後手動解鎖,比如重啓電腦,殺進程。。。
死鎖解除
-
死鎖解除的策略
剝奪法:連續剝奪資源直到不再存在死鎖
回退法:把每個死鎖進程回滾到前面定義的檢查點,並且重新啓動所有進程,死鎖可能重現
殺死進程法:殺死所有死鎖進程,或連續殺死死鎖進程直到不再存在死鎖,或殺死一個非死鎖進程 -
考慮的問題
選擇犧牲品
回滾到安全狀態
飢餓狀態,避免一個進程多次作爲犧牲品* 死鎖解除的策略
剝奪法:連續剝奪資源直到不再存在死鎖
回退法:把每個死鎖進程回滾到前面定義的檢查點,並且重新啓動所有進程,死鎖可能重現
殺死進程法:殺死所有死鎖進程,或連續殺死死鎖進程直到不再存在死鎖,或殺死一個非死鎖進程 -
考慮的問題
選擇犧牲品
回滾到安全狀態
飢餓狀態,避免一個進程多次作爲犧牲品