計算機操作系統——死鎖

Table of Contents

 

死鎖必要條件

處理方法

鴕鳥策略

死鎖檢測與死鎖恢復

1.每種類型一個資源的死鎖檢測

2.每種類型多個資源的死鎖檢測

3.死鎖恢復

死鎖預防

1.破壞互斥條件

2.破壞佔有和等待條件

3.破壞不可搶佔條件

4.破壞環路等待條件

死鎖避免

1.安全狀態

2.單個資源的銀行家算法

3.多個資源的銀行家算法


死鎖必要條件

  1. 互斥:每個資源要麼已經分配給了一個進程,要麼就是可用的。
  2. 佔有和等待:已經得到了某個資源的進程可以再請求新的資源。
  3. 不可搶佔:已經分配給一個進程的資源不能強制性地被搶佔,它只能被佔用它地進程顯式地釋放。
  4. 環路等待:有兩個或者兩個以上的進程組成一條環路,該環路中的每個進程都在等待下一個進程所佔用的資源。

處理方法

主要有以下四個方法:

  1. 鴕鳥策略
  2. 死鎖檢測與死鎖恢復
  3. 死鎖預防
  4. 死鎖避免

鴕鳥策略

把頭埋在沙子裏,假裝根本沒發生問題。

因爲解鎖死鎖問題的代價很高,因此鴕鳥策略這種不採取任何措施的方案會獲得更高的性能。

當發生死鎖時不會對用戶造成多大損失,或發生死鎖的概率很低,可以採用鴕鳥策略。

大多數操作系統,包括Unix,Linux和Win,處理死鎖問題的辦法僅僅是忽略它。

死鎖檢測與死鎖恢復

不試圖阻止死鎖,而是當檢測到死鎖發生時,採取措施進行恢復。

1.每種類型一個資源的死鎖檢測

 上圖爲資源分配圖,其中方框表示資源,圓圈表示進程。資源指向進程表示該資源已經分配給該進程,進程指向資源表示進程請求獲取該資源。

圖a可以取出環,如圖b所示,它滿足了環路等待條件,因此會發生死鎖。

每種類型一個資源的死鎖檢測算法是通過檢測有向圖是否存在環來實現,從一個節點出發進行深度優先搜索,對訪問過的節點進行標記,如果訪問了已經標記的節點,就表示有向圖存在環,也就是檢測到了死鎖的發生。

2.每種類型多個資源的死鎖檢測

上圖中,有三個進程四個資源,每個數據代表的含義如下:

  • E向量:資源總量
  • A向量:資源剩餘量
  • C矩陣:每個進程所擁有的資源數量,每一行都代表一個進程擁有資源的數量
  • R矩陣:每個進程請求的資源數量

進程P1和P2所請求的資源都得不到滿足,只有進程P3可以,讓P3執行,之後釋放P3所擁有的資源,此時A=(2 2 2 0)。P2可以執行,執行後釋放P2擁有的資源,A=(4 2 2 1)。P1也可以執行。所有的進程都可以順利執行,沒有死鎖。

 

算法總結如下:

每個進程最開始都不被標記,執行過程有可能被標記。當算法結束時,任何沒有被標記的進程都是死鎖進程。

  1. 尋找一個沒有被標記的進程Pi,它所請求的資源小於等於A。
  2. 如果找到了這樣一個進程,那麼將C矩陣的第i行向量加到A中,標記該進程,並轉回1。
  3. 如果沒有這樣一個進程,算法終止。

3.死鎖恢復

  • 利用搶佔恢復
  • 利用回滾恢復
  • 通過殺死進程恢復

死鎖預防

在程序運行之前預防發生死鎖。

1.破壞互斥條件

例如假脫打印機技術允許若干個進程同時輸出,唯一真正請求物理打印機的進程是打印機守護進程。

2.破壞佔有和等待條件

一種實現方式是規定所有進程在開始執行前請求所需要的全部資源。

3.破壞不可搶佔條件

4.破壞環路等待條件

給資源統一編號,進程只能按照編號順序來請求資源。

死鎖避免

在程序運行時避免發生死鎖。

1.安全狀態

圖a的第二列Has表示已經擁有的資源數,第三列Max表示總共需要的資源數,Free表示還有可以使用的資源數。從圖a開始出發,先讓B擁有所需的所有資源(圖b),運行結束後釋放B,此時Free變成5(圖c);接着以同樣的方式運行C和A,使得所有的進程都能成功運行,因此可以稱圖a所示的狀態是安全的。

定義:如果沒有死鎖發生,並且即使所有進程突然請求對資源的最大需求,也仍然存在某種調度次序能夠使得每一個進程運行完畢,則稱該狀態是安全的。

安全狀態的檢測與死鎖的檢測類似,因爲安全狀態必須要求不能發生死鎖。下面的銀行家算法與死鎖檢測算法非常相似。

2.單個資源的銀行家算法

一個小城鎮的銀行家,他向一羣客戶分別承諾了一定的貸款額度,算法要做的是判斷對請求的滿足是否會進入不安全狀態,如果是,就拒絕請求;否則予以分配。

以上圖c爲不安全狀態,因此算法會拒絕之前的請求,從而避免進入圖c中的狀態。 

3.多個資源的銀行家算法

 上圖中有五個進程,四個資源。左邊的圖表示已經分配的資源,右邊的圖便是還需要分配的資源。最右邊E, P以及A分別表示:總資源、已分配資源以及可用資源,以向量形式表示。

檢查一個狀態是否安全的算法如下:

  • 查找右邊的矩陣是否存在一行小於等於向量A。如果不存在這樣的行,那麼系統將會發生死鎖,狀態是不安全的。
  • 假若找到這樣一行,將該進程標記爲終止,並將其已分配資源加到A中。
  • 重複以上兩步,指導所有進程都標記爲終止,則狀態時安全的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章