求真百科歡迎當事人提供第一手真實資料,洗刷冤屈,終結網路霸凌。

死鎖檢視原始碼討論檢視歷史

事實揭露 揭密真相
前往: 導覽搜尋

來自 搜狐網 的圖片

死鎖是一個科技名詞。

現代漢字是指楷化後的漢字[1]正楷字形,包括繁體字和簡體字。現代漢字即從甲骨文、金文[2]、籀文、篆書,至隸書、草書、楷書、行書等演變而來。漢字為漢民族先民發明創製並作改進,是維繫漢族各方言區不可或缺的紐帶。現存最早可識的漢字是約公元前1300年殷商的甲骨文和稍後的金文, 再到秦朝的小篆 和隸書, 至漢魏隸書盛行,到了漢末隸書楷化為正楷,盛行於魏晉南北朝,至今通行。

名詞解釋

死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。

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

一種情形,此時執行程序中兩個或多個進程發生永久堵塞(等待),每個進程都在等待被其他進程占用並堵塞了的資源。例如,如果進程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. 中華優秀傳統文化——漢字,搜狐,2022-03-30
  2. 華夏古漢字《金文》,搜狐,2022-03-01