一、死鎖產生的原因:
1)、因為系統的資源不足,不能滿足進程的資源請求,會導致多個線程同時爭奪一個資源
2)、進程運行推進的順序不合適
3)、資源分配不當,有的進程資源分配太少,會因為爭奪資源而陷入死鎖
二、死鎖產生的場景:
1)、多個線程:彼此申請對方資源不足而導致的死鎖,A申請B的鎖的時候,因為鎖被占用所以會把A掛起等待B釋放鎖,同時B申請A的 鎖,同樣因為A的鎖鎖被占用,B會被掛起等待,都被掛起沒有機會釋放鎖,則進入了死鎖。
2)、單個線程:有自己的鎖,但是還要申請新鎖,在申請新鎖的時候,因為鎖被占用,所以會被掛起等待,但是鎖是被自己占用,而自己又被掛起,沒機會釋放鎖,則會進入死鎖。
三、死鎖產生的4個必要條件:
(1)、互斥:一個資源一次只能被一個進程使用,當該進程使用該資源的時候,其他進程就不能使用,具有獨占性;
(2)、請求與保持:一個進程要請求新的資源,但同時對已獲得的資源不釋放,要等待其他進程釋放資源;
(3)、循環等待:若干進程都要申請資源,但是都對已獲得的資源不釋放,都要等待其他進程釋放資源,若干進程陷入循環等待資源;
(4)、不剝奪:進程已獲得的資源,在未使用完之前,不能被強行剝奪。
四、這4個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖,因此可以寫下如下的預防死鎖的方法:
1)、破壞“互斥”條件:就是在系統里取消互斥、若資源一般不被一個進程獨占使用,那么死鎖是肯定不會發生的,但一般“互斥”條件是無法破壞的。因此,在死鎖預防里主要是破壞其他三個必要條件,而不去涉及破壞“互斥”條件。
2)、破壞“請求和保持”條件:在系統中不允許進程在已獲得某種資源的情況下,申請其他資源。即要想出一個辦法,阻止進程在持有資源的同時申請其他資源。—-方法:所有進程在運行之前,必須一次性地申請在整個運行過程中所需的全部資源。這樣,該進程在整個運行期間,便不會再提出資源請求,從而破壞“請求”條件。系統在分配資源時,只要有一種資源不能滿足進程的要求,即使其他所需的各種資源都空閑也不分配給該進程,而讓該進程的等待。由於該進程在等待期間未占有任何資源,於是破壞了“保持”條件。
該方法的優點:簡單易行。且安全
缺點:資源被嚴重浪費,嚴重惡化了資源的利用率
五、死鎖的解除:
一旦檢測出死鎖,就應立即采取相應的措施,以解除死鎖,解除死鎖主要有倆種方法:
1、搶占資源:從一個或多個進程中搶占足夠數量的資源,分配給死鎖進程,以解除死鎖狀態
2、終止或撤銷進程:終止或撤銷系統中的一個或多個死鎖進程,直至打破循環環路,使系統從死鎖狀態解脫出來。
總結:
一般情況下,如果同一個線程先后兩次調用lock,在第二次調用時,由於鎖已經被占用,該進程會掛起等待別的線程釋放鎖,然而鎖正是被自己占用着的,該進程又被掛起而沒有機會釋放鎖,因此就永遠處於掛起等待狀態了,這就叫做死鎖(Deadlock)。
————————————————
版權聲明:本文為CSDN博主「gilr」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/s25691011/article/details/70821382