死鎖

  死鎖併發


 

  死鎖能夠被定義爲一組競爭系統資源或相互通訊的進程間相互的「永久」阻塞。當一組進程中的全部進程都在等待一個事件(等待請求資源的釋放),而只有在進程集合中的其餘阻塞的進程才能夠觸發該事件,這時就成一組進程死鎖。spa

  由於沒有事件能夠觸發,故死鎖是永久性的。操作系統

  • 通常狀況下,若是同一個線程前後兩次調用lock,在第二次調用時,因爲鎖已經被佔用,該線程會掛起等待別的線程釋放鎖,然而鎖正是被本身佔用着的,該線程又被掛起而沒有機會釋放鎖,所以 就永遠處於掛起等待狀態了,這叫作死鎖(Deadlock)。
  • 另外一種典型的死鎖情形是這樣:線程A獲 得了鎖1,線程B得到了鎖2,這時線程A調用lock試圖得到鎖2,結果是須要掛起等待線程B釋放 鎖2,而這時線程B也調用lock試圖得到鎖1,結果是須要掛起等待線程A釋放鎖1,因而線程A和B都 永遠處於掛起狀態了。

不難想象,若是涉及到更多的線程和更多的鎖,有沒有可能死鎖的問題將會 變得複雜和難以判斷。線程

  發生死鎖的必要條件blog


 

一、互斥。一次只有一個進程可使用資源,其它進程不能訪問已分配給其餘進程的資源。進程

二、佔用且等待。當一個進程在等待分配獲得其它資源時,其繼續佔有已分配獲得的資源。事件

三、非搶佔。不能強行搶佔進程中已佔用的資源。資源

四、循環等待。存在一個封閉的進程鏈,使得每一個資源至少佔有此鏈中下一個進程所須要的一個資源。循環

  前三個條件是死鎖產生的必要條件但不是充分條件。第四個條件其實是前三個條件的潛在結果,即假設前三個條件存在,可能發生的一系列事件會致使不可解的循環等待。這個不可解的循環等待實際上就是死鎖的定義。條件4中列出的循環等待之因此是不可解的,是由於有前三個條件的存在。請求

 

  如何預防死鎖


 

一種是間接的預防死鎖,即防止前三個必要條件中任意一個的發生;另外一種是直接預防死鎖,即防止循環等待的發生。

  互斥條件不能禁止。

  爲防止佔有且等待的條件,能夠要求進程一次性地請求全部須要的資源,而且阻塞這個進程直到全部的請求都同時知足。這個方法比較低效,並且若是分配給一個進程資源,但因爲不足所有資源,因此分配給這個進程的資源可能在至關長的一段時間內都處於不可用狀態,且在此期間,它們不能被其餘進程使用。另外一方面進程可能沒法預知它須要的全部資源。

  預防非搶佔條件。若是佔有某些資源的一個進程進一步資源請求被拒絕,則該進程必須釋放它最初佔用的資源,若是有必要,可再次請求這些資源和另外的資源。或者,若是一個進程請求被另外一個進程佔用的一個資源,則操做系統能夠搶佔另外一個進程,要求它釋放資源。

  循環等待條件能夠經過定義資源類型的線形順序來預防。若是一個進程已經分配到R類型的資源,那麼他接下來請求的資源只能是那些排在R類型以後的資源類型。

這些均可能致使低效的資源使用和低效的進程執行。

 

  如何規避死鎖


 

規避死鎖與預防死鎖相比,它容許三個必要條件,但經過明智的選擇,確保永遠不會抵達死鎖點,所以,死鎖避免比死鎖預防容許更多的併發。

  若是一個進程的請求會致使死鎖,則不會啓動此進程。

  若是一個進程增長資源的請求會致使死鎖,則不容許此分配。

 

  產生死鎖的緣由


  •   由於系統資源不足。
  •  進程的推動的順序不當。
  •  資源分配不當。

 若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。

 

待續 ...

相關文章
相關標籤/搜索