死鎖是什么原因
死鎖是什么原因
死鎖是什么?死鎖是什么原因?死鎖的預防方法有哪些?下面就由學習啦小編告訴大家吧!
死鎖是什么
死鎖(Deadlock),這里指的是進程死鎖,是個計算機技術名詞。它是操作系統(tǒng)或軟件運行的一種狀態(tài):在多任務系統(tǒng)下,當一個或多個進程等待系統(tǒng)資源,而資源又被進程本身或其它進程占用時,就形成了死鎖。由于資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協(xié)助下,永遠分配不到必需的資源而無法繼續(xù)運行,這就產(chǎn)生了一種特殊現(xiàn)象。
死鎖是什么原因
1.競爭資源引起進程死鎖
當系統(tǒng)中供多個進程共享的資源如打印機、公用隊列的等,其數(shù)目不足以滿足諸進程的需要時,會引起諸進程對資源的競爭而產(chǎn)生死鎖。
1)可剝奪資源和不可剝奪資源
系統(tǒng)中的資源可以分為兩類,一類是可剝奪資源,是指某進程在獲得這類資源后,該資源可以再被其他進程或系統(tǒng)剝奪。例如,優(yōu)先權高的進程可以剝奪優(yōu)先權低的進程的處理機。又如,內(nèi)存區(qū)可由存儲器管理程序,把一個進程從一個存儲區(qū)移到另一個存儲區(qū),此即剝奪了該進程原來占有的存儲區(qū),甚至可將一進程從內(nèi)存調(diào)到外存上,可見,CPU和主存均屬于可剝奪性資源。另一類資源是不可剝奪資源,當系統(tǒng)把這類資源分配給某進程后,再不能強行收回,只能在進程用完后自行釋放,如磁帶機、打印機等。
2)競爭不可剝奪資源
在系統(tǒng)中所配置的不可剝奪資源,由于它們的數(shù)量不能滿足諸進程運行的需要,會使進程在運行過程中,因爭奪這些資源而陷于僵局。例如,系統(tǒng)中只有一臺打印機R1和一臺磁帶機R2,可供進程P1和P2共享。假定PI已占用了打印機R1,P2已占用了磁帶機R2,若P2繼續(xù)要求打印機R1,P2將阻塞;P1若又要求磁帶機,P1也將阻塞。于是,在P1和P2之間就形成了僵局,兩個進程都在等待對方釋放自己所需要的資源,但是它們又都因不能繼續(xù)獲得自己所需要的資源而不能繼續(xù)推進,從而也不能釋放自己所占有的資源,以致進入死鎖狀態(tài)。
3)競爭臨時資源
上面所說的打印機資源屬于可順序重復使用型資源,稱為永久資源。還有一種所謂的臨時資源,這是指由一個進程產(chǎn)生,被另一個進程使用,短時間后便無用的資源,故也稱為消耗性資源,如硬件中斷、信號、消息、緩沖區(qū)內(nèi)的消息等,它也可能引起死鎖。例如,SI,S2,S3是臨時性資源,進程P1產(chǎn)生消息S1,又要求從P3接收消息S3;進程P3產(chǎn)生消息S3,又要求從進程P2處接收消息S2;進程P2產(chǎn)生消息S2,又要求從P1處接收產(chǎn)生的消息S1。如果消息通信按如下順序進行:
P1:···Relese(S1);Request(S3);···
P2:···Relese(S2);Request(S1);···
P3:···Relese(S3);Request(S2);···
并不可能發(fā)生死鎖。但若改成下述的運行順序:
P1:···Request(S3);Relese(S1);···
P2:···Request(S1);Relese(S2);···
P3:···Request(S2);Relese(S3);···
則可能發(fā)生死鎖。
2.進程推進順序不當引起死鎖
由于進程在運行中具有異步性特征,這可能使P1和P2兩個進程按下述兩種順序向前推進。
1)進程推進順序合法
當進程P1和P2并發(fā)執(zhí)行時,如果按照下述順序推進:P1:Request(R1);P1:Request(R2);P1:Relese(R1);P1:Relese(R2);P2:Request(R2);P2:Request(R1);P2:Relese(R2);P2:Relese(R1);這兩個進程便可順利完成,這種不會引起進程死鎖的推進順序是合法的。
2)進程推進順序非法
若P1保持了資源R1,P2保持了資源R2,系統(tǒng)處于不安全狀態(tài),因為這兩個進程再向前推進,便可能發(fā)生死鎖。例如,當P1運行到P1:Request(R2)時,將因R2已被P2占用而阻塞;當P2運行到P2:Request(R1)時,也將因R1已被P1占用而阻塞,于是發(fā)生進程死鎖。
死鎖的預防方法
理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統(tǒng)設計、進程調(diào)度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久占據(jù)系統(tǒng)資源。此外,也要防止進程在處于等待狀態(tài)的情況下占用資源,在系統(tǒng)運行過程中,對進程發(fā)出的每一個系統(tǒng)能夠滿足的資源申請進行動態(tài)檢查,并根據(jù)檢查結果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。因此,對資源的分配要給予合理的規(guī)劃。
下面幾種方法可用以避免重裝死鎖的發(fā)生:
?、僭试S目的節(jié)點將不完整的報文遞交給目的端系統(tǒng);
?、谝粋€不能完整重裝的報文能被檢測出來,并要求發(fā)送該報文的源端系統(tǒng)重新傳送;
③為每個節(jié)點配備一個后備緩沖空間,用以暫存不完整的報文。
?、?、②兩種方法不能很滿意地解決重裝死鎖,因為它們使端系統(tǒng)中的協(xié)議復雜化了。一般的設計中,網(wǎng)絡層應該對端系統(tǒng)透明,也即端系統(tǒng)不該考慮諸如報文拆、裝之類的事。③方法雖然不涉及端系統(tǒng),但使每個節(jié)點增加了開銷。
有序資源分配法
這種算法資源按某種規(guī)則系統(tǒng)中的所有資源統(tǒng)一編號(例如打印機為1、磁帶機為2、磁盤為3、等等),申請時必須以上升的次序。系統(tǒng)要求申請進程:
1、對它所必須使用的而且屬于同一類的所有資源,必須一次申請完;
2、在申請不同類資源時,必須按各類設備的編號依次申請。例如:進程PA,使用資源的順序是R1,R2;進程PB,使用資源的順序是R2,R1;若采用動態(tài)分配有可能形成環(huán)路條件,造成死鎖。
采用有序資源分配法:R1的編號為1,R2的編號為2;
PA:申請次序應是:R1,R2
PB:申請次序應是:R1,R2
這樣就破壞了環(huán)路條件,避免了死鎖的發(fā)生
銀行算法
避免死鎖算法中最有代表性的算法是DijkstraE.W于1968年提出的銀行家算法:
該算法需要檢查申請者對資源的最大需求量,如果系統(tǒng)現(xiàn)存的各類資源可以滿足申請者的請求,就滿足申請者的請求。
這樣申請者就可很快完成其計算,然后釋放它占用的資源,從而保證了系統(tǒng)中的所有進程都能完成,所以可避免死鎖的發(fā)生。