1. 程式人生 > >死鎖以及死鎖的避免方法

死鎖以及死鎖的避免方法

 一、要點提示

 二、內容簡介

  在計算機系統中有很多一次只能由一個程序使用的資源,如印表機,磁帶機,一個檔案的I節點等。在多道程式設計環境中,若干程序往往要共享這類資源,而且一個程序所需要的資源不止一個。這樣,就會出現若干程序競爭有限資源,又推進順序不當,從而構成無限期迴圈等待的局面。這種狀態就是死鎖。系統發生死鎖現象不僅浪費大量的系統資源,甚至導致整個系統崩潰,帶來災難性後果。所以,對於死鎖問題在理論上和技術上都必須給予高度重視。

  死鎖是程序死鎖的簡稱,是由Dijkstra於1965年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。

1.什麼是死鎖

  我們先看看這樣一個生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車通過,無法讓兩輛汽車並行。如果有兩輛汽車A和B分別由橋的兩端駛上該橋,則對於A車來說,它走過橋面左面的一段路(即佔有了橋的一部分資源),要想過橋還須等待B車讓出右邊的橋面,此時A車不能前進;對於B車來說,它走過橋面右邊的一段路(即佔有了橋的一部分資源),要想過橋還須等待A車讓出左邊的橋面,此時B車也不能前進。兩邊的車都不倒車,結果造成互相等待對方讓出橋面,但是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。如果把汽車比做程序,橋面作為資源,那麼上述問題就描述為:程序A佔有資源R1,等待程序B佔有的資源Rr;程序B佔有資源Rr,等待程序A佔有的資源R1。而且資源R1和Rr只允許一個程序佔用,即:不允許兩個程序同時佔用。結果,兩個程序都不能繼續執行,若不採取其它措施,這種迴圈等待狀況會無限期持續下去,就發生了程序死鎖。  

  在計算機系統中,涉及軟體,硬體資源都可能發生死鎖。例如:系統中只有一臺CD-ROM驅動器和一臺印表機,某一個程序佔有了CD-ROM驅動器,又申請印表機;另一程序佔有了印表機,還申請CD-ROM。結果,兩個程序都被阻塞,永遠也不能自行解除。

  所謂死鎖,是指多個程序迴圈等待它方佔有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個程序都將永遠處於封鎖狀態。從上面的例子可以看出,計算機系統產生死鎖的根本原因就是資源有限且操作不當。即:一種原因是系統提供的資源太少了,遠不能滿足併發程序對資源的需求。這種競爭資源引起的死鎖是我們要討論的核心。例如:訊息是一種臨時性資源。某一時刻,程序A等待程序B發來的訊息,程序B等待程序C發來的訊息,而程序C又等待程序A發來的訊息。訊息未到,A,B,C三個程序均無法向前推進,也會發生程序通訊上的死鎖。另一種原因是由於程序推進順序不合適引發的死鎖。資源少也未必一定產生死鎖。就如同兩個人過獨木橋,如果兩個人都要先過,在獨木橋上僵持不肯後退,必然會應競爭資源產生死鎖;但是,如果兩個人上橋前先看一看有無對方的人在橋上,當無對方的人在橋上時自己才上橋,那麼問題就解決了。所以,如果程式設計得不合理,造成程序推進的順序不當,也會出現死鎖。

  從以上分析可見,如果在計算機系統中同時具備下面四個必要條件時,那麼會發生死鎖。換句話說,只要下面四個條件有一個不具備,系統就不會出現死鎖。

    〈1〉互斥條件。即某個資源在一段時間內只能由一個程序佔有,不能同時被兩個或兩個以上的程序佔有。這種獨佔資源如CD-ROM驅動器,印表機等等,必須在佔有該資源的程序主動釋放它之後,其它程序才能佔有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨佔資源,兩方的人不能同時過橋。

    〈2〉不可搶佔條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者程序自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放佔有資源),對方的人才能過橋。

    〈3〉佔有且申請條件。程序至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外程序佔有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續佔用已佔有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過一段橋面(即佔有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙佔有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。

    〈4〉迴圈等待條件。存在一個程序等待序列{P1,P2,...,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一源,......,而Pn等待P1所佔有的的某一資源,形成一個程序迴圈等待環。就像前面的過獨木橋問題,甲等待乙佔有的橋面,而乙又等待甲佔有的橋面,從而彼此迴圈等待。

  上面我們提到的這四個條件在死鎖時會同時發生。也就是說,只要有一個必要條件不滿足,則死鎖就可以排除。

  前面介紹了死鎖發生時的四個必要條件,只要破壞這四個必要條件中的任意一個條件,死鎖就不會發生。這就為我們解決死鎖問題提供了可能。一般地,解決死鎖的方法分為死鎖的預防,避免,檢測與恢復三種(注意:死鎖的檢測與恢復是一個方法)。我們將在下面分別加以介紹。

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

   〈1〉打破互斥條件。即允許程序同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像印表機等等,這是由資源本身的屬性所決定的。所以,這種辦法並無實用價值。

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

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

(1)在許多情況下,一個程序在執行之前不可能知道它所需要的全部資源。這是由於程序在執行時是動態的,不可預測的;

(2)資源利用率低。無論所分資源何時用到,一個程序只有在佔有所需的全部資源後才能執行。即使有些資源最後才被該程序用到一次,但該程序在生存期間卻一直佔有它們,造成長期佔著不用的狀況。這顯然是一種極大的資源浪費;

(3)降低了程序的併發性。因為資源有限,又加上存在浪費,能分配到所需全部資源的程序個數就必然少了。    

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

(1)限制了程序對資源的請求,同時給系統中所有資源合理編號也是件困難事,並增加了系統開銷;

(2)為了遵循按編號申請的次序,暫不使用的資源也需要提前申請,從而增加了程序對資源的佔用時間。

8.3 死鎖的避免  

  上面我們講到的死鎖預防是排除死鎖的靜態策略,它使產生死鎖的四個必要條件不能同時具備,從而對程序申請資源的活動加以限制,以保證死鎖不會發生。下面我們介紹排除死鎖的動態策略--死鎖的避免,它不限制程序有關申請資源的命令,而是對程序所發出的每一個申請資源命令加以動態地檢查,並根據檢查結果決定是否進行資源分配。就是說,在資源分配過程中若預測有發生死鎖的可能性,則加以避免。這種方法的關鍵是確定資源分配的安全性。

1.安全序列

  我們首先引入安全序列的定義:所謂系統是安全的,是指系統中的所有程序能夠按照某一種次序分配資源,並且依次地執行完畢,這種程序序列{P1,P2,...,Pn}就是安全序列。如果存在這樣一個安全序列,則系統是安全的;如果系統不存在這樣一個安全序列,則系統是不安全的。

  安全序列{P1,P2,...,Pn}是這樣組成的:若對於每一個程序Pi,它需要的附加資源可以被系統中當前可用資源加上所有程序Pj當前佔有資源之和所滿足,則{P1,P2,...,Pn}為一個安全序列,這時系統處於安全狀態,不會進入死鎖狀態。  

  雖然存在安全序列時一定不會有死鎖發生,但是系統進入不安全狀態(四個死鎖的必要條件同時發生)也未必會產生死鎖。當然,產生死鎖後,系統一定處於不安全狀態。 

2.銀行家演算法

  這是一個著名的避免死鎖的演算法,是由Dijstra首先提出來並加以解決的。 

  [背景知識] 

  一個銀行家如何將一定數目的資金安全地借給若干個客戶,使這些客戶既能借到錢完成要乾的事,同時銀行家又能收回全部資金而不至於破產,這就是銀行家問題。這個問題同作業系統中資源分配問題十分相似:銀行家就像一個作業系統,客戶就像執行的程序,銀行家的資金就是系統的資源。

  [問題的描述]

  一個銀行家擁有一定數量的資金,有若干個客戶要貸款。每個客戶須在一開始就宣告他所需貸款的總額。若該客戶貸款總額不超過銀行家的資金總數,銀行家可以接收客戶的要求。客戶貸款是以每次一個資金單位(如1萬RMB等)的方式進行的,客戶在借滿所需的全部單位款額之前可能會等待,但銀行家須保證這種等待是有限的,可完成的。

  例如:有三個客戶C1,C2,C3,向銀行家借款,該銀行家的資金總額為10個資金單位,其中C1客戶要借9各資金單位,C2客戶要借3個資金單位,C3客戶要借8個資金單位,總計20個資金單位。某一時刻的狀態如圖所示。

C1 2(7)
C2 2(1)
C3 4(4)
餘額2
C1 2(7)
C3 4(4)

餘額4

C1 2(7)
餘額8

餘額10

    (a)

     (b)

     (c)

     (d)

                                       銀行家演算法示意

  對於a圖的狀態,按照安全序列的要求,我們選的第一個客戶應滿足該客戶所需的貸款小於等於銀行家當前所剩餘的錢款,可以看出只有C2客戶能被滿足:C2客戶需1個資金單位,小銀行家手中的2個資金單位,於是銀行家把1個資金單位借給C2客戶,使之完成工作並歸還所借的3個資金單位的錢,進入b圖。同理,銀行家把4個資金單位借給C3客戶,使其完成工作,在c圖中,只剩一個客戶C1,它需7個資金單位,這時銀行家有8個資金單位,所以C1也能順利借到錢並完成工作。最後(見圖d)銀行家收回全部10個資金單位,保證不賠本。那麼客戶序列{C1,C2,C3}就是個安全序列,按照這個序列貸款,銀行家才是安全的。否則的話,若在圖b狀態時,銀行家把手中的4個資金單位借給了C1,則出現不安全狀態:這時C1,C3均不能完成工作,而銀行家手中又沒有錢了,系統陷入僵持局面,銀行家也不能收回投資。

  綜上所述,銀行家演算法是從當前狀態出發,逐個按安全序列檢查各客戶誰能完成其工作,然後假定其完成工作且歸還全部貸款,再進而檢查下一個能完成工作的客戶,......。如果所有客戶都能完成工作,則找到一個安全序列,銀行家才是安全的。

  從上面分析看出,銀行家演算法允許死鎖必要條件中的互斥條件,佔有且申請條件,不可搶佔條件的存在,這樣,它與預防死鎖的幾種方法相比較,限制條件少了,資源利用程度提高了。

這是該演算法的優點。其缺點是:

   〈1〉這個演算法要求客戶數保持固定不變,這在多道程式系統中是難以做到的。   

   〈2〉這個演算法保證所有客戶在有限的時間內得到滿足,但實時客戶要求快速響應,所以要考慮這個因素。  

    〈3〉由於要尋找一個安全序列,實際上增加了系統的開銷。

8.4 死鎖的檢測與恢復  

  一般來說,由於作業系統有併發,共享以及隨機性等特點,通過預防和避免的手段達到排除死鎖的目的是很困難的。這需要較大的系統開銷,而且不能充分利用資源。為此,一種簡便的方法是系統為程序分配資源時,不採取任何限制性措施,但是提供了檢測和解脫死鎖的手段:能發現死鎖並從死鎖狀態中恢復出來。因此,在實際的作業系統中往往採用死鎖的檢測與恢復方法來排除死鎖。

  死鎖檢測與恢復是指系統設有專門的機構,當死鎖發生時,該機構能夠檢測到死鎖發生的位置和原因,並能通過外力破壞死鎖發生的必要條件,從而使得併發程序從死鎖狀態中恢復出來。

  圖中所示為一個小的死鎖的例子。這時程序P1佔有資源R1而申請資源R2,程序P2佔有資源R2而申請資源R1,按迴圈等待條件,程序和資源形成了環路,所以系統是死鎖狀態。程序P1,P2是參與死鎖的程序。

  下面我們再來看一看死鎖檢測演算法。演算法使用的資料結構是如下這些:      

      佔有矩陣A:n*m階,其中n表示併發程序的個數,m表示系統的各類資源的個數,這個矩陣記錄了每一個程序當前佔有各個資源類中資源的個數。

       申請矩陣R:n*m階,其中n表示併發程序的個數,m表示系統的各類資源的個數,這個矩陣記錄了每一個程序當前要完成工作需要申請的各個資源類中資源的個數。

       空閒向量T:記錄當前m個資源類中空閒資源的個數。

       完成向量F:布林型向量值為真(true)或假(false),記錄當前n個併發程序能否進行完。為真即能進行完,為假則不能進行完。

       臨時向量W:開始時W:=T。

演算法步驟:

     (1)W:=T,

     對於所有的i=1,2,...,n,

     如果A[i]=0,則F[i]:=true;否則,F[i]:=false

     (2)找滿足下面條件的下標i:

     F[i]:=false並且R[i]〈=W

     如果不存在滿足上面的條件i,則轉到步驟(4)。

     (3)W:=W+A[i]

     F[i]:=true

     轉到步驟(2)

     (4)如果存在i,F[i]:=false,則系統處於死鎖狀態,且Pi程序參與了死鎖。什麼時候進行死鎖的檢測取決於死鎖發生的頻率。如果死鎖發生的頻率高,那麼死鎖檢測的頻率也要相應提高,這樣一方面可以提高系統資源的利用率,一方面可以避免更多的程序捲入死鎖。如果程序申請資源不能滿足就立刻進行檢測,那麼每當死鎖形成時即能被發現,這和死鎖避免的演算法相近,只是系統的開銷較大。為了減小死鎖檢測帶來的系統開銷,一般採取每隔一段時間進行一次死鎖檢測,或者在CPU的利用率降低到某一數值時,進行死鎖的檢測。 

2.死鎖的恢復  

  一旦在死鎖檢測時發現了死鎖,就要消除死鎖,使系統從死鎖狀態中恢復過來。  

    (1)最簡單,最常用的方法就是進行系統的重新啟動,不過這種方法代價很大,它意味著在這之前所有的程序已經完成的計算工作都將付之東流,包括參與死鎖的那些程序,以及未參與死鎖的程序。

    (2)撤消程序,剝奪資源。終止參與死鎖的程序,收回它們佔有的資源,從而解除死鎖。這時又分兩種情況:一次性撤消參與死鎖的全部程序,剝奪全部資源;或者逐步撤消參與死鎖的程序,逐步收回死鎖程序佔有的資源。一般來說,選擇逐步撤消的程序時要按照一定的原則進行,目的是撤消那些代價最小的程序,比如按程序的優先順序確定程序的代價;考慮程序執行時的代價和與此程序相關的外部作業的代價等因素。 

  此外,還有程序回退策略,即讓參與死鎖的程序回退到沒有發生死鎖前某一點處,並由此點處繼續執行,以求再次執行時不再發生死鎖。雖然這是個較理想的辦法,但是操作起來系統開銷極大,要有堆疊這樣的機構記錄程序的每一步變化,以便今後的回退,有時這是無法做到的。

相關推薦

以及避免方法

 一、要點提示  二、內容簡介   在計算機系統中有很多一次只能由一個程序使用的資源,如印表機,磁帶機,一個檔案的I節點等。在多道程式設計環境中,若干程序往往要共享這類資源,而且一個程序所需要的資源不止一個。這樣,就會出現若干程序競爭有限資源,又推進順序不當,從而構成無限期迴圈等待的

Java並發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

RF -- 指針 locking water 更多 錯誤 創建 判斷 首先介紹一些樂觀鎖與悲觀鎖: 悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會阻塞直到它拿到鎖。傳統的關系型數據庫裏邊就用到了很多這

【轉】Java併發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

首先介紹一些樂觀鎖與悲觀鎖: 悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上

Java併發問題--樂觀與悲觀以及樂觀的一種實現方式-CAS

首先介紹一些樂觀鎖與悲觀鎖:   悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

mysql悲觀以及樂觀總結和實踐

注:本文乃轉載,原文作者@青蔥歲月 悲觀鎖介紹(百科): 悲觀鎖,正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層

sqlserver查詢以及

_id object HERE entity serve source associate ESS type 查詢鎖: SELECT request_session_id spid, OBJECT_NAME( resource_associated_entity

Java多執行緒----執行緒的同步,,問題以及解決方法(例子說明)

一、執行緒併發同步概念 執行緒同步其核心就在於一個“同”。所謂“同”就是協同、協助、配合,“同步”就是協同步調昨,也就是按照預定的先後順序進行執行,即“你先,我等, 你做完,我再做”。 執行緒同步,就是當執行緒發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不會返回,其他

原因,解決,避免方法及哲學家就餐問題

死鎖的四大條件: 互斥:資源不能共享,只能由一個程序持有 佔有且等待:當一個等待另外程序而阻塞時,資源不主動釋放 不可搶佔:作業系統不能強行搶佔被程序持有的資源 迴圈等待:存在一個封閉的程序鏈,使得每一個程序都至少佔有下個程序所需要的資源。 這個四個資

多執行緒以及解決方法

解決死鎖沒有簡單的方法,這是因為執行緒產生死鎖都各有各的原因,而且往往具有很高的負載。大多數軟體測試產生不了足夠多的負載,所以不可能暴露所有的執行緒錯誤。在這裡中,下面將討論開發過程常見的4類典型的死

的原理及避免方法

死鎖 所謂死鎖,指的是兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,如果無外力作用,那麼它們都將無法推進下去。此時,稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。 舉例說明死鎖:如果一

Java以及命令檢測

阻塞 one found font pat rgs strong thread ron Java每個對象都有一把鎖,當前進程使用對象鎖1,沒有釋放該鎖,又想要去獲取另一把對象鎖2,而對象鎖2被另外一個線程持有,沒有釋放,這就很容易出現死鎖 1.死鎖實例 public cl

mysql 開發進階篇系列 14 問題(避免查看分析)

mysq cit 優化 業務流程 update span tro isp 問題 一. 概述   通常來說,死鎖都是應用設計問題,通過調整業務流程,數據庫對象設計,事務大小,以及訪問數據庫的sql語句,絕大部分死鎖都可以避免,下面介紹幾種避免死鎖的常用 方法.  1. 在應

Oracle中發生表加的原因,檢視,與解決方法

一.表加鎖、死鎖出現的現象 1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變 2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象 【加鎖的原理】:比如一個操作在進行修改一表,它

資料庫_荔枝_解決方法

轉自高效能mysql;   【1.3.2】死鎖 1)死鎖定義:指兩個或多個事務在同一資源上相互佔用, 並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象; 當多個事務試圖以不同順序鎖定資源時,就可能產生死鎖;多個事務同時鎖定同一個資源時,也會產生死鎖; 2)死鎖解決方法

物件和變數的併發訪問synchronized解析以及分析排查

一.synchronized   “非執行緒安全"是指發生在多個執行緒對同一個物件中的例項變數併發訪問時,產生的”髒讀“現象。synchronized同步處理可解決這一問題。 非執行緒安全問題存在於例項變數中,不存在方法內部的私有變數。 1、synchronized修飾方法的兩種情

通過順序來避免動態的順序

通過鎖順序來避免動態的鎖順序死鎖 歡迎關注作者部落格 簡書傳送門 前言   兩個執行緒試圖通過不同的順序獲取多個相同的鎖。如果請求的順序不相同,那麼會出現迴圈的鎖依賴現象,產生死鎖。但是如果保證同時請求鎖L和鎖M的每一個執行緒,都是按照從 L 到 M 的順

#Java中活有什麼區別?如何避免

Java中活鎖和死鎖是指什麼,你知道他們之間的區別嗎,下面我們可以來討論一下: 如果有想要學習java的小夥伴,可來我們的java學習扣裙哦:72340,3928裡面贈送java系列教學視訊和資料!小編也是從事了6年java開發的全棧工程師,歡迎初學者和想要進階

執行緒池實現原理(Executor框架),java提供常用的幾種執行緒池、產生條件和避免

 為什麼使用執行緒池 伺服器應用程式中經常出現的情況是:單個任務處理的時間很短而請求的數目卻是巨大的。如果每個請求對應一個執行緒(thread-per-request)方法的不足之一是:為每個請求建立一個新執行緒的開銷很大;為每個請求建立新執行緒的伺服器在建立和銷燬執行緒上

什麼是的必要條件和解決方法

 一、要點提示  二、內容簡介   在計算機系統中有很多一次只能由一個程序使用的資源,如印表機,磁帶機,一個檔案的I節點等。在多道程式設計環境中,若干程序往往要共享這類資源,而且一個程序所需要的資源不止一個。這樣,就會出現若干程序競爭有限資源,又推進順序不當,從而構成無限期迴圈等待的局面。

的四個必要條件、預防、避免和銀行家演算法及解題過程

死鎖: 死鎖是指多個程序因競爭資源而造成的一種僵局(互相等待),每個程序都在等待某個事件發生,而只有這組程序中的其他程序才能觸發該事件,這就稱這組程序發生了死鎖。若無外力作用,這些程序都將無法向前推進。 如,在某一個計算機系統中只有一臺印表機和一臺輸入 裝置,程序P1正佔