Linux下的死鎖

2021-08-01 18:09:06 字數 2104 閱讀 3779

死鎖 (deallocks): 是指兩個或兩個以上的程序(執行緒)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序(執行緒)稱為死鎖程序(執行緒)。 由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序(執行緒)在無外力協助下,永遠分配不到必需的資源而無法繼續執行,這就產生了一種特殊現象死鎖。

一種交叉持鎖死鎖的情形,此時執行程式中兩個或多個執行緒發生永久堵塞(等待),每個執行緒都在等待被其它執行緒占用並堵塞了的資源。例如,如果執行緒 1 鎖住了記錄 a 並等待記錄 b,而執行緒 2 鎖住了記錄 b 並等待記錄 a,這樣兩個執行緒就發生了死鎖現象。在計算機系統中 , 如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。

產生死鎖的四個必要條件

(1) 互斥條件:乙個資源每次只能被乙個程序(執行緒)使用。

(2) 請求與保持條件:乙個程序(執行緒)因請求資源而阻塞時,對已獲得的資源保持不放。

(3) 不剝奪條件 : 此程序(執行緒)已獲得的資源,在末使用完之前,不能強行剝奪。

(4) 迴圈等待條件 : 多個程序(執行緒)之間形成一種頭尾相接的迴圈等待資源關係。

處理死鎖的方法

由於死鎖狀態的出現會給整個系統帶來嚴重的後果,所以如何解決死鎖問題引起了人們的普遍關注。目前常用的方法有以下三種:

(1)預防死鎖

為了使系統中不發生死鎖現象,在系統設計初期即選取擇一些限制條件,來破壞產生死鎖的四個必要條件之一或其中幾個。這樣,系統中就不會出現死鎖現象。這種方法對預防死鎖的發生非常有效,但有可能降低系統資源的利用率。

(2)避免死鎖

由於一方面預防死鎖的方法會降低系統資源利用率,另一方面死鎖的必要條件是存在示必就一定會使系統發生死鎖,因此為提高系統資源的利用率,可採用避免死鎖。避免死鎖並不嚴格限制死鎖必要條件的存在,而是在資源的動態分配過程中,使用某種方法去防止系統進入不安全狀態,從而避免死鎖的緊終出現。

(3)檢測和解除死鎖

由於死鎖產生的概率總是比較小的,所以在一些相對簡單的系統中,為節省預防或避免死鎖中所增加的系統開銷,系統中允許出現死鎖狀態。在這種系統中,專門設定了乙個檢測機構,可以隨時檢測出死鎖的發生,並能確定與死鎖有關的程序和資源,然後採用適當的方法解除系統中的死鎖狀態。

常用的解除死鎖的方法有兩種:一是強制性地撤銷一些死鎖程序,並剝奪它們的資源給其他的時程;另一種是使用乙個有效的掛起和解除掛起機構來掛起一些程序,以便從被掛起程序中剝奪一些資源,用來解除死鎖。

預防死鎖

(1)打破「請求和保持」條件

打破「請求和保持」條件,即把程序執行中所要求的所有資源在程序開始動行之前,一次性地分配給程序,只要有一種資源不能滿足,該程序就必須等待。這樣,程序在執行過程中就不再需要新的資源,這種方法又稱為預先靜態分配法。

(2)打破「不剝奪」條件

打破「不剝奪」條件,即強迫那些請求新資源而沒有立即得到滿足的程序釋放它已保持的其他資源。這意味著乙個程序在執行過程可以暫時釋放已占有的資源,即允許其他程序剝奪使用該資源,從而破壞了「不剝奪」條件的出現。

(3)打破「環路等待」條件

死鎖產生時,一定存在一種程序和資源的迴圈鏈。打破「環路等待」條件就是在資源的分配過程中,對資源的請求做出某種限制,使環路不可能出現。

避免死鎖的演算法有-----銀行家演算法

銀行家演算法是避免死鎖的一種重要方法,防止死鎖的機構只能確保上述四個條件之一不出現,則系統就不會發生死鎖。通過這個演算法可以用來解決生活中的實際問題,如銀行貸款等。

程式實現思路銀行家演算法顧名思義是**於銀行的借貸業務,一定數量的本金要應多個客戶的借貸周轉,為了防止銀行家資金無法周轉而倒閉,對每一筆貸款,必須考察其是否能限期歸還。在作業系統中研究資源分配策略時也有類似問題,系統中有限的資源要供多個程序使用,必須保證得到的資源的程序能在有限的時間內歸還資源,以供其他程序使用資源。如果資源分配不得到就會發生程序迴圈等待資源,則程序都無法繼續執行下去的死鎖現象。

把乙個程序需要和已占有資源的情況記錄在程序控制中,假定程序控制塊pcb其中"狀態"有就緒態、等待態和完成態。當程序在處於等待態時,表示系統不能滿足該程序當前的資源申請。"資源需求總量"表示程序在整個執行過程中總共要申請的資源量。顯然,每個程序的資源需求總量不能超過系統擁有的資源總數, 銀行演算法進行資源分配可以避免死鎖。

演算法詳細解析:

Linux死鎖學習(下)

傳說中鴕鳥看到危險就把頭埋在地底下。當你對某一件事情沒有乙個很好的解決方法時,那就忽略它,就像鴕鳥面對危險時會把它深埋在沙礫中,裝作看不到。這樣的演算法稱為 鴕鳥演算法 在針對死鎖問題時 鴕鳥演算法就是忽略死鎖,不去處理死鎖。鴕鳥演算法可以稱之為不是辦法的辦法。在電腦科學中,鴕鳥演算法是解決潛在問題...

linux多執行緒下之死鎖

出現死鎖需要同時滿足四個條件,有乙個不具備,系統就不會出現死鎖。互斥條件。即某個資源在一段時間內只能由乙個程序占有,不能同時被兩個或兩個以上的程序占有。這種獨佔資源如cd rom驅動器,印表機等等,必須在占有該資源的程序主動釋放它之後,其它程序才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就...

Linux 死鎖例子

死鎖是在編寫多執行緒併發時候所需要考慮的問題,在多執行緒軟體使用多個互斥鎖來保護共享資源時,如果設計不合理會出現多個鎖相互巢狀並且都在等待彼此的鎖被釋放,這樣就會出現死鎖現象,讓系統掛起一直相互等待下去。下面給個例子說明這一現象 標頭檔案 include include include includ...