C 面試總結之作業系統(三) 死鎖

2021-09-18 06:42:02 字數 2929 閱讀 2057

死鎖:在兩個或者多個併發程序中,如果每個程序持有某種資源而又等待其它程序釋放它或它們現在保持著的資源,在未改變這種狀態之前都不能向前推進,稱這一組程序產生了死鎖。通俗的講就是兩個或多個程序無限期的阻塞、相互等待的一種狀態。

1. 產生死鎖的原因主要:

(1) 因為系統資源不足。

(2) 程序執行推進的順序不合適。

(3) 資源分配不當等。

2. 死鎖的必要條件:

(1)互斥條件:乙個資源一次只能被乙個程序使用

(2)請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得資源保持不放

(3)不剝奪條件:程序獲得的資源,在未完全使用完之前,不能強行剝奪

(4)迴圈等待條件:若干程序之間形成一種頭尾相接的環形等待資源關係

3. 解決死鎖的方法分為死鎖的預防,避免,檢測與恢復三種,當然還一種是忽略該問題例如鴕鳥演算法,該演算法可以應用在極少發生死鎖的情況下。

(1)死鎖的預防(靜態)

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

〈1〉破壞互斥條件。即允許程序同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像印表機等等,這是由資源本身的屬性所決定的。所以,這種辦法並無實用價值。

〈2〉破壞不可剝奪條件。即允許程序強行從佔有者那裡奪取某些資源。就是說,當乙個程序已占有了某些資源,它又申請新的資源,但不能立即被滿足時,它必須釋放所占有的全部資源,以後再重新申請。它所釋放的資源可以分配給其它程序。這種預防死鎖的方法實現起來困難,會降低系統效能。    

〈3〉破壞請求與保持條件。可以實行資源預先分配策略。即程序在執行前一次性地向系統申請它所需要的全部資源。如果某個程序所需的全部資源得不到滿足,則不分配任何資源,此程序暫不執行。只有當系統能夠滿足當前程序的全部資源需求時,才一次性地將所申請的資源全部分配給該程序。由於執行的程序已占有了它所需的全部資源,所以不會發生占有資源又申請資源的現象,因此不會發生死鎖。但是,這種策略也有如下缺點:

a. 在許多情況下,乙個程序在執行之前不可能知道它所需要的全部資源。這是由於程序在執行時是動態的,不可**的;

b. 資源利用率低。無論所分資源何時用到,乙個程序只有在占有所需的全部資源後才能執行。即使有些資源最後才被該程序用到一次,但該程序在生存期間卻一直占有它們,造成長期佔著不用的狀況。這顯然是一種極大的資源浪費;

c. 降低了程序的併發性。因為資源有限,又加上存在浪費,能分配到所需全部資源的程序個數就必然少了。    

< 4 >破壞迴圈等待條件,實行資源有序分配策略。採用這種策略,即把資源事先分類編號,按號分配,使程序在申請,占用資源時不會形成環路。所有程序對資源的請求必須嚴格按資源序號遞增的順序提出。程序占用了小號資源,才能申請大號資源,就不會產生環路,從而預防了死鎖。這種策略與前面的策略相比,資源的利用率和系統吞吐量都有很大提高,但是也存在以下缺點:

a. 限制了程序對資源的請求,同時給系統中所有資源合理編號也是件困難事,並增加了系統開銷;

b. 為了遵循按編號申請的次序,暫不使用的資源也需要提前申請,從而增加了程序對資源的占用時間。

(2)死鎖的避免(動態)

死鎖的避免,它不限制程序有關申請資源的命令,而是對程序所發出的每乙個申請資源命令加以動態地檢查,並根據檢查結果決定是否進行資源分配。

<1>安全序列

我們首先引入安全序列的定義:所謂系統是安全的,是指系統中的所有程序能夠按照某一種次序分配資源,並且依次地執行完畢,這種程序序列就是安全序列。

雖然存在安全序列時一定不會有死鎖發生,但是系統進入不安全狀態(四個死鎖的必要條件同時發生)也未必會產生死鎖。當然,產生死鎖後,系統一定處於不安全狀態。  

<2>銀行家演算法dijstra

優點:銀行家演算法允許死鎖必要條件中的互斥條件,占有且申請條件,不可搶占條件的存在,這樣,它與預防死鎖的幾種方法相比較,限制條件少了,資源利用程度提高了。

缺點:〈1〉這個演算法要求客戶數保持固定不變,這在多道程式系統中是難以做到的。   

〈2〉這個演算法保證所有客戶在有限的時間內得到滿足,但實時客戶要求快速響應,所以要考慮這個因素。  

〈3〉由於要尋找乙個安全序列,實際上增加了系統的開銷 

(3)死鎖檢測與恢復(實際中使用,資源分配圖)

常利用資源分配圖(進行死鎖的檢驗)、程序等待圖來協助這種檢測。系統設有專門的機構,當死鎖發生時,該機構能夠檢測到死鎖發生的位置和原因,並能通過外力破壞死鎖發生的必要條件,從而使得併發程序從死鎖狀態中恢復出來。 

〈1〉重新啟動,不過這種方法代價很大。

〈2〉撤消程序,剝奪資源。終止參與死鎖的程序,收回它們占有的資源,從而解除死鎖。這時又分兩種情況:一次性撤消參與死鎖的全部程序,剝奪全部資源;或者逐步撤消參與死鎖的程序,逐步收回死鎖程序占有的資源。一般來說,選擇逐步撤消的程序時要按照一定的原則進行,目的是撤消那些代價最小的程序,比如按程序的優先順序確定程序的代價;考慮程序執行時的代價和與此程序相關的外部作業的代價等因素。 

〈3〉程序回退策略(檢查點),即讓參與死鎖的程序回退到沒有發生死鎖前某一點處,並由此點處繼續執行,以求再次執行時不再發生死鎖。雖然這是個較理想的辦法,但是操作起來系統開銷極大,要有堆疊這樣的機構記錄程序的每一步變化,以便今後的回退,有時這是無法做到的。

作業系統面試(死鎖)

外鏈轉存失敗 img vs8tclxs 1562162502867 主要有以下四種方法 把頭埋在沙子裡,假裝根本沒發生問題。因為解決死鎖問題的代價很高,因此鴕鳥策略這種不採取任務措施的方案會獲得更高的效能。當發生死鎖時不會對使用者造成多大影響,或發生死鎖的概率很低,可以採用鴕鳥策略。大多數作業系統,...

作業系統面試 死鎖(三) 死鎖檢測和死鎖恢復

本文是對作業系統概念 第七版 死鎖的學習總結,不足之處,歡迎批評指正。本文討論的兩塊內容是死鎖檢測和死鎖恢復。1 死鎖檢測 首先針對每種資源型別只有乙個例項的情況。該演算法使用資源分配圖的乙個變種,稱為等待圖。從資源分配圖中,刪除所有資源型別的節點,合併合適邊,就可以得到等待圖。合併的過程如下 如果...

作業系統總結(五) 死鎖

四個必要條件 處理方法 死鎖檢測與死鎖恢復 程序 p1 和 p2 所請求的資源都得不到滿足,只有程序 p3 可以,讓 p3 執行,之後釋放 p3 擁有的資源,此時 a 2 2 2 0 p2 可以執行,執行後釋放 p2 擁有的資源,a 4 2 2 1 p1 也可以執行。所有程序都可以順利執行,沒有死鎖...