死結

死結的四個必要條件(four necessary conditions)

死結會讓人覺得神秘,直到你學會:除非四件特定的事同時成立,否則它根本不可能發生。把它想成火需要燃料、熱、氧氣三者俱全:拿掉任何一項,火就燒不起來。死結也一樣——它有四種「材料」,只要少了其中一種,死結就不可能出現。這是好消息,因為它把一種模糊的恐懼變成一張檢查清單:要讓死結不可能發生,只要保證有一種材料永遠不會出現即可。

這四個條件(有時稱為科夫曼條件,Coffman conditions)是:(1)互斥(mutual exclusion)——至少有一個資源以不可共享的方式被持有,一次只能有一個行程使用。(2)持有並等待(hold and wait)——行程被允許在等著取得更多資源的同時,繼續持有它已有的資源。(3)不可剝奪(no preemption)——資源不能被強行從行程手中奪走,必須由其自願釋放。(4)循環等待(circular wait)——存在一條等待鏈 P1、P2、……、Pn,其中每一個都在等下一個所持有的資源,而最後一個又在等第一個持有的資源,把環閉合起來。四者必須同時成立,死結才可能發生。

一個重要而誠實的細微之處:這四者是必要的,但一般而言並非充分的。對多實例資源,你可能四者全滿足卻仍未死結,因為某個多餘的實例可能解開那條鏈。只有在單一實例的情形下(此時循環等待恰好就是資源配置圖中的一個環)它們才保證充分。其實務威力在於反過來看:破壞四者中的任一個——否定互斥、禁止持有並等待、允許剝奪,或施加一個能消滅循環等待的次序——你就有了一套死結預防策略。

兩個執行緒各抓一把鎖再等對方的鎖:互斥(一把鎖被一個執行緒持有)、持有並等待(各持一把又等另一把)、不可剝奪(無法把已持有的鎖硬拔走)、循環等待(T1 等 T2、T2 等 T1)。四者俱全,因此死結是可能的。

同一個雙鎖卡死,拆解成讓它成為可能的四種材料。

四個條件是所有死結的必要條件,但僅在每種資源都只有單一實例時才充分;在多實例情形下,四者全成立仍可能沒有死結。

又称
Coffman conditions科夫曼條件死結四條件