死鎖
編輯在并發計算中,死鎖是指某些實體組中的任何成員都無法繼續執行的任何情況,因為每個實體都在等待另一個成員(包括它自己)采取行動,例如發送消息,或者更常見的是釋放鎖。 死鎖是多處理系統、并行計算和分布式系統中的常見問題,因為在這些上下文中,系統通常使用軟件或硬件鎖來仲裁共享資源并實現進程同步。
在操作系統中,死鎖發生在進程或線程進入等待狀態時,因為請求的系統資源被另一個等待進程持有,而該等待進程又在等待另一個等待進程持有的資源。 如果一個進程因為它請求的資源正在被另一個本身正在等待的進程使用而無限期地無法改變它的狀態,那么系統就被稱為死鎖。
在通信系統中,死鎖的發生主要是由于信號丟失或損壞,而不是資源爭用。
死鎖的個別必要條件和共同充分條件
編輯只有在系統中同時出現以下所有情況時,才會出現資源死鎖情況:
- 互斥:至少一個資源必須以不可共享的模式持有; 也就是說,一次只有一個進程可以使用該資源。 否則,不會阻止進程在必要時使用資源。 在任何給定時刻,只有一個進程可以使用該資源。
- 持有并等待或資源持有:一個進程當前持有至少一種資源并請求其他進程持有的額外資源。
- 無搶占:資源只能由持有它的進程自愿釋放。
- 循環等待:每個進程都必須等待另一個進程持有的資源,而另一個進程又在等待xxx個進程釋放資源。 一般來說,有一組等待進程,P = {P1, P2, …, PN},這樣 P1 正在等待 P2 持有的資源,P2 正在等待 P3 持有的資源等等,直到 PN 等待 P1 持有的資源。
這四個條件被稱為 Coffman 條件,源自 Edward G. Coffman, Jr. 在 1971 年的一篇文章中對它們的首次描述。
雖然這些條件足以在單實例資源系統上產生死鎖,但它們僅表明在具有多個資源實例的系統上有可能發生死鎖。
死鎖處理
編輯大多數當前操作系統無法防止死鎖。 當死鎖發生時,不同的操作系統以不同的非標準方式對其作出響應。 大多數方法的工作原理是防止四種常見情況中的一種發生,尤其是第四種。 主要做法如下。
忽略死鎖
在這種方法中,假定永遠不會發生死鎖。 這也是鴕鳥算法的一個應用。 這種方法最初由 MINIX 和 UNIX 使用。 當死鎖發生的時間間隔很大并且每次造成的數據丟失是可以容忍的時候使用。
如果死鎖被正式證明永遠不會發生,則可以安全地忽略死鎖。 RTIC 框架就是一個例子。
檢測
在死鎖檢測下,允許死鎖發生。 然后檢查系統的狀態以檢測是否發生了死鎖并隨后對其進行了更正。 采用一種算法來跟蹤資源分配和進程狀態,它回滾并重新啟動一個或多個進程以消除檢測到的死鎖。 由于操作系統的資源調度程序已知每個進程已鎖定和/或當前請求的資源,因此很容易檢測到已經發生的死鎖。
檢測到死鎖后,可以使用以下方法之一進行更正:
- 進程終止:死鎖中涉及的一個或多個進程可能會被中止。 可以選擇中止死鎖中涉及的所有競爭進程。 這確保了死鎖的確定和快速解決。 但是代價很高,因為部分計算會丟失。 或者,可以選擇一次中止一個進程,直到解決死鎖。 這種方法的開銷很高,因為在每次中止之后,算法都必須確定系統是否仍處于死鎖狀態。 在選擇終止候選人時必須考慮幾個因素,例如流程的優先級和年齡。
- 資源搶占:分配給各個進程的資源可能會被依次搶占并分配給其他進程,直到死鎖被打破。
預防
死鎖預防通過防止四種科夫曼條件之一的發生來起作用。
- 去掉互斥條件意味著沒有進程w
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/198037/