目錄
-
互斥鎖
操作系統創建一個線程最大的問題就是臨界資源和臨界區的互斥訪問,例如公共換衣就是臨界資源,我們在進入到換衣間(臨界區)後,就首先上鎖; 然後用完離開換衣間(臨界區)之後,把鎖釋放供別人使用。如果有人想去換衣間時發現門鎖上了,他也有兩種策略:
1、在換衣間門口那裏等(阻塞);
2、暫時先離開等會再過來看(非阻塞);
-
死鎖
死鎖是指兩個或兩個以上的線程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程。
如果多個線程要調用多個對象,則在上鎖的時候可能會出現“死鎖”。舉個例子: A、B兩個線程會同時使用到兩個共享變量 m和n,同時每個變量都有自己相應的鎖M和N。 這時A線程首先拿到M鎖訪問m,接下來他需要拿N鎖來訪問變量n; 而如果此 時B線程拿着N鎖等待着M鎖的話,就造成了線程“死鎖”。
- 死鎖示例圖
由於T1在使用R1且他需要再申請到R2之後才能繼續運行,而T2在佔用R2且需要申請到R1之後才能繼續運行,這樣就使得T1和T2發死鎖,彼此都佔用各自所需的資源,而又得不到需要執行的其他資源,即產生死鎖。
-
死鎖產生的4個必要條件條件
-
互斥:某種資源一次只允許一個進程訪問,即該資源一旦分配給某個進程,其他進程就不能再訪問,直到該進程訪問結 束。
-
佔有且等待:一個進程本身佔有資源(一種或多種),同時還有資源未得到滿足,正在等待其他進程釋放該資源。
-
不可搶佔:別人已經佔有了某項資源,你不能因爲自己也需要該資源,就去把別人的資源搶過來。
-
循環等待:存在一個進程鏈,使得每個進程都佔有下一個進程所需的至少一種資源。
當以上四個條件均滿足,必然會造成死鎖,發生死鎖的進程無法進行下去,它們所持有的資源也無法釋放。這樣會導致CPU 的吞吐量下降。所以死鎖情況是會浪費系統資源和影響計算機的使用性能的。那麼,解決死鎖問題就是相當有必要的了。
-
破壞死鎖條件
產生死鎖需要四個條件,那麼,只要這四個條件中至少有一個條件得不到滿足,就不可能發生死鎖了。由於互斥條件是非共享 資源所必須的,不僅不能改變,還應加以保證,所以,主要是破壞產生死鎖的其他三個條件。
- 破壞“佔有且等待”條件
方法一:所有的進程在開始運行之前,必須一次性地申請其在整個運行過程中所需要的全部資源。
優點:簡單易實施且安全。
缺點:因爲某項資源不滿足,進程無法啓動,而其他已經滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成 資源浪費。使進程經常發生飢餓現象。
方法二:該方法是對第一種方法的改進,允許進程只獲得運行初期需要的資源,便開始運行,在運行過程中逐步釋放掉分配到 的已經使用完畢的資源,然後再去請求新的資源。這樣的話,資源的利用率會得到提高,也會減少進程的飢餓問題。
- 破壞“不可搶佔”條件
當一個已經持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以後需要使用 的時候再重新申請。這就意味着進程已佔有的資源會被短暫地釋放或者說是被搶佔了。該種方法實現起來比較複雜,且代價也比 較大。釋放已經保持的資源很有可能會導致進程之前的工作實效等,反覆的申請和釋放資源會導致進程的執行被無限的推遲,這 不僅會延長進程的週轉週期,還會影響系統的吞吐量。
-
破壞“循環等待”條件
可以通過定義資源類型的線性順序來預防,可將每個資源編號,當一個進程佔有編號爲i的資源時,那麼它下一次申請資源只 能申請編號大於i的資源。