如果系統中既不採取預防死鎖的措施,也不採取避免死鎖的措施,系統就很可能發生死鎖。在這種情況下,系統應當提供兩個演算法:
①死鎖檢測演算法:用於檢測系統狀態,以確定系統中是否發生了死鎖。
②死鎖解除演算法:當認定系統中已經發生了死鎖,利用該演算法可將系統從死鎖狀態中解脫岀來。
為了能對系統是否已發生了死鎖進行檢測,必須:
①用某種資料結構來儲存資源的請求和分配資訊;
②提供一種演算法,利用上述資訊來檢測系統是否已進入死鎖狀態。
如果系統中剩餘的可用資源數足夠滿足程序的需求,那麼這個程序暫時是不會阻塞的,可以順利地執行下去。如果這個程序執行結束了把資源歸還系統,就可能使某些正在等待資源的程序被啟用,並順利地執行下去。相應的,這些被啟用的程序執行完了之後又會歸還一些資源,這樣可能又會啟用另外一些阻塞的程序。
如果按上述過程分析,最終能消除所有邊,就稱這個圖是可完全筒化的。此時一定沒有發生死鎖(相當於能找到乙個安全序列)
如果最終不能消除所有邊,那麼此時就是發生了死鎖
最終還連著邊的那些程序就是處於死鎖狀態的程序,下圖中的p3就不是死鎖程序。檢測死鎖的演算法:
1)在資源分配圖中,找出既不阻塞又不是孤點的程序pi(即找出一條有向邊與它相連,且該有向邊對應資源的申請數量小於等於系統中已有空閒資源數量。如下圖中,r1沒有空閒資源,r2有個空閒資源。若所有的連線該程序的邊均滿足上述條件,則這個程序能繼續執行直至完成,然後釋放它所占有的所有資源)。消去它所有的請求邊和分配變,使之稱為孤立的結點。在下圖中,p1是滿足這一條件的程序結點,於是將p1的所有邊消去
2)程序所i所釋放的資源,可以喚醒某些因等待這些資源而阻塞的程序,原來的阻塞程序可能變為非阻塞程序。在下圖中,p2就滿足這樣的條件。根據1)中的方法進行一系列簡化後,若能消去途中所有的邊,則稱該圖是可完全簡化的。
死鎖定理:如果某時刻系統的資源分配圖是不可完全簡化的,那麼此時系統死鎖
解除死鎖的主要方法有
1.資源剝奪法。掛起(暫時放到外存上)某些死鎖程序,並搶占它的資源,將這些資源分配給其他的死鎖程序。但是應防止被掛起的程序長時間得不到資源而飢餓。
2.撤銷程序法(或稱終止程序法)。強制撤銷部分、甚至全部死鎖程序,並剝奪這些程序的資源。這種方式的優點是實現簡單,但所付出的代價可能會很大。因為有些程序可能已經執行了很長時間,已經接近結束了,一旦被終止可謂功虧一簣,以後還得從頭再來。
3.程序回退法。讓乙個或多個死鎖程序回退到足以避免死鎖的地步。這就要求系統要記錄程序的曆中資訊,設定還原點
那麼如何如何決定「對誰動手」呢?
1.程序優先順序:優先順序低3.還要多久能完成:還需要很長的時間才能完成4.程序已經使用了多少資源:使用資源少5.程序是互動式的還是批處理式的:批處理死鎖的檢測和解除
前面紹的死鎖預防和避免演算法,都是在為程序分配資源時施加限制條件或進行檢測,若系統為程序分配資源時不釆取任何措施,則應該提供死鎖檢測和解除的手段。資源分配圖 系統死鎖,可利用資源分配圖來描述。如圖2 17所示,用圓圈代表乙個程序,用框代表一類資源。由於一種型別的資源可能有多個,用框中的乙個點代表一類...
死鎖的產生 防止 避免 檢測和解除
死鎖的產生條件 想知道死鎖怎麼產生,首先要了解什麼是死鎖 一 死鎖的定義 多個進行相互等待對方資源,在得到所有資源繼續執行之前,都不會釋放自己已有的資源,這樣造成了迴圈等待的現象,稱為死鎖。二 產生死鎖的四大必要條件 資源互斥 資源不共享 每個資源要麼已經分配給了乙個程序,要麼是可用的,只有這兩種狀...
作業系統2 4 4 死鎖的檢測和解除
為了能系統是否已經發生死鎖進行檢測,必須 1 用一種資料結構來儲存資源的請求和分配資訊 2 用一種演算法,利用上述資訊來檢測系統是否進入死鎖狀態 如果系統中剩餘的可用資源足夠滿足程序的需求,那麼這個程序暫時不會被堵塞,可以順利執行下去。如果這個程序執行結束了把資源歸還給系統,就可能使得某些正在等待的...