deadlock - 死鎖
所謂死鎖:是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。

線程死鎖
A deadlock is when two or more threads are blocked waiting to obtain locks that some of the other threads in the deadlock are holding. Deadlock can occur when multiple threads need the same locks, at the same time, but obtain them in different order.(死鎖是指兩個(gè)或多個(gè)線程被阻塞,等待獲得死鎖中其他一些線程持有的鎖。當(dāng)多個(gè)線程同時(shí)需要相同的鎖,但以不同的順序獲取它們時(shí),就會(huì)發(fā)生死鎖。)
解決方法
預(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ī)劃。
一、有序資源分配法
這種算法資源按某種規(guī)則系統(tǒng)中的所有資源統(tǒng)一編號(hào)(例如打印機(jī)為1、磁帶機(jī)為2、磁盤為3、等等),申請(qǐng)時(shí)必須以上升的次序。系統(tǒng)要求申請(qǐng)進(jìn)程:
1、對(duì)它所必須使用的而且屬于同一類的所有資源,必須一次申請(qǐng)完;
2、在申請(qǐng)不同類資源時(shí),必須按各類設(shè)備的編號(hào)依次申請(qǐng)。例如:進(jìn)程PA,使用資源的順序是R1,R2;進(jìn)程PB,使用資源的順序是R1,R2;若采用動(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ā)生
二、銀行算法
避免死鎖算法中最有代表性的算法是Dijkstra E.W于1968年提出的銀行家算法:
該算法需要檢查申請(qǐng)者對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的各類資源可以滿足申請(qǐng)者的請(qǐng)求,就滿足申請(qǐng)者的請(qǐng)求。
這樣申請(qǐng)者就可很快完成其計(jì)算,然后釋放它占用的資源,從而保證了系統(tǒng)中的所有進(jìn)程都能完成,所以可避免死鎖的發(fā)生。
避免死鎖
最具有代表性的避免死鎖的算法,是Dijkastra的銀行家算法,這是由于該算法能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名的,為實(shí)現(xiàn)銀行家算法,系統(tǒng)中必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu).
1)可利用資源向量Available是個(gè)含有m個(gè)元素的數(shù)組,其中的每一個(gè)元素代表一類可利用的資源數(shù)目。如果Available[j]=K,則表示系統(tǒng)中現(xiàn)有Rj類資源K個(gè)。
2)最大需求矩陣Max這是一個(gè)n×m的矩陣,它定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類資源的最大需求。如果Max[i,j]=K,則表示進(jìn)程i需要Rj類資源的最大數(shù)目為K。
3)分配矩陣Allocation這也是一個(gè)n×m的矩陣,它定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。如果Allocation[i,j]=K,則表示進(jìn)程i當(dāng)前已分得Rj類資源的數(shù)目為K。
4)需求矩陣Need。這也是一個(gè)n×m的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類資源數(shù)。如果Need[i,j]=K,則表示進(jìn)程i還需要Rj類資源K個(gè),方能完成其任務(wù)。Need[i,j]=Max[i,j]-Allocation[i,j]
排除方法
1、撤消陷于死鎖的全部進(jìn)程;
2、逐個(gè)撤消陷于死鎖的進(jìn)程,直到死鎖不存在;
3、從陷于死鎖的進(jìn)程中逐個(gè)強(qiáng)迫放棄所占用的資源,直至死鎖消失;
4、從另外一些進(jìn)程那里強(qiáng)行剝奪足夠數(shù)量的資源分配給死鎖進(jìn)程,以解除死鎖狀態(tài)。
