死锁

(重定向自死結

死锁(英語:deadlock),又譯為死结,計算機科學名詞。當兩個以上的運算單元,雙方都在等待對方停止執行,以取得系統資源,但是沒有一方提前退出時,就稱為死結[1]。在多工作業系統中,作業系統為了協調不同线程,能否取得系統資源時,為了讓系統正常運作,必須要解決這個問題。另一種相似的情況稱為「活锁」。

P1、P2兩個process都需要資源才能繼續執行。P1擁有資源R2、還需要額外資源R1才能執行;P2擁有資源R1、還需要額外資源R2才能執行,兩邊都在互相等待而沒有任何一個可執行。

简介 编辑

例如,一个进程 p1占用了显示器,同时又必须使用打印机,而打印机被进程p2占用,p2又必须使用显示器,这样就形成了死锁。 因為p1必須等待p2釋出打印機才能夠完成工作並釋出螢幕,同時p2也必須等待p1釋出顯示器才能完成工作並釋出打印機,形成循環等待的死結。

起因 编辑

如果系统中只有一个进程,当然不会产生死锁。如果每个进程仅需求一种系统资源,也不会产生死锁。不过这只是理想状态,在现实中是可遇不可求的。

死锁的四个条件是:

  • 禁止抢占(no preemption):系統資源不能被强制从一个进程中退出。
  • 持有和等待(hold and wait):一个进程可以在等待时持有系统资源。
  • 互斥(mutual exclusion):資源只能同時分配給一個行程,無法多個行程共用。
  • 循环等待(circular waiting):一系列进程互相持有其他进程所需要的资源。

死锁只有在四个条件同时满足时發生,预防死锁必須至少破坏其中一項。

預防 编辑

系統也可以尝试回避死锁。因为在理论上,死锁总是可能产生的,所以操作系统尝试监视所有进程,使其没有死锁。

消除 编辑

最简单的消除死锁的办法是重启系统。更好的办法是终止一个进程的运行。

同样也可以把一个或多个进程回滚到先前的某个状态。如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致资源匮乏

活結 编辑

活結livelock),與死結相似,死結是行程都在等待對方先釋放資源;活結則是行程彼此釋放資源又同時占用對方釋放的資源。當此情況持續發生時,儘管資源的狀態不斷改變,但每個行程都無法取得所需資源,使得事情沒有任何進展。

範例 编辑

假設兩人正好面對面碰上對方:

  • 死結:兩人互不相讓,都在等對方先讓開。
  • 活結:兩人互相禮讓,卻恰巧站到同一側,再次讓開,又站到同一側,同樣的情況不斷重複下去導致雙方都無法通過。

参见 编辑

参考文献 编辑

  1. ^ Coulouris, George. Distributed Systems Concepts and Design. Pearson. 2012: 716. ISBN 978-0-273-76059-7.