1. 程式人生 > >作業系統 第三章 死鎖--筆記

作業系統 第三章 死鎖--筆記

注意區分兩個概念 死鎖(Deadlock):指程序之間無休止地相互等待 飢餓(Starvation):指一個程序無休止地等待

在多道程式系統中,雖然可藉助於多個程式的併發執行來改善系統的資源利用率,提高系統吞吐量,但可能引發死鎖(因為上面也提到了死鎖是程序間無休止地相互等待)

進一步分析死鎖是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當程式處於這種狀態時,若無外力作用,他們都將無法再向前推進,因此可以看出:關於死鎖,根本不存在完美、圓滿的解決方案。 飢餓餓死反映了資源分配策略的不公平性,死鎖是因為程序競爭資源,但系統擁有的數量有限,或併發程序推進的順序不當而造成的一種永遠等待資源的僵局。而飢餓

是指每個資源佔用者都在有限時間內釋放佔用資源,但申請程序仍然長時間得不到資源的現象。

綜上所述:產生飢餓並不一定意味著一定產生死鎖

【例項】 在這裡插入圖片描述 死鎖產生的原因:雙方都擁有部分資源,同時在申請對方已佔有的資源。

因此產生死鎖的原因為:

  1. 競爭資源。例如系統中供多個程序共享的資源
  2. 程序間推進順序非法。程序在執行過程中,請求和釋放資源的順序不當,同樣會導致死鎖

系統中的資源可分為兩類: ··可剝奪和非剝奪性資源 可剝奪性資源:分配給程序後可以被高優先順序的程序剝奪。如CPU和主存。 不可剝奪性資源:分配給程序後只能在程序用完後釋放。如磁帶機、印表機等。 ··永久性資源和臨時性資源 永久性:印表機。可順序重複使用 臨時性:程序產生被其他程序短暫使用的資源,如資料資源:“生產者/消費者”演算法中的訊號量。它可能引起死鎖。

補充所有的硬體資源及部分軟體資源屬於永久資源;而部分軟體資源(如:訊號量、中斷訊號及互動作用時產生的資訊等)屬於臨時性/消耗性資源。

程序推進順序對死鎖的影響

在這裡插入圖片描述

分析: 若併發程序P1和P2按曲線④所示的順序推進,它們將進入不安全區D內。此時P1保持了資源R1, P2保持了資源R2, 系統處於不安全狀態。因為,這時兩程序再向前推進,便可能發生死鎖。例如,當P1執行到P1:Request(R2)時,將因R2已被P2佔用而阻塞;當P2執行到P2: Request(R1)時,也將因R1已被P1佔用而阻塞,於是發生了程序死鎖。

產生死鎖的四個必要條件:(四個條件都具備就會死鎖,缺一不可)

  1. 互斥條件:程序對所分配到的資源進行排他性使用
  2. 請求和保持條件:程序已經保持了至少一個資源,又提出新的資源請求,而新的資源請求又被其他程序佔有只能造成自身程序被阻塞,但對自己獲得的其他資源保持不放,必然影響其他程序。
  3. 不剝奪條件:程序已獲得的資源未使用完之前不能被剝奪,只能在使用完時有自己釋放。
  4. 環路等待條件(指在發生死鎖時,必然存在一個程序資源的環形鏈,即程序集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,,Pn正在等待已被P0佔用的資源)

事先預防 1.預防死鎖:設定限制條件,破壞四個必要條件(較容易實現,限制條件的嚴格也會降低自願利用率和吞吐量) 2.避免死鎖:用某種方法防止系統進入不安全狀態(實現上有一定難度,但可獲得較高吞吐量)

事後處理 1.檢測死鎖。 2.解除死鎖: 與檢測死鎖配套使用 常用的方法:撤銷或掛起一些程序,回收部分資源分配給已阻塞的程序

預防死鎖的方法

資源的排他性無法更改,需要在其他三個條件上入手

1.破壞“請求保持條件”:所有程序開始執行之前,必須一次性申請所需的全部資源(AND訊號量集)—演算法簡單、易於實現、安全。但缺點是資源浪費嚴重、程序會延遲執行。

2.破壞“不剝奪條件”:允許程序先執行,當提出的新的要求不被滿足時必須釋放它自己保持的全部資源,以後需要時再次重新申請,----實現起來較為複雜且代價大,可能出現反覆申請和釋放等情況。

3.破壞“環路等待條件”:有序設定資源,將所有資源按型別進行線性排隊,賦予不同序號,所有程序必須嚴格按照序號進行資源請求。----與前兩種相比資源利用率和吞吐量明顯改善,但是資源編號限制新裝置的增加,應用中的使用裝置順序與規定的順序並不協調,限制了使用者程式設計自由。p20