死鎖
引發死鎖的條件:
必須滿足以下四種條件
1,互斥條件,每個資源要么已經分配給一個進程,要么就是可用的。
2,占有等待條件,已經得到了某個資源的進程可以再請求新的資源
3,不可搶占條件,已經分配給一個進程的資源不能強制的被搶占,只能被占有他的進程顯示的釋放
4,環路等待條件,死鎖發生時,系統中一定有兩個或者兩個以上的進程組成一環路,該環路中的每一個
進程都在等待下一個進程占有的資源。
處理死鎖的策略:
1,忽略該問題,你忽略它,它也會忽略你
2,測試死鎖并恢復,讓死鎖發生,檢測,一旦檢測到,恢復
3,仔細對資源進行分配,動態避免死鎖
4,通過破壞四個死鎖條件之一
方法一對應的時鴕鳥算法,就是出現這種死鎖的可能性很低,比如操作系統的fork,可能5年出現一次,
而在這段過程中,因為硬件等其它原因肯定要重新啟動機器,放棄fork損失太大,就可以忽略這種死鎖
,象鴕鳥一樣,把頭埋進沙子,當什么都沒發生。
方法二:檢測并恢復
恢復方法有:
?搶占恢復
?回退恢復
?殺死進程恢復
銀行家算法:
如果有4個人(A,B,C,D)去銀行貸款,銀行有金額10個單位,
A貸款最大為6 ,A已經貸款1
B貸款最大為5 ,B已經貸款1
C貸款最大為4 ,C已經貸款2
D貸款最大為7 ,D已經貸款4
這個時候只有C的請求能通過,因為現在還有可用貸款2,只有C才能完成,然后釋放更多,來讓其它完成
這個時候如果給其它任何一個單位的貸款,那么所有的人都不能達到需求,完成。
銀行家問題時個經典的問題,但是很少能得到實際的利用,因為每個客戶自己都不知道自己需要多少資
源,同時,也不知道有多少個客戶。因為不停的有用戶login ,logout
方法四:破壞條件
1,破壞互斥條件,不讓獨占出現,
例如不讓一個用戶獨占打印機,如spooling技術,讓多個用戶同時進入spooling
問題:可能在spooling中產生死鎖
2,破壞占有等待條件
檢測這個進程需要的所有資源是不是可用,如果可用分配,不可用的話就等待
問題:進程要在開始知道自己需要多少資源,這樣可以使用銀行家算法完成。
但是資源利用不是最優。
3,破壞不可搶占,這個實現起來最困難
4,破壞閉環
把所有資源編號,按照順序請求
饑餓:
與死鎖很接近的時饑餓
如果一個打印機的使用,是通過某種算法避免死鎖,但是每次都是最小文件先打印,這樣就可能產生一
種情況,大的文件永遠不能打印,饑餓而死。
posted on 2006-09-20 21:29 dreamstone 閱讀(714) 評論(1) 編輯 收藏 所屬分類: 基礎