死鎖的定義在多道程序系統中,由于多個進程的并發執行,改善了系統資源的利用率并提高了系統 的處理能力。然而,多個進程的并發執行也帶來了新的問題——死鎖。所謂死鎖是指多個進 程因競争資源而...
關鍵詞:進程, 資源, 等待, 死鎖, 請求
死鎖的定義在多道程序系統中,由于多個進程的并發執行,改善了系統資源的利用率并提高了系統 的處理能力。然而,多個進程的并發執行也帶來了新的問題——死鎖。所謂死鎖是指多個進 程因競争資源而造成的一種僵局(互相等待),若無外力作用,這些進程都将無法向前推進。
下面我們通過一些實例來說明死鎖現象。
先看生活中的一個實例,在一條河上有一座橋,橋面很窄,隻能容納一輛汽車通行。如 果有兩輛汽車分别從橋的左右兩端駛上該橋,則會出現下述的沖突情況。此時,左邊的汽車 占有了橋面左邊的一段,要想過橋還需等待右邊的汽車讓出橋面右邊的一段;右邊的汽車站 有了橋面右邊的一段,要想過橋還需等待左邊的汽車讓出橋面左邊的一段。此時,若左右兩 邊的汽車都隻能向前行駛,則兩輛汽車都無法過橋。
在計算機系統中也存在類似的情況。例如,某計算機系統中隻有一台打印機和一台輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,但此時打印機正被進程P2 所占用,而P2在未釋放打印機之前,又提出請求使用正被P1占用着的輸入設備。這樣兩個進程相互無休止地等待下去,均無法繼續執行,此時兩個進程陷入死鎖狀态。
死鎖産生的原因1) 系統資源的競争
通常系統中擁有的不可剝奪資源,其數量不足以滿足多個進程運行的需要,使得進程在 運行過程中,會因争奪資源而陷入僵局,如磁帶機、打印機等。隻有對不可剝奪資源的競争 才可能産生死鎖,對可剝奪資源的競争是不會引起死鎖的。
2) 進程推進順序非法
進程在運行過程中,請求和釋放資源的順序不當,也同樣會導緻死鎖。例如,并發進程 P1、P2分别保持了資源R1、R2,而進程P1申請資源R2,進程P2申請資源R1時,兩者都 會因為所需資源被占用而阻塞。
信号量使用不當也會造成死鎖。進程間彼此相互等待對方發來的消息,結果也會使得這 些進程間無法繼續向前推進。例如,進程A等待進程B發的消息,進程B又在等待進程A 發的消息,可以看出進程A和B不是因為競争同一資源,而是在等待對方的資源導緻死鎖。
3) 死鎖産生的必要條件
産生死鎖必須同時滿足以下四個條件,隻要其中任一條件不成立,死鎖就不會發生。
互斥條件:進程要求對所分配的資源(如打印機)進行排他性控制,即在一段時間内某 資源僅為一個進程所占有。此時若有其他進程請求該資源,則請求進程隻能等待。
不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即隻能 由獲得該資源的進程自己來釋放(隻能是主動釋放)。
請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
循環等待條件:存在一種進程資源的循環等待鍊,鍊中每一個進程已獲得的資源同時被 鍊中下一個進程所請求。即存在一個處于等待狀态的進程集合{Pl, P2, …, pn},其中Pi等 待的資源被P(i 1)占有(i=0, 1, …, n-1),Pn等待的資源被P0占有,如圖2-15所示。
直觀上看,循環等待條件似乎和死鎖的定義一樣,其實不然。按死鎖定義構成等待環所 要求的條件更嚴,它要求Pi等待的資源必須由P(i 1)來滿足,而循環等待條件則無此限制。 例如,系統中有兩台輸出設備,P0占有一台,PK占有另一台,且K不屬于集合{0, 1, …, n}。
Pn等待一台輸出設備,它可以從P0獲得,也可能從PK獲得。因此,雖然Pn、P0和其他 一些進程形成了循環等待圈,但PK不在圈内,若PK釋放了輸出設備,則可打破循環等待, 如圖2-16所示。因此循環等待隻是死鎖的必要條件。
資源分配圖含圈而系統又不一定有死鎖的原因是同類資源數大于1。但若系統中每類資 源都隻有一個資源,則資源分配圖含圈就變成了系統出現死鎖的充分必要條件。
文章來源于C語言中文網
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!