天天看點

死鎖原因及解決辦法

       死鎖問題被認為是線程/程序間切換消耗系統性能的一種極端情況。在死鎖時,線程/程序間互相等待資源,而又不釋放自身的資源,導緻無窮無盡的等待,其結果是任務永遠無法執行完成。

産生死鎖的必要條件

       從以上分析可見,如果在計算機系統中同時具備下面四個必要條件時,那麽會發生死鎖。換句話說,隻要下面四個條件有一個不具備,系統就不會出現死鎖。

〈1〉互斥條件。即某個資源在一段時間内隻能由一個程序占有,不能同時被兩個或兩個以上的程序占有。這種獨占資源如CD-ROM驅動器,列印機等等,必須在占有該資源的程序主動釋放它之後,其它程序才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨占資源,兩方的人不能同時過橋。

〈2〉不可搶占條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源占有者手中奪取資源,而隻能由該資源的占有者程序自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地将對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放占有資源),對方的人才能過橋。

〈3〉占有且申請條件。程序至少已經占有一個資源,但又申請新的資源;由于該資源已被另外程序占有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續占用已占有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過一段橋面(即占有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙占有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處于同樣的狀況。

〈4〉循環等待條件。存在一個程序等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一資源,形成一個程序循環等待環。就像前面的過獨木橋問題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,進而彼此循環等待。

死鎖的預防是保證系統不進入死鎖狀态的一種政策。它的基本思想是要求程序申請資源時遵循某種協定,進而打破産生死鎖的四個必要條件中的一個或幾個,保證系統不會進入死鎖狀态。

死鎖的避免,它不限制程序有關申請資源的指令,而是對程序所發出的每一個申請資源指令加以動态地檢查,并根據檢查結果決定是否進行資源配置設定。就是說,在資源配置設定過程中若預測有發生死鎖的可能性,則加以避免。這種方法的關鍵是确定資源配置設定的安全性。

死鎖的檢測與恢複  ,  一般來說,由于作業系統有并發,共享以及随機性等特點,通過預防和避免的手段達到排除死鎖的目的是很困難的。這需要較大的系統開銷,而且不能充分利用資源。為此,一種簡便的方法是系統為程序配置設定資源時,不采取任何限制性措施,但是提供了檢測和解脫死鎖的手段:能發現死鎖并從死鎖狀态中恢複出來。是以,在實際的作業系統中往往采用死鎖的檢測與恢複方法來排除死鎖。 死鎖檢測與恢複是指系統設有專門的機構,當死鎖發生時,該機構能夠檢測到死鎖發生的位置和原因,并能通過外力破壞死鎖發生的必要條件,進而使得并發程序從死鎖狀态中恢複出來。