舉個例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車經過,沒法讓兩輛汽車並行。若是有兩輛汽車A和B分別由橋的兩端駛上該橋,則對於A車來講,它走過橋面左面的一段路(即佔有了橋的一部分資源),要想過橋還須等待B車讓出右邊的橋面,此時A車不能前進;對於B車來講,它走過橋面右邊的一段路(即佔有了橋的一部分資源),要想過橋還須等待A車讓出左邊的橋面,此時B車也不能前進。兩邊的車都不倒車,結果形成互相等待對方讓出橋面,可是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。若是把汽車比作進程,橋面做爲資源,那麼上述問題就描述爲:進程A佔有資源R1,等待進程B佔有的資源Rr;進程B佔有資源Rr,等待進程A佔有的資源R1。並且資源R1和Rr只容許一個進程佔用,即:不容許兩個進程同時佔用。結果,兩個進程都不能繼續執行,若不採起其它措施,這種循環等待情況會無限期持續下去,就發生了進程死鎖。 html
互斥條件:資源不能被共享,每一個資源一次只能被一個進程使用;算法
請求與保持條件:指進程已經保持了至少一個資源,又提出新的資源請求,而該資源又被其餘進程佔有,此時請求進程阻塞,但又對本身得到的資源保持不放。安全
不剝奪條件:進程已得到資源,在未使用完以前,不能強行剝奪;數據結構
循環等待條件:若干進程之間造成一種頭尾相接的循環等待資源關係。spa
上面咱們提到的這四個條件在死鎖時會同時發生。也就是說,只要有一個必要條件不知足,則死鎖就能夠排除。操作系統
針對死鎖出現以後的解決方法須要從原理上來講解決,這也是絕大多數操做系統所採用的方法:.net
(1) 使用協議以預防或避免死鎖,確保系統不會進入死鎖狀態;orm
(2) 系統可進入死鎖狀態,但可檢測死鎖狀態,而後進行解決;htm
既然須要同時知足四個條件還能出現死鎖,那麼預防死鎖的方法顯然會有多種。預防的核心思想即爲,打破同時知足四個條件的條件,便可解決進程死鎖的問題。也就是說,只要確保至少有一個必要條件不成立,就能預防死鎖發生。blog
互斥——對於非共享資源,必需要有互斥條件。不過一般不能經過否認互斥條件來預防死鎖:有的資源自己就是非共享的。
佔有並等待——打破該條件,必須保證:當一個進程申請一個資源時,它不能佔有其餘資源。
非搶佔——對已分配的資源不能搶佔。確保該條件不成立,即一個已佔有資源的進程若要再申請新的資源,它必須先釋放已佔有的資源。若隨後再須要這些資源,須要從新申請。
循環等待——確保該條件不成立的方法是對全部資源類型進行徹底排序,且要求每一個進程按遞增順序來申請資源。
預防死鎖的反作用是下降設備的使用率和系統的吞吐率。
要求操做系統事先獲得有關進程申請資源和使用資源的額外信息。經過獲悉這 些信息,系統將可以肯定:對於一個申請,進程是否應等待。死鎖避免算法動態地檢測資源分配狀態以確保循環等待條件不可能成立。資源分配狀態是由可用資源和 已分配資源,及進程最大需求所決定的。對於死鎖避免算法,不得不提到的概念——安全狀態。若是系統能按某個順序爲每一個進程分配資源(不超過其最大值)並能 避免死鎖,那麼系統狀態就是安全的。死鎖避免算法通常有兩種:
當死鎖避免和死鎖預防都失效後,那麼就必需要檢測出進程是否死鎖仍是進程異常,系統須要提供兩種算法:
檢測死鎖的算法須要區分每種資源類型只有單個實例和多個實例的狀況:
當只有單個實例時,可使用資源分配圖的一個變種,即等待圖。從資源分配圖種,刪除全部的資源類型節點,合併適當邊,便可獲得等待圖。
當有多個實例時,須要採用銀行家算法的變種,而使用了一些隨時間而變化的數據結構
爲了提升檢測算法的效率,須要肯定什麼時候調用檢測算法。這取決於兩種因素:
常見的解除死鎖的兩種方法:
http://www.cnblogs.com/bao-yu/p/5429300.html
http://blog.csdn.net/jirongzi_cs2011/article/details/9406281