1. 程式人生 > >Linux核心中的執行緒死鎖

Linux核心中的執行緒死鎖

一、死鎖的概念

    1.什麼是死鎖:

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

   2.死鎖的常見表現:

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

   (1)多程序死鎖:有程序A,程序B,程序A擁有資源1,需要請求正在被程序B佔有的資源2。而程序B擁有資源2,請求正在被程序A戰友的資源1。兩個程序都在等待對方釋放資源後請求該資源,而相互僵持,陷入死鎖。
   (2)單程序死鎖:程序A擁有資源1,而它又在請求資源1,而它所請求的資源1必須等待該資源使用完畢得到釋放後才可被請求。這樣,就陷入了自己的死鎖。

二、產生死鎖的原因及條件

   1.原因:

   (1)程序推進順序不當造成死鎖。
   (2)競爭不可搶佔性資源引起死鎖。
   (3)競爭可消耗性資源引起死鎖。

   2.產生死鎖的四個必要條件:

   (1) 互斥條件:一個資源每次只能被一個程序(執行緒)使用。
   (2) 請求與保持條件:一個程序(執行緒)因請求資源而阻塞時,對已獲得的資源保持不放。
   (3) 不剝奪條件 : 此程序(執行緒)已獲得的資源,在末使用完之前,不能強行剝奪。
   (4) 迴圈等待條件 : 多個程序(執行緒)之間形成一種頭尾相接的迴圈等待資源關係。

三、如何避免死鎖

   1..預防死鎖:這是一種較簡單和直觀的方法。該方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件中的一個或幾個,來預防發生死鎖。但由於所施加的限制條件往往太嚴格,因而會導致系統資源利用率和系統吞吐量低。

   2.避免死鎖:該方法同樣是屬於事先預防的策略,但它並不須事先採取各種限制措施去破壞產生死鎖的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。這種方法只需事先施加較弱的限制條件,便可獲得較高的資源利用率及系統吞吐量,但在事實上有一定的難度。目前在較完善的系統中常用此方法來避免發生死鎖。

   3. 檢測死鎖:

這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,而是允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時的檢測出死鎖的發生,並精確地確定與死鎖有關的執行緒和資源;然後採取適當措施,從系統中將已發生的死鎖清除掉。

   4.解除死鎖:這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將執行緒從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些執行緒,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的執行緒,是之轉為就緒狀態,以繼續執行。死鎖的檢測和解除措施有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。

四、常見演算法與原理

   銀行家演算法:

      避免死鎖演算法中最有代表性的演算法是Dijkstra E.W 於1968年提出的銀行家演算法:

      銀行家演算法是避免死鎖的一種重要方法,防止死鎖的機構只能確保上述四個條件之一不出現,則系統就不會發生死鎖。通過這個演算法可以用來解決生活中的實際問題,如銀行貸款等。
      程式實現思路銀行家演算法顧名思義是來源於銀行的借貸業務,一定數量的本金要應多個客戶的借貸週轉,為了防止銀行家資金無法週轉而倒閉,對每一筆貸款,必須考察其是否能限期歸還。在作業系統中研究資源分配策略時也有類似問題,系統中有限資源要供多個程序使用,必須保證得到的資源的程序能在有限的時間內歸還資源,以供其他程序使用資源。如果資源分配不得到就會發生程序迴圈等待資源,則程序都無法繼續執行下去的死鎖現象。
       把一個程序需要和已佔有資源的情況記錄在程序控制中,假定程序控制塊PCB其中“狀態”有就緒態、等待態和完成態。當程序在處於等待態時,表示系統不能滿足該程序當前的資源申請。“資源需求總量”表示程序在整個執行過程中總共要申請的資源量。顯然,每個程序的資源需求總量不能超過系統擁有的資源總數, 銀行家演算法進行資源分配可以避免死鎖