计算机操作系统——死锁
文章目錄
- 一、相關知識
- 1.可重用性資源和消耗性資源
- 2.可搶占性資源和不可搶占性資源
- 3.死鎖定義
- 二、死鎖產生的原因和必要條件
- 1.死鎖產生的原因
- 2.死鎖產生的必要條件
- 三、預防死鎖的方法
- 1.破壞“請求和保持”條件
- 2.破環“不可搶占”條件
- 3.破壞“循環等待”條件
一、相關知識
1.可重用性資源和消耗性資源
1)可重用性資源
可重用性資源是一種可供用戶重復使用多次的資源。具有如下性質:
(1)每一個可重用性資源中的單元只能分配給一個進程使用,不允許多個進程共享。
(2)進程使用可重性資源的順序:①請求資源。如果請求失敗,請求進程將會被阻塞或者循環等待。②使用資源③釋放資源
(3)系統中每一類可重用性資源中的單元數目都是相對固定的,進程在運行期間既不能創建也不能刪除它。
對資源的請求和釋放通常都是利用系統調用完成的。
2)可消耗性資源
可消耗性資源又被稱為臨時資源。是在進程運行期間由進程動態的創建和消耗的。具有如下性質:
(1)每一類可消耗性資源的單元數目在進程運行期間是可以不斷變化的,有時可以有許多,有時可以為0。
(2)進程在運行過程中,可以不斷的創造可消耗性資源的單元,將它們放入該資源類的緩沖區中,以增加該資源類的單元數目。
(3)進程在運行過程中,可以請求若干個可消耗性資源單元,用于進程自己的消耗,不再將它們返回給該資源類中。
2.可搶占性資源和不可搶占性資源
1)可搶占性資源
對于可搶占性資源,進程在獲得這類資源后,該資源可以再被其它進程或者系統搶占。CPU和主存都屬于可搶占性資源,對于這類資源是不會引起死鎖的。
2)不可搶占性資源
對于不可搶占性資源,一旦系統把資源分配給該進程后,就不能將它強行進行回收,只能在進程用完后自行釋放。
3.死鎖定義
如果一組進程中的每一個進程都在等待僅由改組進程中的其他進程才能引發的事件,那么改組進程是死鎖的。
二、死鎖產生的原因和必要條件
1.死鎖產生的原因
死鎖的起因主要是因為多個進程對資源的搶占,對不可搶占資源進行爭奪會引起死鎖,對可消耗性資源進行爭奪時,也會引起死鎖。
(1)競爭不可搶占性資源引起死鎖
如果有兩個進程P1和P2,和兩個不可搶占性資源val1和val2,如果此時P1和P2分別擁有val1和val2而此時P1和P2在擁有現有資源情況下,又要去獲取對方擁有的資源,那么就會產生死鎖。
(2)競爭可消耗資源引起死鎖
信號量本身就可以當作一個可消耗資源。對于可消耗資源的競爭一般來說都會伴隨著生產者和消費者,如果可消耗資源沒有辦法生產了,而進程去搶占這個可消耗資源就會引起死鎖。
此外進程推進順序不當也引起死鎖。而順序推進不當會造成以上所說的兩種結果。
2.死鎖產生的必要條件
(1)互斥條件。即一個資源在某一段時間內只能被一個進程占用,如果此時有其他進程請求該資源,則請求只能進程只能等待,直至占有該資源的進程用完釋放。
(2)請求和保持。進程已經擁有了至少一個資源,但是又提出新的資源請求,而該資源已經被其他資源占用,此時請求被阻塞,但是對自己已經獲得的資源保持不放。
(3)不可搶占條件。進程已經獲得的資源在未使用完之前不能被搶占,只能在進程使用完時由自己釋放。
(4)循環和等待條件。發生死鎖時,一定存在著一個進程——資源的循環鏈。
三、預防死鎖的方法
互斥條件是非共享設備所必須的,不僅不能改變,還應該加以保證。因此預防死鎖的三種方法就是破壞產生死鎖的必要條件中的后三個,即請求與保持、不可搶占、循環等待。
1.破壞“請求和保持”條件
破壞該條件必須要滿足:當一個進程在請求資源時,它不能持有不可搶占資源。達到該行為可以采用以下兩種方法中的任意一個:
(1)所有進程在開始之前,一次性申請其在整個運行過程中所需要的全部資源。也就是進程運行期間,不會再申請資源,破壞了請求條件。只要有一種資源不滿足進程的要求,即使其他所需要的各資源都空閑也不分配給該進程,而是讓該進程等待。也就是說該進程在等待期間未占有任何資源,破壞了保持條件。
優點: 簡單、安全。
缺點:
①資源被嚴重浪費。進程在一開始時就一次性占用整個運行過程中所需要的資源,其中有些資源可能僅在運行快結束時才使用,而這個進程卻在整個運行期間都在占用。
②進程經常會發生饑餓現象。因為僅當進程在獲得了其所需的全部資源后才能開始運行,這樣就可能由于個別資源長期被其他進程占用,而導致等待該資源的進程遲遲不能開始運行。
(2)允許一個進程只獲得運行初期所需要的資源后便開始運行,進程運行過程中再逐步釋放已分配給自己的、且已用完的全部資源,然后再請求新的所需資源。
這個方法比第一種方法好。因為這個主要點在于申請其他資源時,首先將自己已經用完的資源給釋放掉。但是這個還有一點就是,沒有提及自己占用但是沒有使用完的資源。自己占用但是還沒用完的資源不釋放的話,仍然有可能造成死鎖。這個可以用下面的“破壞不可搶占條件”解決。
2.破環“不可搶占”條件
當一個已經保持了某些不可被搶占資源的進程,提出新的資源請求而不能得到滿足時,它必須釋放已經保持的所有資源。等以后需要時再重新申請。這意味著進程所占有的資源會被暫時的釋放或者被搶占。從而破壞不可搶占條件。
缺點:方法實現復雜,代價大。因為一個資源的釋放可能意味著之前利用該資源做的事情可能會失效,后面需要重新做。
3.破壞“循環等待”條件
對系統所有資源類型進行線性排序,并且賦予不同的序號。即規定程序必須按照一定的順序來請求資源。假設給每個資源設定一個序號,規定每個進程必須按照序號遞增的順序來請求資源,假設進程a現在擁有序號3的資源,那么該進程可以請求序號在3以后的資源,如果需要多個同類資源單元,則必須一起請求。如果該進程想請求一個低序號的資源,必須先釋放所有具有相同或者更高序號的資源后,才能申請低序號的資源。
所以重點都在如何確定資源的序號。一般都是根據進程需要的資源的先后順序來確定資源的序號。
總結
以上是生活随笔為你收集整理的计算机操作系统——死锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++——互斥量
- 下一篇: 二叉树的基本操作及哈夫曼编码/译码系统的