[Linux]死锁
死鎖是指多個(gè)進(jìn)程在運(yùn)行過(guò)程中因爭(zhēng)奪資源而造成的一種僵局,當(dāng)進(jìn)程處于這種僵持狀態(tài)時(shí),若無(wú)外力作用,它們都將無(wú)法再向前推進(jìn)。之前信號(hào)量的時(shí)候我們知道,如果多個(gè)進(jìn)程等待,主要體現(xiàn)在占有鎖的問(wèn)題上。死鎖也可以被定義為:一組競(jìng)爭(zhēng)系統(tǒng)資源或互相通信的進(jìn)程間相互的永久阻塞。當(dāng)一組進(jìn)程中的所有進(jìn)程都在等待一個(gè)事件,而只有在進(jìn)程集合中的其他阻塞的進(jìn)程才可以觸發(fā)該事件,這時(shí)就稱一組進(jìn)程死鎖。因?yàn)闆](méi)有事件觸發(fā),因此死鎖是永久性的。
產(chǎn)生死鎖的原因有:
(1)競(jìng)爭(zhēng)資源。當(dāng)系統(tǒng)中供多個(gè)進(jìn)程共享的資源如打印機(jī)、公用隊(duì)列等,其數(shù)目不足以滿足諸進(jìn)程的需要時(shí),會(huì)引起諸進(jìn)程對(duì)資源的競(jìng)爭(zhēng)而產(chǎn)生死鎖。
(2)進(jìn)程間推進(jìn)順序非法。進(jìn)程在運(yùn)行過(guò)程中,請(qǐng)求和釋放資源的順序不當(dāng),也同樣會(huì)導(dǎo)致產(chǎn)生進(jìn)程死鎖。
詳細(xì)分析一下產(chǎn)生死鎖的原因哦。
(1)可剝奪和非剝奪性資源
可剝奪性資源指某進(jìn)程在獲得這類資源后,該資源可以再被其他進(jìn)程或系統(tǒng)剝奪。如優(yōu)先級(jí)高的可以剝奪優(yōu)先級(jí)低的進(jìn)程的處理機(jī)。非剝奪性資源是當(dāng)這類資源分配給某進(jìn)程后,再不能強(qiáng)行收回,只能在進(jìn)程用完后自行釋放。
(2)競(jìng)爭(zhēng)非剝奪性資源
由于它們的數(shù)量不能滿足諸進(jìn)程運(yùn)行的需要,會(huì)使進(jìn)程在運(yùn)行過(guò)程中,因剝奪這些資源而陷入僵局。
比如,系統(tǒng)中有一臺(tái)打印機(jī)R1和一臺(tái)磁帶機(jī)R2,供進(jìn)程P1,P2共享。如果P1占用了打印機(jī),P2占用了磁帶機(jī)。此時(shí)如果P1想使用磁帶機(jī),而P2想使用打印機(jī),這就使P1和P2都在等待對(duì)方的資源被釋放,而陷入僵局。從而也使P1和P2得不到自己的資源而不能釋放現(xiàn)有的資源,最后進(jìn)入死鎖狀態(tài)。
(3)競(jìng)爭(zhēng)臨時(shí)性資源
上述的打印機(jī)資源屬于順序性重復(fù)使用的資源,屬于永久性資源。還有一種是臨時(shí)性資源,是一個(gè)進(jìn)程產(chǎn)生,由另一進(jìn)程使用短暫時(shí)間后無(wú)用的資源。也可能產(chǎn)生死鎖。
(4)推進(jìn)順序不當(dāng)。P1—>Request(R2),p2—>Request(R1)時(shí)產(chǎn)生死鎖。
產(chǎn)生死鎖的必要條件
如果發(fā)生死鎖,則有四個(gè)產(chǎn)生死鎖的必要條件:
(1)互斥條件。一次只有一個(gè)進(jìn)程使用資源,其他進(jìn)程不能訪問(wèn)已分配的資源。
(2)請(qǐng)求和保持條件(也稱占有且等待)。指進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源又已被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程阻塞,但又對(duì)自己已獲得的其他資源保持不放。
(3)不剝奪條件(非搶占)。指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完自己釋放。
(4)環(huán)路等待(循環(huán)等待)。指存在一個(gè)封閉的進(jìn)程鏈,使得每個(gè)資源至少占有此鏈中下一個(gè)進(jìn)程所需要的一個(gè)資源。在發(fā)生死鎖時(shí),必然存在一個(gè)進(jìn)程,資源的環(huán)形鏈,即P0,P1,P2….Pn,則P0在等待P1占有的資源,P1占有P2的,….Pn占有P0的。
說(shuō)完死鎖之后,我們應(yīng)該想想如何處理這種死鎖呢。處理死鎖的基本方法有:預(yù)防死鎖,避免死鎖,檢測(cè)死鎖,解除死鎖。
預(yù)防死鎖是使四個(gè)必要條件中的第2,3,4個(gè)中的一個(gè)不成立來(lái)避免不發(fā)生死鎖。為預(yù)防死鎖,可以使請(qǐng)求和保持條件中,可以要求進(jìn)程一次性地請(qǐng)求所有需要的資源,并且阻塞這個(gè)進(jìn)程直到所有請(qǐng)求都同時(shí)滿足。對(duì)于非搶占式的預(yù)防死鎖的方法,如果占有某些資源的一個(gè)進(jìn)程進(jìn)行進(jìn)一步資源請(qǐng)求被拒絕,則該進(jìn)程必須釋放它最初占用的資源,如果有必要,可以再次請(qǐng)求此類資源。還有一種情況是,如果一個(gè)進(jìn)程請(qǐng)求當(dāng)前被另一個(gè)進(jìn)程占有的一個(gè)資源,則操作系統(tǒng)可以搶占另一個(gè)進(jìn)程,要求它釋放資源。(這類情況適合具有不同優(yōu)先級(jí)的進(jìn)程)
死鎖避免
解決死鎖問(wèn)題的另一種方法是死鎖避免。與死鎖預(yù)防的差距也不大。這里有倆種死鎖避免的方法,
1.如果一個(gè)進(jìn)程的請(qǐng)求會(huì)導(dǎo)致死鎖,則不啟動(dòng)此進(jìn)程
2.如果一個(gè)進(jìn)程增加資源的請(qǐng)求導(dǎo)致死鎖,則不允許此分配
這里解決死鎖問(wèn)題的方法有:銀行家算法
銀行家算法通過(guò)已分配的資源和可用資源數(shù)等來(lái)獲取安全序列,如果存在安全序列,就可以分配請(qǐng)求資源,不存在則說(shuō)明不可以請(qǐng)求資源,這樣就可以有效的避免死鎖。
(1)請(qǐng)求資源,發(fā)出請(qǐng)求向量
(2)假定可為P1分配資源,修改Available,Allocation和Need向量
(3)利用安全性算法檢查此時(shí)系統(tǒng)是否安全
銀行家算法需求分析:
允許進(jìn)程動(dòng)態(tài)地申請(qǐng)資源,系統(tǒng)在每次實(shí)施資源分配之前,先計(jì)算資源分配的安全性,若此次資源分配安全(即資源分配后,系統(tǒng)能按某種順序來(lái)為每個(gè)進(jìn)程分配其所需的資源,直至最大需求,使每個(gè)進(jìn)程都可以順利地完成),便將資源分配給進(jìn)程,否則不分配資源,讓進(jìn)程等待。
功能實(shí)現(xiàn):
理解了死鎖的原因,尤其是產(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ī)劃。
1) 可利用資源向量Available。這是一個(gè)含有m個(gè)元素的數(shù)組,其中的而每一個(gè)元素代表一類可利用資源數(shù)目,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目,其數(shù)值隨該類資源的分配和回收而動(dòng)態(tài)的改變。如果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ù)。
上述三個(gè)矩陣間存在下述關(guān)系:Need[i,j]=Max[i,j]-Allocation[i,j]
運(yùn)行結(jié)果:
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 跟我的前妻谈恋爱剧情介绍
- 下一篇: 想要孩子老是怀不上