死鎖產生的四個必要條件
- 互斥條件:資源是獨佔的且排他使用,進程互斥使用資源,即任意時刻一個資源只能給一個進程使用,其餘進程若申請一個資源,而該資源被另外一進程佔有時,則申請者等待直到資源被佔有者釋放。
- 不可剝奪條件:進程所得到的資源在未使用完畢以前,不被其餘進程強行剝奪,而只能由得到該資源的進程資源釋放。
- 請求和保持條件:進程每次申請它所須要的一部分資源,在申請新的資源的同時,繼續佔用已分配到的資源。
- 循環等待條件:在發生死鎖時必然存在一個進程等待隊列{P1,P2,…,Pn},其中P1等待P2佔有的資源,P2等待P3佔有的資源,…,Pn等待P1佔有的資源,造成一個進程等待環路,環路中每個進程所佔有的資源同時被另外一個申請,也就是前一個進程佔有後一個進程所深情地資源。
以上給出了致使死鎖的四個必要條件,只要系統發生死鎖則以上四個條件至少有一個成立。事實上循環等待的成立蘊含了前三個條件的成立,彷佛沒有必要列出然而考慮這些條件對死鎖的預防是有利的,由於能夠經過破壞四個條件中的任何一個來預防死鎖的發生。
死鎖預防
咱們能夠經過破壞死鎖產生的4個必要條件來 預防死鎖,因爲資源互斥是資源使用的固有特性是沒法改變的。安全
- 破壞「不可剝奪」條件:一個進程不能得到所須要的所有資源時便處於等待狀態,等待期間他佔有的資源將被隱式的釋放從新加入到 系統的資源列表中,能夠被其餘的進程使用,而等待的進程只有從新得到本身原有的資源以及新申請的資源才能夠從新啓動,執行。
- 破壞」請求與保持條件「:第一種方法靜態分配即每一個進程在開始執行時就申請他所須要的所有資源。第二種是動態分配即每一個進程在申請所須要的資源時他自己不佔用系統資源。
- 破壞「循環等待」條件:採用資源有序分配其基本思想是將系統中的全部資源順序編號,將緊缺的,稀少的採用較大的編號,在申請資源時必須按照編號的順序進行,一個進程只有得到較小編號的進程才能申請較大編號的進程。
死鎖避免
死鎖避免的基本思想:系統對進程發出的每個系統可以知足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,若是分配後系統可能發生死鎖,則不予分配,不然予以分配,這是一種保證系統不進入死鎖狀態的動態策略。
若是操做系統能保證全部進程在有限時間內獲得須要的所有資源,則系統處於安全狀態不然系統是不安全的。操作系統
- 安全狀態是指:若是系統存在 由全部的安全序列{P1,P2,…Pn},則系統處於安全狀態。一個進程序列是安全的,若是對其中每個進程Pi(i >=1 && i <= n)他之後尚須要的資源不超過系統當前剩餘資源量與全部進程Pj(j < i)當前佔有資源量之和,系統處於安全狀態則不會發生死鎖。
- 不安全狀態:若是不存在任何一個安全序列,則系統處於不安全狀態。他們之間的對對應關係以下圖所示:
下面咱們來經過一個例子對安全狀態和不安全狀態進行更深的瞭解
如上圖所示系統處於安全狀態,系統剩餘3個資源,能夠把其中的2個分配給P3,此時P3已經得到了全部的資源,執行完畢後還能還給系統4個資源,此時系統剩餘5個資源因此知足(P2所需的資源不超過系統當前剩餘量與P3當前佔有資源量之和),同理P1也能夠在P2執行完畢後得到本身須要的資源。
若是P1提出再申請一個資源的要求,系統從剩餘的資源中分配一個給進程P1,此時系統剩餘2個資源,新的狀態圖以下:那麼是否還是安全序列呢那咱們來分析一下
系統當前剩餘2個資源,分配給P3後P3執行完畢還給系統4個資源,可是P2須要5個資源,P1須要6個資源,他們都沒法得到資源執行完成,所以找不到一個安全序列。此時系統轉到了不安全狀態。