1. 程式人生 > >作業系統--第三章處理機排程與死鎖_2

作業系統--第三章處理機排程與死鎖_2

死鎖

定義: 如果一組程序中的每個程序都在等待僅由該組程序中的其他程序才能引發的事件,那麼該組程序是死鎖的.

產生死鎖的必要條件:

  1. 互斥條件:程序對分配到的資源進行排他性的使用.
  2. 請求和保持條件:程序已經保持了至少一個資源,因為對另一個資源申請時被阻塞同時保持當前持有資源的佔用.
  3. 不可搶佔條件: 程序已經獲得的資源在使用完之前僅能由自己釋放而不能被其他程序搶佔.
  4. 迴圈等待條件:在發生死鎖時肯定存在一條 程序–資源 的迴圈鏈.即P1等待P2佔用的資源,P2等待P3的資源…Pn等待P1佔用的資源.

四個條件缺一不可,當條件均滿足時構成死鎖

處理死鎖的方法:

  • 預防死鎖
  • 避免死鎖
  • 檢測死鎖
  • 解除死鎖
    這四種方式逐次對死鎖的防範降低,但是資源的利用率逐次提高,程序因資源而阻塞的頻率下降.

預防死鎖 預防死鎖的主要思路就是破壞4條死鎖條件的任意一個,但互斥條件是非共享裝置必須的,故從其他三點入手.

  • 破壞"請求和保持"條件.
    即使系統做到:當一個程序請求資源時,他必須不能持有不可搶佔的資源.
    由此有兩種協議:

    1. 所有程序在開始之前一次性申請所有所需的資源。這種方式簡單易行且安全,但資源被嚴重浪費且易發生飢餓現象.由此有第二種協議.
    2. 在第一種協議的基礎上做出了改進:允許資源申請初期執行所需資源後便可進行,在申請新的資源之前要將之前申請的釋放掉.
  • 破壞"不可搶佔"條件
    當一個保持了不可搶佔的資源的程序申請新的資源而不能被滿足時,他必須釋放自己已保持的全部資源.該方法實現複雜且代價極高,部分不可搶佔資源(如印表機)被中斷後意味著之前的工作進度將會全部丟失.

  • 破壞"迴圈等待"條件
    對系統所有資源進行編號,線性排序,所有程序對資源的申請必須按編號有小到大申請.這種方法效率比前兩種明顯提高但是對使用者施加了過多的限制條件,且有可能使作業使用資源的順序與規定順序不符造成資源的浪費.

避免死鎖在動態分配資源的過程中,通過對系統的狀態判斷來決定是否分配資源來避免死鎖.

–安全狀態:指存在一種以上的推進程序的順序(分配資源的方法),使每個程序都可順利完成.稱該推進程序的順序為"安全序列".
只要系統一直處於安全狀態便可以避免發生死鎖,但是不安全的狀態不一定發生了死鎖,但最後一定會走向死鎖.

在建立了系統安全狀態的概念後,便可得出避免死鎖的方法:每個程序告知系統自己所需的總資源,每當一個程序請求一個資源時便計算一次分配後是否還處於安全狀態,只有分配後依然處於安全狀態時才會分配資源.

-.—銀行家演算法:
資料結構:當前可利用資源/最大需求資源量/持有資源量/需求資源量
演算法步驟如下:
1. 當程序P提出一個請求need,如果need<=需求資源量則轉2,否則認為出錯,其申請的資源量超過了他所宣告的最大值 .
2. 如果need<=可用資源量,則轉3,否則當前無足夠資源進行分配,讓P等待.
3. 系統試探性的分配給P資源,檢查分配後:當前可利用資源是否能夠滿足至少一個程序的需求資源量,如果是則分配給P,否則試探分配作廢,回覆原來狀態並使P等待.