進程(線程)死鎖詳解


進程(線程)死鎖詳解

 

一、死鎖的定義

多進程,多線程的並發執行雖然提升了系統資源的利用率,提高了系統的性能,但是並發執行也帶來了新的問題-----死鎖。

死鎖是指多個進程(線程)在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象(互相掛起等待),若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程

舉一個生活中的簡單例子:小明和小紅都想買一塊橡皮,這塊橡皮價值一塊錢,但是他們倆每個人都只有五毛錢,小明說:你把你的五毛錢給我,讓我買橡皮。小紅說:你把你的五毛錢給我,讓我買橡皮。這樣,兩個人互相僵持着,誰也不願意低頭,誰都買不到橡皮。

二、幾種常見的死鎖

1.線程將自己鎖住

為了保證線程之間的同步和互斥,我們往往需要給其加鎖,有時候,線程申請了鎖資源,還沒有等待釋放,又一次申請這把鎖,結果就是掛起等待這把鎖的釋放,但是這把鎖是被自己拿着,所以就會永遠掛起等待,就造成了死鎖。

2.多線程競爭資源循環等待

有兩個線程P1和P2,P1首先申請得到了鎖L1,P2申請得到了鎖L2,這個時候P1有向去申請鎖L2,結果是被掛起等待P2釋放鎖L2,而P2恰好也想申請鎖L1,結果是掛起等待P1釋放鎖L1,此時就造成兩個線程互相僵持,造成死鎖。

3.進程推進順序不當引起的死鎖問題。

有三個線程,P1,P2和P3,分別生產數據M1,M2,M3,同時分別接收別的線程產生的數據M3,M2,M1,如果線程推進的順序正確,即三個線程都先生產數據,再接收,那么沒有問題,但是一旦線程先接受數據,再生產數據,因為一開始沒有數據產生,那么就會造成三個線程的死鎖問題。

三、死鎖產生的原因和必要條件

1.死鎖產生的主要原因:

  1. 系統的資源不足。
  2. 進程(線程)推進的順序不對。
  3. 資源的分配不當。

當系統的資源很充沛的時候,每個進程都可以申請到想要的資源,那么出現死鎖的概率就很低,線程的調度順序和速度不同,也會導致死鎖問題。

2.死鎖產生的四個必要條件:

  1. 互斥條件:進程(線程)申請的資源在一段時間中只能被一個進程(線程)使用。
  2. 請求與等待條件:進程(線程)已經擁有了一個資源,但是又申請新的資源,擁有的資源保持不變 。
  3. 不可剝奪條件:在一個進程(線程)沒有用完,主動釋放資源的時候,不能被搶占。
  4. 循環等待條件:多個進程(線程)之間存在資源循環鏈。

3.處理死鎖的方法:

  1. 預防死鎖:破壞死鎖產生的四個條件之一,注意,互斥條件不能破壞。
  2. 避免死鎖:合理的分配資源。
  3. 檢查死鎖:利用專門的死鎖機構檢查死鎖的發生,然后采取相應的方法。
  4. 解除死鎖:發生死鎖時候,采取合理的方法解決死鎖。一般是強行剝奪資源。

4.如何打破四個產生條件

  1. 打破互斥條件:改造獨占性資源為虛擬大資源,但是大部分資源無法改造,因此不建議使用這個方法。
  2. 打破請求與保持條件:在進程(線程)運行之前,就把需要申請的資源一次性申請到位,滿足則運行,不滿足就等待,這樣就不會造成在占有資源的情況下,還要申請新資源。
  3. 打破不可剝奪條件:在占有資源並且還想要申請新資源的時候,歸還已經占有的資源。
  4. 打破循環等待條件:實現資源的有序分配,即對所有的設備進行分類編號,只能以升序的方式來申請資源。

比如說進程P1,使用資源的順序是R1,R2,進程P2,使用資源的順序是R2,R1,如果采取動態分配的方式,就很有可能造成死鎖。我們對設備進行分類編號,那么P1,P2只能以R1,R2的順序來申請資源。就可以打破環形回路,避免死鎖。

四、銀行家算法

在避免死鎖的方法中最有名的就是銀行家算法,它是DIJKstra E.W於1968年提出來的。
為什么叫做銀行家算法呢,是因為這有點向銀行的“借貸”服務,假如銀行只有有限多的資金供給客戶進行貸款服務,那么為了保證銀行能有足夠的資金運轉,它在借錢之前要審核客戶是否有能夠在指定時間內償還貸款的能力。
在研究我們的操作系統的資源分配策略時,也會出現類似的問題,我們系統中的有限資源要分配給各種進程,那么就要事先考察此進程是否有在指定期限內歸還資源的能力。必須要保證它能在有限的時間內進行歸還,拱其他進程使用。
大致實現方法:

  1. 當一個進程對資源的最大需求量不超過系統中的資源數時可以接納該進程。
  2. 進程可以分期請求資源,當請求的總數不能超過最大需求量。
  3. 當系統現有的資源不能滿足進程尚需資源數時,對進程的請求可以推遲分配,但總能使進程在有限的時間里得到資源。
  4. 當系統現有的資源能滿足進程尚需資源數時,必須測試系統現存的資源能否滿足該進程尚需的最大資源數,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

銀行家算法:首先需要定義狀態和安全狀態的概念。系統的狀態是當前給進程分配的資源情況。因此,狀態包含兩個向量Resource(系統中每種資源的總量)和Available(未分配給進程的每種資源的總量)及兩個矩陣Claim(表示進程對資源的需求)和Allocation(表示當前分配給進程的資源)。安全狀態是指至少有一個資源分配序列不會導致死鎖。當進程請求一組資源時,假設同意該請求,從而改變了系統的狀態,然后確定其結果是否還處於安全狀態。如果是,同意這個請求;如果不是,阻塞該進程知道同意該請求后系統狀態仍然是安全的。

衣帶漸寬終不悔,為伊消得人憔悴!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM