死鎖

死鎖概念

死鎖可以定義爲一組相互競爭資源或進行通信的進程間的“永久”阻塞。

死鎖的產生

  • 競爭不可搶佔性資源引起死鎖
    假設有兩個進程A、B
    A和B都需要對文件f1、f2進行寫操作。
    一個進程都必須獨佔f1、f2文件才能進行。
    這裏寫圖片描述
    A、B併發執行,A得到了f1、B得到了f2,A需要f2但在B手裏、B需要f1但在A手裏,他們將無法繼續進行下去,從而形成死鎖。

這裏寫圖片描述

  • 競爭可消耗資源所引起的死鎖

A需要的資源在C手中、C所要資源在B手中、B所要資源在A手中。
類似於三角債。
這裏寫圖片描述

  • 進程推進順序不當引起死鎖
    這裏寫圖片描述

如果A進行到Req(R1)時,B進行到Req(R2)時 就會發生死鎖。
但是如果A先執行完,再執行B就不會發生死鎖。

產生死鎖的必要條件

1. 互斥條件

進程對於分配到的資源進行排他性使用,即在一段時間內
某個資源只能被一個進程佔用

2. 請求和保持條件

進程已經保持了至少一個資源,但是又提出了新的資源需求,而這個新資源又被別的進程佔有
此時請求進程被阻塞,但對自己擁有的資源不釋放。

3. 不可搶佔條件

進程已經獲得的資源在未使用完前不可被搶佔,只能由進程使用完自己釋放。

4. 循環等待條件

在發生死鎖時,必然存在進程等待資源的循環鏈。

處理死鎖的方法

  • 預防死鎖
    預防死鎖的方法是通過破壞產生死鎖的四個必要條件的一個或幾個,以避免發生死鎖。互斥條件是非共享設備所必須的,不僅不可以改變,還需要來保證。只能破壞剩下的三個條件。

    • 破壞“請求和保持條件”
      1、第一種協議
      一次性將進程所需要的資源全部分配,只要有一個沒有就不給分配。
      這樣就破壞了“請求條件”。
      缺點 :

      (1)資源被嚴重浪費,影響資源利用率 進程有可能一開始並不使用獲取到的資源
      (2)使進程時常發生飢餓現象

      2、第二種協議
      該協議爲第一種協議的改進,它允許進程得到初期運行的所需的資源(可不用全要,只要進程可以向前推進)。進程運行過程中逐步釋放佔有資源。

    • 破壞“不可搶佔”條件
      當一個已經保持了某些不可被搶佔資源的進程,提出新的資源請而不能得到滿足時,它必須釋放已經保持的所有資源,待以後使用時再重新申請。

    • 破壞“循環等待”條件
      一個能保持“循環等待”條件不成立的方法是:對系統所有資源類型進行線性排序,並賦予不同的序號。規定每個進程必須按照序號遞增的順序請求資源。一個進程在開始時,可以請求某類資源Ri的單元。以後,當且僅當F(Rj) > F(Ri)時,進程纔可以請求資源Rj的單元。如果需要多個同類資源單元,則必須一起請求。
      例如:當某進程需要打印機和磁帶機時,(假設磁帶機序號低,打印機磁帶序號高),故必先請求磁帶機,再請求打印機。如果進程擁有較高序號的資源,現在請求較低資源序號的資源,它必須釋放所具有相同和更高序號的資源,才能申請低序號的資源。

  • 避免死鎖
    這種方法相對預防死鎖限制條件較弱。

    • 系統安全狀態
      在死鎖避免方法中,把系統的狀態分爲安全狀態和不安全狀態,在系統在安全狀態時,可避免死鎖。
      安全狀態
      在該方法中,允許進程動態地申請資源,但是在系統分配資源之前,會計算此次資源分配的安全性。若此次分配資源不會使系統進入不安全狀態,則系統纔將資源分配出去。反之,進程等待
      安全狀態例子
      假定系統有12臺磁帶機,3個進程。分配情況如圖
    進程 最大需求 已分配 可分配
    p1 10 5 3
    p2 4 2
    p3 9 2

    這時,存在一個安全序列(p2, p3, p1)。
    如果不按照安全序列分配,系統便進入不安全狀態。就會導致死鎖。

    • 利用銀行家算法避免死鎖
      爲實現銀行家算法,每一個新進程在進入系統時,它必須申明在運行過程中,可能需要每種資源類型的最大單元數目,其數目不應超過系統所擁有的資源總量。當進程申請一組資源時,系統必須首先確定是否有足夠的資源分配給該進程。若有,再進一步計算在將這些資源分配給進程後,是否會使系統進入不安全狀態。如果不會,纔將資源分配給它。否則讓進程等待。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章