計算及操作系統--死鎖

目錄

什麼是死鎖
死鎖形成的原因
死鎖的必要條件
死鎖的預防

什麼是死鎖

死鎖指的是兩個或兩個以上的進程在執行過程中,因爲爭奪資源而造成一種互相等待的狀態,如果不借助外力的話他們將無法推進下去。在多任務操作系統中,操作系統爲了協調不同行程,能否獲取系統資源時,爲了讓系統運作,必須要解決問題。

死鎖形成的原因

  1. 系統資源不足。
  2. 進程運行推進的順序不合適。
  3. 資源分配不等。

死鎖的必要條件

  • 互斥:每個資源要麼已經分配給了一個進程,要麼就是可用的。
  • 佔有和等待:一個進程可以在等待時持有系統資源。
  • 不可搶佔:已經分配給一個進程的資源不能強制性地被搶佔,它只能被佔有它的進程顯示地釋放。
  • 循環等待:有兩個或兩個以上的進程組成一條環路,該環路中的每個進程都在等待下一個進程所佔有的資源。

死鎖的預防

死鎖只有在四個必要條件同事滿足時出現。預防死鎖就是至少破壞這四個條件其中之一,即破壞“互斥”,“不可搶佔”,“循環等待”,“佔有和等待”

處理方法

  • 鴕鳥策略
  • 死鎖檢測與死鎖恢復
  • 死鎖預防
  • 死鎖避免

鴕鳥策略

把投埋進沙子裏,假裝沒有發生問題。
因爲解決死鎖問題的代價很高,因爲鴕鳥策略這種不採取任務措施的方案會獲得更高的性能。
當發生死鎖時不會對用戶造成多大影響,或發生死鎖的概率很低,可以採用鴕鳥策略。

死鎖檢測與死鎖恢復

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

在這裏插入圖片描述
此圖片取自CyC2018的github
上圖爲資源分配圖,其中方框表示資源,圓圈表示進程,資源指向進程表示該資源已經分配給該進程,進程指向資源表示進程請求獲取該資源。
圖a可以抽取出環,如圖b,它滿足了循環等待的條件,因此會發生死鎖。
每種類型一個資源的死鎖檢測算法是通過檢測有向圖是否存在環來實現,從一個節點出發進行深度優先搜索,對訪問過的節點進行標記,如果訪問了已經標記的節點,就表示有向圖存在環,也就是檢測到死鎖的發生。

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

在這裏插入圖片描述
此圖片取自CyC2018的github
上圖中,有三個進程四個資源,每個數據代表的含義如下:

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

進程p1和p2所請求的資源都得不到滿足,只有進程p3可以,讓p3執行,之後釋放p3擁有的資源,此時A=(2 2 2 0).p2可以執行,執行後釋放p2擁有的資源,A=(4 2 2 1).p1也可以執行,所有進程都可以順利執行,沒有死鎖。
算法總結如下:
每個進程最開始都不被標記,執行過程有可能被標記。當算法結束時,任何沒有被標記的進程都是死鎖進程。

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

死鎖恢復

  • 利用搶佔恢復:一次性撤銷參與死鎖的全部進程,剝奪全部資源,或者是逐步撤銷參與死鎖的進程,逐步收回死鎖進程佔有的資源
  • 利用回滾恢復:讓參與死鎖的進程回到沒有發生死鎖錢某一點處,並由此點處繼續執行,以求再次執行時不再發生死鎖,這個操作的缺點就是操作起來開銷大,而且要有專門的機構來記錄每一步的變化,以便今後的回退。
  • 通過殺死進程恢復:最常用的就是系統的重新啓動,不過代價比很大。

死鎖預防

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

  • 破壞互斥條件:即允許進程同時訪問某些資源,但是,有的資源是不允許被同時訪問的,像打印機等等,這是資源本身屬性所決定的。所以這種辦法並無使用價值。

  • 破環不可剝削條件:允許進程強行從佔有者那裏奪取某些資源。就是說,當一個進程已佔有了某些資源,它又申請新的資源,但不能立即被滿足時,他必須釋放所佔有的全部資源,以後重新申請。它所釋放的資源可以分配給其他進程,這就相當於該進程佔有的資源被強佔了這種預防死鎖的方法實現起來困難,會降低系統性能。

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

    1.在許多情況下,一個進程在執行之前不可能直到它所需要的全部資源,這是由於進程在執行時是動態的,不可預測的。
    2.資源地利用率低,無論資源何時用到,一個進程只有在佔有所需的全部資源後才能執行。及時有些資源最後才被該進程用到一次,但該進程在生存期間卻一直佔有他們,造成長期佔着不用狀態。這是資源的極大浪費。
    3.降低了進程的併發性。因爲資源有限,又加上存在浪費,能分配到所需全部資源的進程個數就必然少

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

    1.限制了進程對資源的請求,同時給系統中所有資源合理編號也是件困難事,並增加系統開銷
    2.爲了遵循按標編號申請的次序,暫不使用的資源也需要提前申請,從而增加了進程對資源的佔用時間。

死鎖避免

  • 上面講到的死鎖預防時排除死鎖的靜態策略,它使產生死鎖的四個必要條件不能同時具備,從而對進程申請資源的活動加以限制,以保證死鎖不會發生。下面我們介紹排除死鎖的動態策略–死鎖的避免,它不限制進程有關申請資源的命令,而是對進程所發出的每一個申請資源命令加以動態檢查,並根據檢查結果決定是否進行資源分配。就是說,在資源分配過程中若預測有發生死鎖的可能性,則加以避免。這種方法的關鍵是確定資源分配的安全性。
安全序列
  • 所謂安全序列,是指系統中的所有進程能夠按照某一種次序分配資源,並且依次地運行完畢,這種進程序列{p1,p2,…pn}就是安全序列。如果存在這樣的安全序列,則系統是安全的,如果不存在系統則不安全。
  • 安全序列{p1,p2,…,pn}是這樣的,若對於每一給進程pi,它需要的附加資源可以被系統中當前可用資源加上所有進程pj當前佔有資源之和所滿足,則{p1,p2,…pn}爲一個安全序列,這時系統處於安全狀態,不會進入死鎖狀態。
銀行家算法

是一個著名的避免死鎖的算法
問題描述:一個銀行家擁有一定數量的資金,有若干個客戶要貸款,每個客戶需要在一開始貸款之前申明自己所需貸款的總額,若該客戶貸款總額不超過銀行家的資金總數,銀行家可以接受客戶的要求。客戶在減貸款之前可能會等待,但是銀行家需要保證這種等待是有限的,可完成的。
銀行家算法允許死鎖必要條件的互斥,佔有和等待,不可搶佔的存在,這樣它與預防死鎖的幾種方法相比較,限制條件少了,資源利用程度提高了。
銀行家算法的缺點:

1.要求客戶數保持不變,這在多道程序中難以做到。
2.這個算法保證所有客戶在有限的時間內得到滿足,但實時客戶要求快速響應,所以要考慮這個因素。(分配的時間得不到保證)
3.由於要尋找一個安全序列,實際上增加了系統的開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章