操作系統之線程篇3死鎖

1.死鎖發生的根本原來就是對資源的競爭。這裏的資源包括了硬件資源和軟件資源。資源其實也可以分爲可搶佔的和不可搶佔的,可搶佔的資源是可以從持有者手中強行搶奪過來的資源,且不會發生系統運行的紊亂;不可搶佔的資源是不能從持有者手中強行搶奪過來的資源,否則會發生系統運行的紊亂。


2.線程使用資源的順序是怎樣的?

 1)請求資源。線程在資源請求沒有批准的情況下必須等待。這種等待有兩種方式:一種是阻塞等待,二是立即返回,執行別的事情,等以後在請求。第二種方式沒有等待,所以不會發生死鎖。但如果採用第一種等待的方式,就很可能發生死鎖。說的更白話一點,死鎖就是每一個線程都在等待某一個資源,因此會造成沒有線程可以推進。

 2)使用資源。

 3)釋放資源。在死鎖的時候,沒有線程可以執行,每個線程持有的資源也沒有辦法釋放,同時休眠的線程也沒有辦法叫醒。

3.


4.死鎖發生的必要條件?

  1)資源有限。

  2)持有等待:就是一個線程在請求新的資源的時候,其已經獲得的資源並不釋放。線程如果是請求某些資源,得到後工作,然後在請求某些資源,得到後,在工作,直到工作結束時才釋放所獲得的全部資源,則死鎖的可能性是必然存在的。

  3)不能搶佔:如果可以搶佔資源,也不會發生死鎖。

  4)循環等待:我們說死鎖就是一組線程不能正常推進,其原因不僅僅是持有等待,還有循環等待,就是所有的線程都在等資源,哪怕有幾個線程先幹些其它的事,可能就能解決一次死鎖的問題。

5.死鎖的應對策略?

 1)允許死鎖發生:我們可以假裝沒有看見,不予理睬,在死鎖發生後再想解決的辦法。因爲經過分析,死鎖發生的概率不是很高,而防止死鎖的代價卻不小,防止死鎖的代價比重啓100次的代價還高。

 2)不讓死鎖發生。

6.不讓死鎖發生的對策有哪些?

 1)死鎖還未發生要做的事,死鎖的檢測:簡單的說就是對資源的有效管理,檢測資源是否可能發生循環的持有和請求。每個進程都有一個資源分配表和資源等待表,系統也有當前可有資源的數量表。

 2)死鎖發生後做的事,死鎖的修復:




 3)死鎖的動態避免:

 缺點是這種安全和不安全的狀態的計算是否複雜。我們對每個資源的最大資源的需求的預測能力也是有限的。

 4)死鎖的靜態防止:

    I.消除保持和請求的條件,就是一個線程必須一次請求其所需要的所有資源,而不是請求一點資源,做一點事,在需要下一個資源的時候,在請求,在做一點事。這種辦法的缺點就是資源的浪費,因爲線程的某些資源可能要等到最後才用,此時它不用,其它馬上要用的線程又用不了。換一種思路就是,還是需要資源的時候,就請求一次,但如果請求的資源被拒絕,則該線程要將已擁有的資源都釋放,這裏最要命的問題就是有些資源一旦釋放,該線程之前所做的一切可能就前功盡棄了。

    II.消除非搶佔條件:確定就是不是所有的資源都是可以搶佔的,如,鎖就不能搶佔,如果非要將一個線程的鎖搶過來,後果是不可預知的。

    III.消除循環等待條件:出現循環等待是因爲線程請求資源的順序是隨機的,我們現在去規定一組資源的請求必需按照一定的順序進行。


7.銀行家算法:是仿照銀行發放貸款時採取的控制方式而設計的一種死鎖避免算法。該算法的策略是實時動態避免死鎖。

8.檢測修復和動態避免兩種策略成本過高,很難再實時系統中採用,相對來說靜態防止與不予理睬是合理的策略,所以現代操作系統發生死鎖的頻率相對人們的期望值來說還是較高的。

9.多線程編程除了要應對死鎖之外,還要面對飢餓和活鎖。資源飢餓指的是某一個線程一直等不到它所需要的資源,而無法向前推進。活鎖,就是活鎖線程組裏的線程狀態可以改變但是整個活鎖組的線程無法推進。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章