死鎖發生的必要條件
當死鎖發生時,必然會滿足以下四個條件:
- Mutual Exclusion: 至少存在一個資源是無法共享的。
- Hold and Wait: 一個Thread握有資源且等待另一個被其他Thread使用的資源。
- No Preemption: 被掌握的資源無法被其他Thread搶佔。
- 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復原。 復原的方式有:
- 終止Process/Thread法
- 將所有發生Deadlock的Processes終止
- 一次將一個Processes終止,直到沒有Deadlock發生
- 資源搶佔法