死鎖是什么?
比如一條只容一個人通過的小道,兩個方向都有一個人走來,都等着對方讓路。
即:進程分別持有對方需要的一部分資源,同時自己需要的一部分資源被對方持有,相互等待對方釋放自己需要的那部分資源的情況。
首先,死鎖的出現需要4個條件全部滿足,
1.互斥訪問資源。即不可以同時使用一個資源。
2,持有並等待,即可以獲得部分資源的同時,等待自己需要的其他資源
3,不可搶占。進程得到的資源不可以被剝奪,只可以自己釋放。
4.循環等待。 進程相互等待或者多個進程循環等待。比如說A需要的資源被B持有,B需要的資源被C持有,C需要的資源被A持有。
解除死鎖的方案:
一.死鎖預防。(避免形成死鎖出現的所有條件);
1.互斥訪問資源。可以做的改變: 使得資源可同時訪問。
2,持有並等待,可以做的改變:使進程間不存在等待的情況。即:一個進程在申請資源的時候,要求它此時未持有任何資源。或者,在進程開始時,要進程一次性申請自己需要的全部資源。
3,不可搶占。可以做的改變:可以搶占。一個進程不能獲得所需要的全部資源時便處於等待狀態,等待期間他占有的資源將被隱式的釋放重新加入到 系統的資源列表中,可以被其他的進程使用,而等待的進程只有重新獲得自己原有的資源以及新申請的資源才可以重新啟動,執行。
4.循環等待。可以做的改變:排隊。1.將資源排序,將系統中的所有資源順序編號,將緊缺的,稀少的采用較大的編號,2.在申請資源時必須按照編號的順序進行,一個進程只有獲得較小編號的進程才能申請較大編號的進程。
二,死鎖避免(在分配資源之前進行檢驗,確定不會出現死鎖再分配資源)
方案: 每次有進程申請資源的時候,判斷如果分配,是不是安全的,如果是安全的,才分配資源。
如何驗證是安全的?
答案是,可以找到一個分配資源的順序,在這個序列中,每一個進程的需求都可以得到滿足。
所以要求申請資源的進程。提供自己的最大需求量,分配的時候,才能判斷是否可以滿足進程的需求。
銀行家算法:
假設有3個資源 R0,R1,R2,
每次判斷時,計算:
是否有一個正在執行的進程的還需要的資源數(need),當前的剩余資源數就可以滿足?
遍歷進程,
如果有可以滿足的進程,
則認定該進程可以完成,此時把剩余資源的數目加上該進程已經占有的資源。
繼續。
如果有不能滿足的進程。
則判定不安全。
三。 死鎖檢測
不再預防或者避免死鎖,而是允許進入死鎖狀態,定時調用死鎖檢測算法,發現死鎖則采用死鎖恢復機制
死鎖檢測算法:
每次判斷時,計算:
是否有一個正在執行的進程的還需要的資源數(need),當前的剩余資源數就可以滿足?
遍歷進程,
如果有可以滿足,且沒有被標記被結束的進程,
和銀行家算法一樣,則認定該進程可以完成,此時把剩余資源的數目加上該進程已經占有的資源。
不同的是,會額外標記該進程為已結束。
繼續。
如果有不能滿足的進程,(需求量>空閑資源量)而且還沒有被標記為已結束。
認為出現死鎖。
否則認為沒有出現死鎖。
如果出現死鎖,則進行死鎖恢復,
搶占一些進程的資源,回退這些進程。或者按一定順序終止全部進程。
死鎖檢測算法復雜度很高 N個進程,遍歷N遍,M個資源,每個資源操作一次。則復雜度 O(M*N^2)
所以,一般由程序實現,而不是操作系統檢測。