死鎖

什麼是死鎖?

如果一個進程集合裏面的每個進程都在等待只能由這個集合中的其他一個進程(包括他自身)才能引發的事件,這種情況就是死鎖。

這個定義可能有點拗口,一個最簡單的例子就是有資源A和資源B,都是不可剝奪資源,現在進程C已經申請了資源A,進程D也申請了資源B,進程C接下來的操作需要用到資源B,而進程D恰好也在申請資源A,那麼就引發了死鎖。這個肯定每個人都看過了。然後套用回去定義:如果一個進程集合裏面(進程C和進程D)的每個進程(進程C和進程D)都在等待只能由這個集合中的其他一個進程(對於進程C,他在等進程D;對於進程D,他在等進程C)才能引發的事件(釋放相應資源)。

這裏的資源包括了軟的資源(代碼塊)和硬的資源(例如掃描儀)。資源一般可以分兩種:可剝奪資源(Preemptable)和不可剝奪資源(Nonpreemptable)。一般來說對於由可剝奪資源引起的死鎖可以由系統的重新分配資源來解決,所以一般來說大家說的死鎖都是由於不可剝奪資源所引起的。

產生死鎖的原因主要是:
(1) 因爲系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則
就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。

死鎖的四個必要條件

互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
循環等待條件(Circular wait):系統中若干進程組成環路,改環路中每個進程都在等待相鄰進程正佔用的資源。

處理死鎖的策略

1.忽略該問題。例如鴕鳥算法,該算法可以應用在極少發生死鎖的的情況下。爲什麼叫鴕鳥算法呢,因爲傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。
2.檢測死鎖並且恢復。
3.仔細地對資源進行動態分配,以避免死鎖。
4.通過破除死鎖四個必要條件之一,來防止死鎖產生。

發佈了24 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章