【轉】死鎖的產生條件和解決策略

死鎖的產生條件和解決策略

1.死鎖的產生條件

(1)互斥條件(mutual exclusion):資源不能被共享,只能由一個進程使用;算法

(2)請求與保持條件(hold and wait):進程已得到了一部分資源,但因請求其它資源被阻塞時,對已得到的資源保持不放;併發

(3)不可搶佔條件(no pre-emption):有些系統資源是不可搶佔的,當某個進程已得到這種資源後,系統不能強行收回,只能進程使用完時本身釋放;測試

(4)循環等待條件(circular wait):若干個進程造成環形鏈,每一個都佔用對方申請的下一個資源。spa

本身總結:有我的很霸道,拿了東西就不願還(請求保持),別人還不能搶(不可搶),又不願和別人共享(互斥),形成了死循環(循環等待)。.net

 

2.解決死鎖的策略

(1)死鎖預防blog

  破壞致使死鎖必要條件中的任意一個就能夠預防死鎖,但這種方法破壞了系統的並行性和併發性。例如,要求用戶申請資源時一次性申請所須要的所有資源,這就破壞了保持和等待條件;將資源分層,獲得上一層資源後,纔可以申請下一層資源,它破壞了環路等待條件。預防一般會下降系統的效率。進程

  注:死鎖產生的前三個條件是死鎖產生的必要條件,也就是說要產生死鎖必須具有的條件,而不是存在這3個條件就必定產生死鎖,那麼只要在邏輯上回避了第四個條件就能夠避免死鎖。ci

(2)死鎖避免資源

  容許前三個條件存在,但經過合理的資源分配算法來確保永遠不會造成環形等待的封閉進程鏈,從而避免死鎖。該方法支持多個進程的並行執行,爲了不死鎖,系統動態的肯定是否分配一個資源給請求的進程。方法以下:it

  a.若是一個進程的當前請求的資源會致使死鎖,系統拒絕啓動該進程;

  b.若是一個資源的分配會致使下一步的死鎖,系統就拒絕本次的分配;

  顯然要避免死鎖,必須事先知道系統擁有的資源數量及其屬性,而且死鎖避免算法的執行會增長系統的開銷,常見算法如:銀行家算法。

(3)死鎖檢測

  死鎖預防和避免都是事前措施,而死鎖的檢測則是判斷系統是否處於死鎖狀態,若是是,則執行死鎖解除策略。

(4)死鎖解除

  這是與死鎖檢測結合使用的,它使用的方式就是剝奪。即將某進程所擁有的資源強行收回,分配給其餘的進程。

 

3.附錄

(1)其中,銀行家算法以下:

  所謂銀行家算法,是指在分配資源以前先看清楚,資源分配後是否會致使系統死鎖。若是會死鎖,則不分配,不然就分配。

  按照銀行家算法的思想,當進程請求資源時,系統將按以下原則分配系統資源:

  a.當一個進程對資源的最大需求量不超過系統中的資源數時能夠接納該進程。

  b.進程能夠分期請求資源,當請求的總數不能超過最大需求量。

  c.當系統現有的資源不能知足進程尚需資源數時,對進程的請求能夠推遲分配,但總能使進程在有限的時間裏獲得資源。

  d.當系統現有的資源能知足進程尚需資源數時,必須測試系統現存的資源可否知足該進程尚需的最大資源數,若能知足則按當前的申請量分配資源,不然也要推遲分配。

(2)其中,鴕鳥算法以下:

  忽略死鎖。該算法能夠應用在極少發生死鎖的的狀況下。爲何叫鴕鳥算法呢,由於傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥以爲看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。

 

若有不對的地方,很是歡迎給予指導!

——【感謝】資料來源於http://blog.csdn.net/liujianfei526/article/details/51933162

相關文章
相關標籤/搜索