什麼是死鎖有什麼處理及排除方法

  死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,那麼你對死鎖瞭解多少呢?以下是由小編整理關於什麼是死鎖,希望大家喜歡!

  死鎖的定義

  死鎖的規範定義:集合中的每一個程序都在等待只能由本集合中的其他程序才能引發的事件,那麼該組程序是死鎖的。

  一種情形,此時執行程式中兩個或多個執行緒發生永久堵塞***等待***,每個執行緒都在等待被其他執行緒佔用並堵塞了的資源。例如,如果執行緒A鎖住了記錄1並等待記錄2,而執行緒B鎖住了記錄2並等待記錄1,這樣兩個執行緒就發生了死鎖現象。

  計算機系統中,如果系統的資源分配策略不當,更常見的可能是程式設計師寫的程式有錯誤等,則會導致程序因競爭資源不當而產生死鎖的現象。

  在兩個或多個任務中,如果每個任務鎖定了其他任務試圖鎖定的資源,此時會造成這些任務永久阻塞,從而出現死鎖。例如:事務A 獲取了行 1 的共享鎖。事務 B 獲取了行 2 的共享鎖。

  排他鎖,等待事務 B 完成並釋放其對行 2 持有的共享鎖之前被阻塞。

  排他鎖,等待事務 A 完成並釋放其對行 1 持有的共享鎖之前被阻塞。

  事務 B 完成之後事務 A 才能完成,但是事務 B 由事務 A 阻塞。該條件也稱為迴圈依賴關係:事務 A 依賴於事務 B,事務 B 通過對事務 A 的依賴關係關閉迴圈。

  除非某個外部程序斷開死鎖,否則死鎖中的兩個事務都將無限期等待下去。Microsoft SQL Server 資料庫引擎死鎖監視器定期檢查陷入死鎖的任務。如果監視器檢測到迴圈依賴關係,將選擇其中一個任務作為犧牲品,然後終止其事務並提示錯誤。這樣,其他任務就可以完成其事務。對於事務以錯誤終止的應用程式,它還可以重試該事務,但通常要等到與它一起陷入死鎖的其他事務完成後執行。

  在應用程式中使用特定編碼約定可以減少應用程式導致死鎖的機會。有關詳細資訊,請參閱將死鎖減至最少。

  死鎖經常與正常阻塞混淆。事務請求被其他事務鎖定的資源的鎖時,發出請求的事務一直等到該鎖被釋放。預設情況下,除非設定了 LOCK_TIMEOUT,否則 SQL Server 事務不會超時。因為發出請求的事務未執行任何操作來阻塞擁有鎖的事務,所以該事務是被阻塞,而不是陷入了死鎖。最後,擁有鎖的事務將完成並釋放鎖,然後發出請求底事務將獲取鎖並繼續執行。

  死鎖有時稱為抱死。

  不只是關係資料庫管理系統,任何多執行緒系統上都會發生死鎖,並且對於資料庫物件的鎖之外的資源也會發生死鎖。例如,多執行緒作業系統中的一個執行緒要獲取一個或多個資源***例如,記憶體塊***。如果要獲取的資源當前為另一執行緒所擁有,則第一個執行緒可能必須等待擁有執行緒釋放目標資源。這就是說,對於該特定資源,等待執行緒依賴於擁有執行緒。在資料庫引擎例項中,當獲取非資料庫資源***例如,記憶體或執行緒***時,會話會死鎖。

  在示例中,對於 Part表鎖資源,事務 T1 依賴於事務 T2。同樣,對於 Supplier表鎖資源,事務 T2 依賴於事務 T1。因為這些依賴關係形成了一個迴圈,所以在事務 T1 和事務 T2 之間存在死鎖。

  當表進行了分割槽並且 ALTER TABLE 的 LOCK_ESCALATION 設定設為 AUTO 時也會發生死鎖。當 LOCK_ESCALATION 設為 AUTO 時,通過允許資料庫引擎在 HoBT 級別而不是 TABLE 級別鎖定表分割槽會增加併發情況。但是,當單獨的事務在某個表中持有分割槽鎖並希望在其他事務分割槽上的某處持有鎖時,會導致發生死鎖。通過將 LOCK_ESCALATION 設為 TABLE 可以避免這種型別的死鎖,但此設定會因強制某個分割槽的大量更新以等待某個表鎖而減少併發情況。

  死鎖產生條件

  雖然程序在執行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。

  1***互斥條件:指程序對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個程序佔用。如果此時還有其它程序請***,則請求者只能等待,直至佔有資源的程序用畢釋放。

  2***請求和保持條件:指程序已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它程序佔有,此時請求程序阻塞,但又對自己已獲得的其它資源保持不放。

  3***不剝奪條件:指程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

  4***環路等待條件:指在發生死鎖時,必然存在一個程序——資源的環形鏈,即程序集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。

  死鎖產生原因

  1***競爭資源引起程序死鎖

  當系統中供多個程序共享的資源如印表機、公用佇列的等,其數目不足以滿足諸程序的需要時,會引起諸程序對資源的競爭而產生死鎖。

  2***可剝奪資源和不可剝奪資源

  系統中的資源可以分為兩類,一類是可剝奪資源,是指某程序在獲得這類資源後,該資源可以再被其他程序或系統剝奪。例如,優先權高的程序可以剝奪優先權低的程序的處理機。又如,記憶體區可由儲存器管理程式,把一個程序從一個儲存區移到另一個儲存區,此即剝奪了該程序原來佔有的儲存區,甚至可將一程序從記憶體調到外存上,可見,CPU和主存均屬於可剝奪性資源。另一類資源是不可剝奪資源,當系統把這類資源分配給某程序後,再不能強行收回,只能在程序用完後自行釋放,如磁帶機、印表機等。

  3***競爭不可剝奪資源

  在系統中所配置的不可剝奪資源,由於它們的數量不能滿足諸程序執行的需要,會使程序在執行過程中,因爭奪這些資源而陷於僵局。例如,系統中只有一臺印表機R1和一臺磁帶機R2,可供程序P1和P2共享。假定PI已佔用了印表機R1,P2已佔用了磁帶機R2,若P2繼續要求印表機R1,P2將阻塞;P1若又要求磁帶機,P1也將阻塞。於是,在P1和P2之間就形成了僵局,兩個程序都在等待對方釋放自己所需要的資源,但是它們又都因不能繼續獲得自己所需要的資源而不能繼續推進,從而也不能釋放自己所佔有的資源,以致進入死鎖狀態。

>>>下一頁更多有關“死鎖產生原因”內容