死锁

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


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

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

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

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

 預防 
380px|thumbnail|right|
(A) 兩個行程競爭一種資源，遵循先到先得的策略。

(B) 當兩個行程同時鎖定資源時，就會發生死鎖。

(C) 可以透過破壞鎖的對稱性來解決死鎖。

(D) 可以透過改變鎖的機構對稱性來防止死鎖。

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

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

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

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

 範例 
假設兩人正好面對面碰上對方：
死結：兩人互不相讓，都在等對方先讓開。
活結：兩人互相禮讓，卻恰巧站到同一側，再次讓開，又站到同一側，同樣的情況不斷重複下去導致雙方都無法通過。
 参见 
競爭危害

参考文献

Category:并发性
Category:程式錯誤
Category:软件异常
Category:分布式计算问题