標籤:作業系統之死結
死結(DeadLock)
死結的概念
所謂死結是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去,此時稱系統處於死結狀態或系統產生了死結,這些永遠在互相等待的進程稱為死結進程。
例如,如果線程A鎖住了記錄1並等待記錄2,而線程B鎖住了記錄2並等待記錄1,這樣兩個線程就發生了死結現象。
產生死結的原因
1. 因為系統資源不足。
2. 進程運行推進的順序不合適。
3. 資源分派不當等。
如果系統資源充足,進程的資源請求都能夠得到滿足,死結出現的可能性就很低,否則就會因爭奪有限的資源而陷入死結。其次,進程運行推進順序與速度不同,也可能產生死結。
死結產生的必要條件
1. 互斥條件: 一個資源每次只能被一個進程使用。
2. 請求與保持: 一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3. 不可剝奪(非搶佔): 進程已獲得的資源,在末使用完之前,不能強行剝奪。
4. 迴圈等待: 若干進程之間形成一種頭尾相接的迴圈等待資源關係。
這四個條件是死結的必要條件,只要系統發生死結,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死結。
死結的處理方法
預防死結
事先預防,破壞產生死結的四個必要條件之一。
-
摒棄“請求和保持”條件:進程在申請資源時,是一次性的。
摒棄“請求“:當進程來時,一次性分配所有的資源(如果系統滿足),這樣就不會再有”請求“了。
摒棄“保持“:只要有一個資源得不到分配,也不給這個進程分配其他的資源。
-
摒棄“不剝奪”條件:在這種方法中,進程是逐個提出對資源的要求的。如果一個進程,獲得了部分資源,但得不到其它資源,這時,它釋放自己所佔用的資源。
-
摒棄“環路等待”條件:把資源排序,當進程申請資源時,按序申請。
避免死結
事先預防,並不是破壞產生死結的四個必要條件,而是用某種方法去防止系統進入不安全狀態,目前在較完善的系統中,常用此方法。銀行家演算法
安全狀態:是指系統能按照某種進程順序(P1,P2,…Pn),來為每一個進程Pi分配其所需要的資源,直到滿足每個進程對資源的最大需求,使每個進程都可順利地完成。如果系統無法找到這樣一個安全序列,則稱系統處於不安全狀態。
檢測死結
並不事先採取任何限制性的措施,也不必檢查系統是否已經進入不安全區,此方法允許發生死結,關鍵是,發生死結了,系統可以通過檢測機構發現死結,並精確確定與死結有關的進程和資源,然後,採取適當措施,從系統中將已經發生的死結清除
解除死結
這是與檢測死結配套使用。當檢測到系統已經發生了死結,要將進程從死結狀態中解脫出來。常用的方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分派給已經處於阻塞狀態的進程,使之轉為就緒狀態,以繼續運行。
本文出自 “11408774” 部落格,請務必保留此出處http://11418774.blog.51cto.com/11408774/1831924
作業系統之死結