如果乙個程序集合裡面的每個程序都在等待只能由這個集合中的其他乙個程序(包括他自身)才能引發的事件,這種情況就是死鎖。
這個定義可能有點拗口,下面用乙個簡單例子說明。
資源a、b
,程序c、d
描述如下:
資源a和資源b,都是不可剝奪資源,
現在程序c已經申請了資源a,程序d也申請了資源b,
程序c接下來的操作需要用到資源b,而程序d恰好也在申請資源a,
程序c、d都得不到接下來的資源,那麼就引發了死鎖。
然後套用回去定義:如果乙個程序集合裡面(程序c和進 程d)的每個程序(程序c和程序d)都在等待只能由這個集合中的其他乙個程序(對於程序c,他在等程序d;對於程序d,他在等程序c)才能引發的事件(釋放相應資源)。
這裡的資源包括了軟的資源(**塊)和硬的資源(例如掃瞄器)。資源一般可以分兩種:可剝奪資源(preemptable)和不可剝奪資源 (nonpreemptable)。一般來說對於由可剝奪資源引起的死鎖可以由系統的重新分配資源來解決,所以一般來說大家說的死鎖都是由於不可剝奪資源 所引起的。
死鎖的四個必要條件
(1) 互斥條件:乙個資源每次只能被乙個程序使用。
(2) 請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。
處理死鎖的策略
1.忽略該問題。例如鴕鳥演算法,該演算法可以應用在極少發生死鎖的的情況下。為什麼叫鴕鳥演算法呢,因為傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。
2.檢測死鎖並且恢復。
3.仔細地對資源進行動態分配,以避免死鎖。
4.通過破除死鎖四個必要條件之一,來防止死鎖
根據死鎖發生的必要條件,下面兩個函式在多執行緒環境下則不會傳送死鎖(條件2不滿足)
void func1()
void func1() // 裡面也包括locka、lockb、lockc的呼叫,但互相之間不潛逃,但順序不一定按照locka、lockb、lockc的順序進行(可以是b、a、c等...)
對於巢狀鎖來說,
必須保證按某種順序獲取鎖
增加了乙個訪問資源的間接層,盡量避免高層**控制資源的獲取.另外,
因為為每個資源型別實現間接層,避免了乙個鎖控制訪問多個資源的情況.對於需要獲取多個資源的,在更高一層把這種獲取邏輯抽取出來,提供乙個統一的資源獲取邏輯,而在實現內部,確保有序獲取資源,在演算法上避免死鎖.
死鎖的四個必要條件
作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解 除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中...
死鎖的四個必要條件
作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解 除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中...
死鎖的四個必要條件
作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解 除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中...