學(xué)習(xí)啦 > 知識(shí)大全 > 原因大全 > 死鎖是什么原因

死鎖是什么原因

時(shí)間: 曉賢752 分享

死鎖是什么原因

  死鎖是什么?死鎖是什么原因?死鎖的預(yù)防方法有哪些?下面就由學(xué)習(xí)啦小編告訴大家吧!

  死鎖是什么

  死鎖(Deadlock),這里指的是進(jìn)程死鎖,是個(gè)計(jì)算機(jī)技術(shù)名詞。它是操作系統(tǒng)或軟件運(yùn)行的一種狀態(tài):在多任務(wù)系統(tǒng)下,當(dāng)一個(gè)或多個(gè)進(jìn)程等待系統(tǒng)資源,而資源又被進(jìn)程本身或其它進(jìn)程占用時(shí),就形成了死鎖。由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程在無(wú)外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無(wú)法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象。

  死鎖是什么原因

  1.競(jìng)爭(zhēng)資源引起進(jìn)程死鎖

  當(dāng)系統(tǒng)中供多個(gè)進(jìn)程共享的資源如打印機(jī)、公用隊(duì)列的等,其數(shù)目不足以滿足諸進(jìn)程的需要時(shí),會(huì)引起諸進(jìn)程對(duì)資源的競(jìng)爭(zhēng)而產(chǎn)生死鎖。

  1)可剝奪資源和不可剝奪資源

  系統(tǒng)中的資源可以分為兩類(lèi),一類(lèi)是可剝奪資源,是指某進(jìn)程在獲得這類(lèi)資源后,該資源可以再被其他進(jìn)程或系統(tǒng)剝奪。例如,優(yōu)先權(quán)高的進(jìn)程可以剝奪優(yōu)先權(quán)低的進(jìn)程的處理機(jī)。又如,內(nèi)存區(qū)可由存儲(chǔ)器管理程序,把一個(gè)進(jìn)程從一個(gè)存儲(chǔ)區(qū)移到另一個(gè)存儲(chǔ)區(qū),此即剝奪了該進(jìn)程原來(lái)占有的存儲(chǔ)區(qū),甚至可將一進(jìn)程從內(nèi)存調(diào)到外存上,可見(jiàn),CPU和主存均屬于可剝奪性資源。另一類(lèi)資源是不可剝奪資源,當(dāng)系統(tǒng)把這類(lèi)資源分配給某進(jìn)程后,再不能強(qiáng)行收回,只能在進(jìn)程用完后自行釋放,如磁帶機(jī)、打印機(jī)等。

  2)競(jìng)爭(zhēng)不可剝奪資源

  在系統(tǒng)中所配置的不可剝奪資源,由于它們的數(shù)量不能滿足諸進(jìn)程運(yùn)行的需要,會(huì)使進(jìn)程在運(yùn)行過(guò)程中,因爭(zhēng)奪這些資源而陷于僵局。例如,系統(tǒng)中只有一臺(tái)打印機(jī)R1和一臺(tái)磁帶機(jī)R2,可供進(jìn)程P1和P2共享。假定PI已占用了打印機(jī)R1,P2已占用了磁帶機(jī)R2,若P2繼續(xù)要求打印機(jī)R1,P2將阻塞;P1若又要求磁帶機(jī),P1也將阻塞。于是,在P1和P2之間就形成了僵局,兩個(gè)進(jìn)程都在等待對(duì)方釋放自己所需要的資源,但是它們又都因不能繼續(xù)獲得自己所需要的資源而不能繼續(xù)推進(jìn),從而也不能釋放自己所占有的資源,以致進(jìn)入死鎖狀態(tài)。

  3)競(jìng)爭(zhēng)臨時(shí)資源

  上面所說(shuō)的打印機(jī)資源屬于可順序重復(fù)使用型資源,稱(chēng)為永久資源。還有一種所謂的臨時(shí)資源,這是指由一個(gè)進(jìn)程產(chǎn)生,被另一個(gè)進(jìn)程使用,短時(shí)間后便無(wú)用的資源,故也稱(chēng)為消耗性資源,如硬件中斷、信號(hào)、消息、緩沖區(qū)內(nèi)的消息等,它也可能引起死鎖。例如,SI,S2,S3是臨時(shí)性資源,進(jìn)程P1產(chǎn)生消息S1,又要求從P3接收消息S3;進(jìn)程P3產(chǎn)生消息S3,又要求從進(jìn)程P2處接收消息S2;進(jìn)程P2產(chǎn)生消息S2,又要求從P1處接收產(chǎn)生的消息S1。如果消息通信按如下順序進(jìn)行:

  P1:···Relese(S1);Request(S3);···

  P2:···Relese(S2);Request(S1);···

  P3:···Relese(S3);Request(S2);···

  并不可能發(fā)生死鎖。但若改成下述的運(yùn)行順序:

  P1:···Request(S3);Relese(S1);···

  P2:···Request(S1);Relese(S2);···

  P3:···Request(S2);Relese(S3);···

  則可能發(fā)生死鎖。

  2.進(jìn)程推進(jìn)順序不當(dāng)引起死鎖

  由于進(jìn)程在運(yùn)行中具有異步性特征,這可能使P1和P2兩個(gè)進(jìn)程按下述兩種順序向前推進(jìn)。

  1)進(jìn)程推進(jìn)順序合法

  當(dāng)進(jìn)程P1和P2并發(fā)執(zhí)行時(shí),如果按照下述順序推進(jìn):P1:Request(R1);P1:Request(R2);P1:Relese(R1);P1:Relese(R2);P2:Request(R2);P2:Request(R1);P2:Relese(R2);P2:Relese(R1);這兩個(gè)進(jìn)程便可順利完成,這種不會(huì)引起進(jìn)程死鎖的推進(jìn)順序是合法的。

  2)進(jìn)程推進(jìn)順序非法

  若P1保持了資源R1,P2保持了資源R2,系統(tǒng)處于不安全狀態(tài),因?yàn)檫@兩個(gè)進(jìn)程再向前推進(jìn),便可能發(fā)生死鎖。例如,當(dāng)P1運(yùn)行到P1:Request(R2)時(shí),將因R2已被P2占用而阻塞;當(dāng)P2運(yùn)行到P2:Request(R1)時(shí),也將因R1已被P1占用而阻塞,于是發(fā)生進(jìn)程死鎖。

  死鎖的預(yù)防方法

  理解了死鎖的原因,尤其是產(chǎn)生死鎖的四個(gè)必要條件,就可以最大可能地避免、預(yù)防和解除死鎖。所以,在系統(tǒng)設(shè)計(jì)、進(jìn)程調(diào)度等方面注意如何不讓這四個(gè)必要條件成立,如何確定資源的合理分配算法,避免進(jìn)程永久占據(jù)系統(tǒng)資源。此外,也要防止進(jìn)程在處于等待狀態(tài)的情況下占用資源,在系統(tǒng)運(yùn)行過(guò)程中,對(duì)進(jìn)程發(fā)出的每一個(gè)系統(tǒng)能夠滿足的資源申請(qǐng)進(jìn)行動(dòng)態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。因此,對(duì)資源的分配要給予合理的規(guī)劃。

  下面幾種方法可用以避免重裝死鎖的發(fā)生:

 ?、僭试S目的節(jié)點(diǎn)將不完整的報(bào)文遞交給目的端系統(tǒng);

  ②一個(gè)不能完整重裝的報(bào)文能被檢測(cè)出來(lái),并要求發(fā)送該報(bào)文的源端系統(tǒng)重新傳送;

  ③為每個(gè)節(jié)點(diǎn)配備一個(gè)后備緩沖空間,用以暫存不完整的報(bào)文。

 ?、?、②兩種方法不能很滿意地解決重裝死鎖,因?yàn)樗鼈兪苟讼到y(tǒng)中的協(xié)議復(fù)雜化了。一般的設(shè)計(jì)中,網(wǎng)絡(luò)層應(yīng)該對(duì)端系統(tǒng)透明,也即端系統(tǒng)不該考慮諸如報(bào)文拆、裝之類(lèi)的事。③方法雖然不涉及端系統(tǒng),但使每個(gè)節(jié)點(diǎn)增加了開(kāi)銷(xiāo)。

  有序資源分配法

  這種算法資源按某種規(guī)則系統(tǒng)中的所有資源統(tǒng)一編號(hào)(例如打印機(jī)為1、磁帶機(jī)為2、磁盤(pán)為3、等等),申請(qǐng)時(shí)必須以上升的次序。系統(tǒng)要求申請(qǐng)進(jìn)程:

  1、對(duì)它所必須使用的而且屬于同一類(lèi)的所有資源,必須一次申請(qǐng)完;

  2、在申請(qǐng)不同類(lèi)資源時(shí),必須按各類(lèi)設(shè)備的編號(hào)依次申請(qǐng)。例如:進(jìn)程PA,使用資源的順序是R1,R2;進(jìn)程PB,使用資源的順序是R2,R1;若采用動(dòng)態(tài)分配有可能形成環(huán)路條件,造成死鎖。

  采用有序資源分配法:R1的編號(hào)為1,R2的編號(hào)為2;

  PA:申請(qǐng)次序應(yīng)是:R1,R2

  PB:申請(qǐng)次序應(yīng)是:R1,R2

  這樣就破壞了環(huán)路條件,避免了死鎖的發(fā)生

  銀行算法

  避免死鎖算法中最有代表性的算法是DijkstraE.W于1968年提出的銀行家算法:

  該算法需要檢查申請(qǐng)者對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的各類(lèi)資源可以滿足申請(qǐng)者的請(qǐng)求,就滿足申請(qǐng)者的請(qǐng)求。

  這樣申請(qǐng)者就可很快完成其計(jì)算,然后釋放它占用的資源,從而保證了系統(tǒng)中的所有進(jìn)程都能完成,所以可避免死鎖的發(fā)生。

819515