操作系統面試—死鎖

本文是對操作系統概念(第七版)第七章——死鎖的學習總結,不足之處,歡迎各位批評指出。

1、死鎖的必要條件(重要)

互斥——至少有一個資源必須處於非共享狀態,即一次只能有一個進程使用。

佔有並等待——一個進程必須佔有至少一個資源,並等待另一資源,而該資源爲其他進程佔有。

非搶佔——資源不能被搶佔。

循環等待——有一組等待進程{p0,p1,p2,...pn},p0等待的資源爲p1所有,p1的資源爲p2所有,。。。。pn的資源爲p0所有。


2、系統資源分配圖

死鎖問題可以用系統資源分配圖來描述。含有兩種類型節點,資源集合和進程集合。其中有兩種類型的邊:

申請邊——進程到資源的有向邊,表示進程已經申請並且在等待。

分配邊——資源到進程的有向邊,表示資源已經分配給該進程。

可以證明:若資源分配圖沒有邊,那麼將不會有死鎖。如果有環,可能出現死鎖。

可能的含義是因爲:如果每個資源只有一個實例,那麼存在環必將存在死鎖,這種情況下環就是死鎖存在的充分必要條件。如果存在多個實例,則是必要條件而非充要條件。


3、死鎖的處理方法

a,使用協議預防或者避免死鎖,確保系統不會進入死鎖狀態

b,可允許系統進入死鎖狀態,然後檢測並且修復

c,可忽視這個問題,認爲死鎖不會發生,就算髮生,進行重啓處理等。(針對死鎖很少發生的情況,人工修復)

說明:死鎖預防和死鎖避免是兩種方法。

死鎖預防——通過破壞死鎖的四個必要條件中的一些,這些方法通過限制如何申請資源的方法來預防死鎖。

死鎖避免——要求操作系統預先得到有關進程申請資源和使用資源的額外信息,再進行操作。


下面進行一一詳細介紹:

4、死鎖預防

互斥——對於非共享資源,必須要有互斥條件。因此通常不能通過否定互斥條件來預防死鎖,因爲有的資源本身就是非共享的

佔有並等待——爲了否定這個條件,必須保證:當一個進程申請一個資源時,他不能佔有其他資源。因此得到一下兩種協議:

a,每個進程在執行前申請並獲得所有資源

b,允許進程在沒有資源時纔可以申請資源,一個資源可以申請一些資源並使用他們,但是在申請更多的資源之前必須釋放已分配到的所有資源。

注意這兩個協議的區別:一個是一次性申請所有資源,另一個則是申請部分資源,並且保證申請之前釋放其他資源。

這兩種協議的缺點:資源利用率低,可能發生飢餓(如一個資源需要常用資源)。

非搶佔——可以使用以下協議:如果一個進程佔有資源並申請另一個不能被立即分配的資源,那麼其現已被分配的資源允許被搶佔。即這些資源被隱式地釋放了,搶佔資源分配到進程所等待的資源的鏈表上。這個協議通常用於狀態可以保存和恢復的資源,如cpu寄存器和內存。

循環並等待——一個確保其不成立的方法是對所有資源進行完全排序,且要求每個進程按遞增順序申請資源。

可以採用以下兩個協議來實現預防死鎖:每個進程只按遞增順序申請資源,要求一個進程申請資源類型時,他必須釋放比他順序大的資源。這樣就不會形成循環等待了。


死鎖預防的副作用是低設備使用率和系統吞吐率。

5、死鎖避免

死鎖避免算法動態地檢測資源分配狀態以確保循環等待條件不成立

說到死鎖避免,首先需要明白什麼是安全狀態。

如果系統能按某個順序爲每個進程分配資源(不超過其最大值),那麼系統狀態是安全的,換句話說就是,如果存在一個安全序列,那麼系統處於安全狀態。那麼什麼是安全序列呢?

進程順序<p1,p2,...,pn>,如果對於每個進程pi,pi仍然可以申請的資源數不超過當前可用資源數加上所有其他進程所佔有的資源,那麼這一個順序稱爲安全序列。

注意死鎖狀態肯定是不安全狀態,但是不安全狀態不一定是死鎖狀態,死鎖狀態是不安全狀態的子集。

兩種死鎖避免的算法:

a,資源分配圖算法

如果有一個資源分配系統,每個資源都只有一個實例,在資源分配圖的基礎上引入需求邊,需求邊pi->rj表示進程pi可能在將來某個時候申請資源rj。這種邊類似於同一方向的申請邊,但是使用虛線表示的。當進程pi申請資源rj時,需求邊就變成申請邊。類似的,進程釋放時,分配邊就變成需求邊,因此需求邊是分配邊和申請邊的過度邊。假設進程pi申請資源rj。只有將申請邊變成分配邊而不會導致資源分配圖形成環時,才允許申請。注意環檢測算法爲o(n^2)。這種算法需要事先說明所要求的資源,即當進程pi開始執行是,所有需求邊必須先處於資源分配圖中。

b,銀行家算法

由於時間和精力有限,也由於銀行家算法比較經典,所以銀行家算法將在下一篇博文中講解。感謝您的閱讀。





發佈了65 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章