死結
死結(英語:deadlock),又譯為死鎖,電腦科學名詞。當兩個以上的運算單元,雙方都在等待對方停止執行,以取得系統資源,但是沒有一方提前退出時,就稱為死結[1]。在多工作業系統中,作業系統為了協調不同執行緒,能否取得系統資源時,為了讓系統正常運作,必須要解決這個問題。另一種相似的情況稱為「活結」。
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Process_deadlock.svg/220px-Process_deadlock.svg.png)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Deadlock_at_a_four-way-stop.gif/220px-Deadlock_at_a_four-way-stop.gif)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Two_processes%2C_two_resources.gif/220px-Two_processes%2C_two_resources.gif)
- 經過一個行程。
- 後面的行程需要等待。
- 當第一個行程鎖定第一個資源而第二個行程鎖定第二個資源時,就會發生死鎖。
- 可以透過取消並重新啟動第一個行程來解決死鎖
簡介
編輯例如,一個行程p1占用了顯示器,同時又必須使用印表機,而印表機被行程p2占用,p2又必須使用顯示器,這樣就形成了死結。 因為p1必須等待p2釋出印表機才能夠完成工作並釋出螢幕,同時p2也必須等待p1釋出顯示器才能完成工作並釋出印表機,形成循環等待的死結。
起因
編輯如果系統中只有一個行程,當然不會產生死結。如果每個行程僅需求一種系統資源,也不會產生死結。不過這只是理想狀態,在現實中是可遇不可求的。
死結的四個條件是:
- 禁止搶占(no preemption):系統資源不能被強制從一個行程中退出。
- 持有和等待(hold and wait):一個行程可以在等待時持有系統資源。
- 互斥(mutual exclusion):資源只能同時分配給一個行程,無法多個行程共享。
- 循環等待(circular waiting):一系列行程互相持有其他行程所需要的資源。
死結只有在四個條件同時滿足時發生,預防死結必須至少破壞其中一項。
預防
編輯系統也可以嘗試迴避死結。因為在理論上,死結總是可能產生的,所以作業系統嘗試監視所有行程,使其沒有死結。
消除
編輯最簡單的消除死結的辦法是重新啟動系統。更好的辦法是終止一個行程的執行。
同樣也可以把一個或多個行程轉返到先前的某個狀態。如果一個行程被多次轉返,遲遲不能占用必需的系統資源,可能會導致資源匱乏。
活結
編輯活結(livelock),與死結相似,死結是行程都在等待對方先釋放資源;活結則是行程彼此釋放資源又同時占用對方釋放的資源。當此情況持續發生時,儘管資源的狀態不斷改變,但每個行程都無法取得所需資源,使得事情沒有任何進展。
範例
編輯假設兩人正好面對面碰上對方:
- 死結:兩人互不相讓,都在等對方先讓開。
- 活結:兩人互相禮讓,卻恰巧站到同一側,再次讓開,又站到同一側,同樣的情況不斷重複下去導致雙方都無法通過。
參見
編輯參考文獻
編輯- ^ Coulouris, George. Distributed Systems Concepts and Design. Pearson. 2012: 716. ISBN 978-0-273-76059-7.