什麼是死鎖?
操作系統中有若干進程併發執行,它們不斷申請、使用、釋放系統資源,雖然系統的進程協調、通信機構會對它們進行控制,但也可能出現若干進程都相互等待對方釋放資源才能繼續運行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,都會原地等待永遠不會發生的條件,系統處於停滯狀態,這就是死鎖。
產生的原因
- 因爲系統資源不足。
- 進程運行推進的順序不合適。
- 資源分配不當等。
產生死鎖的必要條件
- 互斥條件:一個資源每次只能被一個進程使用。
- 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
- 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
- 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
防止死鎖的辦法
- 多個線程需要相同的鎖時,保持加鎖順序一致。
- 設置加鎖時限,若一個線程沒有在給定的時限內成功獲得所有需要的鎖,則會進行回退並釋放所有已經獲得的鎖,然後等待一段隨機的時間再重試。
- 死鎖檢測,當線程 A 請求鎖失敗之後,會在記錄各個線程佔用了哪些鎖的小冊子中查找該鎖的佔有者(線程 B ),再遍歷線程 B 所佔用的鎖中是否包括線程 A 所佔用的鎖,從而可以判斷出當前這種狀態是否是死鎖。
已判斷死鎖之後該怎麼辦?
- 已發生死鎖的線程釋放所有鎖並回退,等待一段隨機時間之後再重新開始。
- 按照線程優先級,僅對幾個線程進行釋放鎖和回退操作。若線程都是平級的,則在發生死鎖的情況下,隨機對這些線程賦予不同的優先級。
(SAW:Game Over!)