一.什麼是死鎖?
死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源或不正確的進程間推進順序,而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去,此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。
二.死鎖產生的四個必要條件
雖然進程在運行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。
1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內,這一資源只由這一個進程佔用。如果此時還有其它進程請求該資源,則請求者只能等待,直至佔有該資源的進程用畢釋放。
2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求該資源,那麼進程被阻塞,但進程又對自己當前已獲得的其它資源保持不放。
3)不可剝奪條件:指進程已獲得的資源,在未使用完之前,不能被其他進程所剝奪,只能在使用完時,由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在一個環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
三.處理死鎖的方法
在系統中已經出現死鎖後,應該及時檢測到死鎖的發生,並採取適當的措施來解除死鎖。目前處理死鎖的方法可歸結爲以下四種:
1) 預防死鎖。
這是一種較簡單和直觀的事先預防法。方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防死鎖發生。
2) 避免死鎖。
該方法同樣是屬於事先預防的策略,但它並不是去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3)檢測死鎖。
允許死鎖的發生,但是通過系統的檢測之後,採取一些措施,將死鎖清除掉。
4)解除死鎖。
該方法與檢測死鎖配合使用。當檢測到系統中已發生死鎖時,需要將進程從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉爲就緒狀態,以便繼續運行。