死鎖:是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。
死鎖產生的必要條件:
(1)互斥條件:某個資源在一段時間內智能由一個進程戰友,不能同時被兩個以上或兩個的進程占有。
(2)不可搶占條件:進程所獲得的 資源在未使用完畢之前,資源申請者不能強行從資源擁有者手中奪取資源,而只能由該資源的占有者進程自行釋放。
(3)占有且申請條件:進程至少已經占有一個資源,但又申請新的資源;由於該資源已被另外進程占有,此時該進程阻塞;但是,它在等待新資源之時,扔繼續占用已占有的資源。
(4)循環等待條件:存在一組進程等待序列{P1,P2,P3....Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一資源......而Pn等待P1所占有的資源,形成一個進程循環等待。
死鎖的預防:
- 打破互斥條件
- 打破不可占搶條件
- 打破占有且申請條件
死鎖的避免:
(1)安全序列
所謂系統是安全的,是指系統中的所有進程能夠按照某一次序分配資源,並且依次地運行完畢,這種進程序列就是安全的。如果存在這樣一個安全序列,則系統是安全的;如果系統不存在這樣一個安全序列,則系統是不安全的。不安全狀態並不一定會發生死鎖的危險,但它隱含這樣的危險。只要系統能保持安全狀態就可以避免死鎖的發生。
(2)銀行家算法
銀行家算法是一個著名的避免死鎖的算法。在安全狀態下系統接到一個進程資源請求后,就先判斷這個資源是否超過了自己所要申請的總的資源數目,判斷完畢后再繼續進行下一個判斷,即判斷是否小於系統現有的可以分配的資源數目。如果這兩個判斷都通過,則系統把資源分配給該進程,系統檢查現在的系統是否處於安全狀態,如果安全則正式把資源分配給進程,以完成此次分配,否則剛才的試分配作廢。
死鎖的檢測:當進程進行資源請求時檢查並發進程組是否構成資源的請求和占用環路,如果不存在環路,則系統不存在死鎖;如果存在環路,則系統中可能存在死鎖,也可能不存在死鎖。
死鎖的恢復:重啟系統;撤銷進程或剝奪資源。
