關於 Deadlock


死鎖發生的必要條件

當死鎖發生時,必然會滿足以下四個條件:

  1. Mutual Exclusion: 至少存在一個資源是無法共享的。
  2. Hold and Wait: 一個Thread握有資源且等待另一個被其他Thread使用的資源。
  3. No Preemption: 被掌握的資源無法被其他Thread搶佔。
  4. Circular Wait: 將每個Thread指向等待的對象串聯起來,會存在至少一個圈循環。

Deadlock Prevention

讓至少一個必要條件不滿足,但通常造成Throughput降低。

針對 Mutual Exclusion

無法使其不滿足,因存在無法被共享的資源,必須要有互斥鎖。

針對 Hold and Wait

可以限制當Thread沒有握有任何資源時,才能請求一些資源並使用。當要請求額外資源時,必須先釋放目前所有的資源。 因為要等到所有資源取得時才開始,被占用的資源可能有好些時間沒有被實際使用,另外若需要需求高的資源,可能會使Thread發生starvation。

針對 Preemption

當Thread請求資源時,若此資源被其他Thread使用,則可讓自己的資源被搶佔。或是當Thread請求被其他Thread占用的資源且後者在等待自己需要的資源時,則前者可以搶佔後者的資源。

針對 Circular Wait

可將所有資源標上不同數字,當Thread請求資源時必須從數字小的開始請求,每次請求資源的數字要比前一次的數字大。如此一來,可以避免cycle的發生。

Deadlock Avoidance

Safe State

Safe state 是指當給定目前所有Thread握有的部份資源數量以及總需求數量,可以找到至少一種分配順序,讓每個Thread得到足夠的資源並釋放所有資源給其他Thread。 Deadlock Avoidance 是選定一個avoidance algorithm,使得Safe state可以總是被滿足。

Deadlock Detection

Deadlock Detection的方式是選定一個演算法可以檢測是否發生Deadlock以及選定一個演算法能將Deadlock復原。 復原的方式有:

  1. 終止Process/Thread法
    • 將所有發生Deadlock的Processes終止
    • 一次將一個Processes終止,直到沒有Deadlock發生
  2. 資源搶佔法

See also