跳转到内容

死锁:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Tang891228留言 | 贡献
修正筆誤
{{For|尚未发行的电子游戏|死锁 (游戏)}}
 
(未显示18个用户的31个中间版本)
第1行: 第1行:
{{For|尚未发行的电子游戏|死锁 (游戏)}}
{{redirect|死結|有關繩結上的死結|單結}}
{{multiple issues|
{{multiple issues|
{{expand|time=2015-03-22T23:24:15+00:00}}
{{expand|time=2015-03-22T23:24:15+00:00}}
{{expert|time=2015-03-22T23:24:15+00:00}}
{{expert|time=2015-03-22T23:24:15+00:00}}
{{unreferenced|time=2015-03-22T23:24:15+00:00}}
{{Refimprove|time=2021-04-12T12:11:19+00:00}}
}}
}}
{{NoteTA
{{NoteTA
|G1 = IT
|G1 = IT
|1 = zh-hans:循环; zh-hant:循環;
}}
}}
[[File:Process deadlock.svg|thumb|right|P1、P2兩個process都需要資源才能繼續執行。P1擁有資源R2、還需要額外資源R1才能執行;P2擁有資源R1、還需要額外資源R2才能執行,兩邊都在互相等待而沒有任何一個可執行。]]
[[File:Process deadlock.svg|thumb|right|P1、P2兩個process都需要資源才能繼續執行。P1擁有資源R2、還需要額外資源R1才能執行;P2擁有資源R1、還需要額外資源R2才能執行,兩邊都在互相等待而沒有任何一個可執行。]]
[[File:Deadlock at a four-way-stop.gif|thumbnail|right|四個行程(藍線)競爭一種資源(灰色圓圈),遵循先右後左的策略。當所有行程同時鎖定資源(黑線)時,就會發生死鎖。可以透過打破對稱性來解決死鎖。]]
'''死锁'''({{lang-en|Deadlock}}),又譯為'''-{zh-cn:死结; zh-tw:死鎖;}-''',計算機科學名詞。當兩個以上的運算單元,雙方都在等待對方停止執行,以取得系統資源,但是沒有一方提前退出時,就稱為死結。在多工作業系統中,作業系統為了協調不同程,能否取得系統資源時,為了讓系統運作,必須要解決這個問題。


'''死锁'''({{lang-en|deadlock}}),又譯為'''-{zh-cn:死结; zh-tw:死鎖;}-''',計算機科學名詞。當兩個以上的運算單元,雙方都在等待對方停止執行,以取得系統資源,但是沒有一方提前退出時,就稱為死結<ref name=coulouris>{{cite book|last=Coulouris|first=George|publisher=Pearson|year=2012|title=Distributed Systems Concepts and Design|url=https://archive.org/details/distributedsyste0000coul_e0z4|page=[https://archive.org/details/distributedsyste0000coul_e0z4/page/716 716]|isbn=978-0-273-76059-7}}</ref>。在多工[[作業系統]]中,作業系統為了協調不同线程,能否取得系統資源時,為了讓系統正常運作,必須要解決這個問題。另一種相似的情況稱為「活锁」
这里指的是[[进程]]死锁,是个計算機技术名词。它是[[操作系统]]或软件运行的一种状态:在多工系統下,当一个或多个进程等待系统资源,而资源又被进程本身或其他进程占用时,就形成了死锁。有个变种叫[[活锁]]。

[[File:Two processes, two resources.gif|thumbnail|兩個行程以相反的順序競爭兩個資源。{{ordered list|style=margin-top:0.5em|list_style_type=upper-alpha
|經過一個行程。|後面的行程需要等待。
|當第一個行程鎖定第一個資源而第二個行程鎖定第二個資源時,就會發生死鎖。
|可以透過取消並重新啟動第一個行程來解決死鎖}}]]


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


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


死锁的四个条件是:
死锁的四个条件是:
*'''禁止[[搶占式多任務處理|抢占]]'''(no preemption):系統資源不能被强制从一个进程中退出


*'''持有和等待'''(hold and wait):一个进程可以在等待时持有系统资源
'''禁止抢占''' no preemption - 系統資源不能被强制从一个进程中退出


*'''[[互斥鎖|互斥]]'''(mutual exclusion):資源只能同時分配給一個行程,無法多個行程共用。
'''持有和等待''' hold and wait - 一个进程可以在等待时持有系统资源


'''互斥''' mutual exclusion - 只有进程持有一个资源
*'''循环等待'''(circular waiting):系列进程互相持有其他进程所需要的资源


死锁只有在四个条件同时满足时發生,预防死锁必須至少破坏其中一項。
'''循环等待''' circular waiting - 一系列进程互相持有其他进程所需要的资源


== 預防 ==
死锁只有在这四个条件同时满足时出现。预防死锁就是至少破坏这四个条件其中一項,即破坏“禁止抢占”、破坏“持有等待”、破坏“资源互斥”和破坏“循环等待”。
[[File:Avoiding deadlock.gif|380px|thumbnail|right|
(A) 兩個行程競爭一種資源,遵循先到先得的策略。


(B) 當兩個行程同時鎖定資源時,就會發生死鎖。
== 死锁的避免 ==
我们也可以尝试回避死锁。因为在理论上,死锁总是可能产生的,所以操作系统尝试监视所有进程,使其没有死锁。


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

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

]]

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

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


同样也可以把一个或多个进程回滚到先前的某个状态。如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致{{tsl|en|Starvation (computer science)|进程饥饿}}
同样也可以把一个或多个进程回滚到先前的某个状态。如果一个进程被多次回滚,迟迟不能占用必需的系统资源,可能会导致[[饥饿_(操作系统)|资源匮乏]]

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


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


== 外部連結 ==
==参考文献==
{{reflist}}


{{compu-stub}}
{{并发计算}}


[[Category:操作系統技術]]
[[Category:并发性]]
[[Category:協同控制]]
[[Category:程式錯誤]]
[[Category:程式錯誤]]
[[Category:软件异常]]
[[Category:分布式计算问题]]

2024年9月16日 (一) 10:27的最新版本

P1、P2兩個process都需要資源才能繼續執行。P1擁有資源R2、還需要額外資源R1才能執行;P2擁有資源R1、還需要額外資源R2才能執行,兩邊都在互相等待而沒有任何一個可執行。
四個行程(藍線)競爭一種資源(灰色圓圈),遵循先右後左的策略。當所有行程同時鎖定資源(黑線)時,就會發生死鎖。可以透過打破對稱性來解決死鎖。

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

兩個行程以相反的順序競爭兩個資源。
  1. 經過一個行程。
  2. 後面的行程需要等待。
  3. 當第一個行程鎖定第一個資源而第二個行程鎖定第二個資源時,就會發生死鎖。
  4. 可以透過取消並重新啟動第一個行程來解決死鎖

简介

[编辑]

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

起因

[编辑]

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

死锁的四个条件是:

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

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

預防

[编辑]
(A) 兩個行程競爭一種資源,遵循先到先得的策略。 (B) 當兩個行程同時鎖定資源時,就會發生死鎖。 (C) 可以透過破壞鎖的對稱性來解決死鎖。 (D) 可以透過改變鎖的機構對稱性來防止死鎖。

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

消除

[编辑]

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

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

活結

[编辑]

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

範例

[编辑]

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

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

参见

[编辑]

参考文献

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