死鎖的條件
互斥條件(Mutual exclusion) :資源不能被共享,只能由一個進程使用。
請求與保持條件(Hold and wait):進程已獲得了一些資源,但因請求其它資源被阻塞時,對已獲得的資源保持不放。
不可搶占條件(No pre-emption) :有些系統資源是不可搶占的,當某個進程已獲得這種資源后,系統不能強行收回,只能由進程使用完時自己釋放。
循環等待條件(Circular wait) :若干個進程形成環形鏈,每個都占用對方申請的下一個資源。
處理死鎖的策略
1、忽略該問題。例如鴕鳥算法。
2、檢測死鎖並且恢復。
3、仔細地對資源進行動態分配,以避免死鎖。
4、通過破除死鎖四個必要條件之一,來防止死鎖產生。
鴕鳥算法:
該算法可以應用在極少發生死鎖的的情況下。為什么叫鴕鳥算法呢,因為傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。
銀行家算法:
所謂銀行家算法,是指在分配資源之前先看清楚,資源分配后是否會導致系統死鎖。如果會死鎖,則不分配,否則就分配。
按照銀行家算法的思想,當進程請求資源時,系統將按如下原則分配系統資源:
(1) 當一個進程對資源的最大需求量不超過系統中的資源數時可以接納該進程。
(2) 進程可以分期請求資源,當請求的總數不能超過最大需求量。
(3) 當系統現有的資源不能滿足進程尚需資源數時,對進程的請求可以推遲分配,但總能使進程在有限的時間里得到資源。
(4) 當系統現有的資源能滿足進程尚需資源數時,必須測試系統現存的資源能否滿足該進程尚需的最大資源數,若能滿足則按當前的申請量分配資源,否則也要推遲分配。
解決死鎖的策略
對待死鎖的策略主要有:
(1) 死鎖預防:破壞導致死鎖必要條件中的任意一個就可以預防死鎖。例如,要求用戶申請資源時一次性申請所需要的全部資源,這就破壞了保持和等待條件;將資源分層,得到上一層資源后,才能夠申請下一層資源,它破壞了環路等待條件。預防通常會降低系統的效率。
(2) 死鎖避免:避免是指進程在每次申請資源時判斷這些操作是否安全,例如,使用銀行家算法。死鎖避免算法的執行會增加系統的開銷。
(3) 死鎖檢測:死鎖預防和避免都是事前措施,而死鎖的檢測則是判斷系統是否處於死鎖狀態,如果是,則執行死鎖解除策略。
(4) 死鎖解除:這是與死鎖檢測結合使用的,它使用的方式就是剝奪。即將某進程所擁有的資源強行收回,分配給其他的進程。
死鎖的避免:
死鎖的預防是通過破壞產生條件來阻止死鎖的產生,但這種方法破壞了系統的並行性和並發性。
死鎖產生的前三個條件是死鎖產生的必要條件,也就是說要產生死鎖必須具備的條件,而不是存在這3個條件就一定產生死鎖,那么只要在邏輯上回避了第四個條件就可以避免死鎖。
避免死鎖采用的是允許前三個條件存在,但通過合理的資源分配算法來確保永遠不會形成環形等待的封閉進程鏈,從而避免死鎖。該方法支持多個進程的並行執行,為了避免死鎖,系統動態的確定是否分配一個資源給請求的進程。方法如下:
1.如果一個進程的當前請求的資源會導致死鎖,系統拒絕啟動該進程;
2.如果一個資源的分配會導致下一步的死鎖,系統就拒絕本次的分配;
顯然要避免死鎖,必須事先知道系統擁有的資源數量及其屬性
