《現代作業系統》讀書筆記 死鎖篇

2021-07-07 01:15:47 字數 3037 閱讀 8207

標籤: 讀書筆記 校招 作業系統 面試

可剝奪資源:是指雖然資源佔有者程序需要使用該資源,但另乙個程序可以強行把該資源從佔有者程序處剝奪來歸自己使用。

不可剝奪資源:是指除佔有者程序不再需要使用該資源而主動釋放資源,其他程序不得在佔有者程序使用資源過程中強行剝奪。

如果乙個程序集合中的每個程序都在等待只能由該程序集合中的其他程序才能引發的事件,那麼,該程序集合就是死鎖的.

目前用於處理死鎖的方法主要有以下4種:

1. 鴕鳥演算法:指像鴕鳥一樣對死鎖視而不見,即不理睬死鎖。

2. 預防死鎖:通過設定某些限制條件,去破壞產生死鎖的4個必要條件中的乙個或幾個來預防死鎖的產生。

3. 避免死鎖:在資源的動態分配過程中,用某種方法防止系統進入不安全狀態,從而避免死鎖的產生。

4. 檢測及解除死鎖:通過系統的檢測機構及時地檢測出死鎖的發生,然後採取某種措施解除死鎖。

鴕鳥演算法的思路就是把頭埋在沙子裡面,不管問題的發生.

當死鎖發生的頻率足夠低的時候,這種方法就是可以接受的.考慮乙個個人pc機,如果乙個月出現一次死鎖,那麼就可以直接重啟就好了.

在這種方法中,系統並不阻止死鎖的發生.而是允許死鎖發生,當檢測到死鎖發生後,採取措施進行恢復.本節我們考慮檢測死鎖的幾種演算法和幾種處理的辦法.

程序的死鎖問題可以用有向圖更加準確而形象地描述,這種有向圖稱為系統資源分配圖。

其中方框表示資源,圓圈表示程序.方框指向程序的箭頭表示資源被程序所占用

可以用簡化資源分配圖的方法來檢測系統狀態s是否是死鎖狀態。簡化方法如下:

s為死鎖狀態的條件是:當且僅當s狀態的資源分配圖是不可完全簡化的,該定理稱為死鎖定理。

每種型別乙個資源的死鎖檢測

對於上圖中的死鎖,可以用如下方法檢測:

1. 對圖中每乙個節點n,將n作為起始點執行下面5個步驟.

2. 將l初始化為空表,並清除所有的有向邊標記

3. 將當前節點新增到l的尾部,並檢測該節點是否在l中已出現兩次.如果是,那麼該圖包含了乙個環,演算法結束.

4. 從給定的節點開始,檢測是否存在沒有標記的從該節點出發的弧(有向邊).如果存在做第五步,如果不存在第六步

5. 隨機選取一條沒有標記的從該節點出發的弧,標記它.然後順著這條弧線找到新的當前節點,返回到第三步.

6. 如果這乙個節點是起始節點,那麼表明該圖不存在任何環,演算法結束.否則意味著我們走入了死胡同,所以需要移走該節點,返回前乙個節點,即當前節點前乙個節點,並將它作為新的當前節點,同時轉到第三步.

這一演算法是依次將每乙個節點作為一棵樹的根節點,並進行深度優先搜尋.如果再次碰到已經遇到過的節點,那麼就算找到乙個環.如果從任何給定節點出發的弧都被窮舉了,那麼就回溯到前面的節點,如果回溯到根並不能再深入下去,那麼從當前節點觸發的子圖中就不包含任何環.如果對每個節點都是如此,那麼整個圖就不存在環,也就是說系統並不存在死鎖.

一旦檢測出系統中出現了死鎖,就應使陷入死鎖的程序從死鎖狀態中解脫出來。常用的解除死鎖方法有兩種:

在避免死鎖的辦法中,所施加的限制條件較弱,有可能獲得較好的系統效能。在該方法中把系統的狀態分為安全狀態和不安全狀態,只要能使系統始終處於安全狀態,便可以避免死鎖的發生。

安全狀態:按某方案分配資源系統一定不會進入死鎖。

不安全狀態:按某方案分配資源,系統有可能進入死鎖。

安全狀態一定不會導致死鎖,不安全狀態不一定會導致死鎖,但是有可能導致死鎖。

銀行家演算法中使用的資料結構如下:

「矩陣三兄弟」具有如下關係:need[i][j]=max[i][j]-allocation[i][j];

銀行家演算法的流程圖如下:

死鎖避免從本質上說是不可能的,因為它需要獲知未來的請求,而這些請求是不可知的.那麼實際的系統是怎麼避免死鎖的呢.

主要是破壞死鎖的四個必要條件.

* 互斥條件

為了破壞互斥條件,就要允許多個程序同時訪問資源。但是這會受到資源本身固有特性的限制,有些資源根本不能同時訪問,只能互斥訪問,如印表機就不允許多個程序在其執行期間交替列印資料,只能互斥使用。由此看來,通過破壞互斥條件來防止死鎖的發生是不大可能的。

* 不剝奪條件

為了破壞不剝奪條件,可以制定這樣的策略:對於乙個已經獲得了某些資源的程序,若新的資源請求不能立即得到滿足,則它必須釋放所有已經獲得的資源,以後需要資源時再重新申請。

* 請求與保持條件

為了破壞請求與保持條件,可以採用預先靜態分配方法。預先靜態分配法要求程序在其執行之前一次性申請它所需要的全部資源,在它的資源未滿足前,不把它投入執行。一旦投入執行後,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統不會發生死鎖。

* 環路等待條件

為了破壞環路等待條件,可以採用有序資源分配法。有序資源分配法是將系統中的所有資源都按型別賦予乙個編號(例如印表機為1,磁帶機為2),要求每乙個程序均嚴格按照編號遞增的次序請求資源,同類資源一次申請完。

雖然在一般情況下預防死鎖和避免死鎖並不是很有希望,但是在一些特殊的應用方面,有很多卓越的專用演算法.

例如資料庫中常用的辦法是兩階段加鎖.在第一階段,程序試圖對所有所需的記錄進行加鎖,一次鎖乙個記錄.如果第一階段成功,就開始第二階段,完成更新然後釋放鎖.在第一階段並沒有做實際的工作.

如果在第一階段某個程序需要的記錄已經被加鎖,那麼該程序釋放它所有的加鎖記錄,然後重新開始第一階段.從某種意義上說,這種方法類似於提前或者至少是未實施一些不可逆操作之前請求所有的資源.在兩階段加鎖的一些版本中,如果在第一階段碰到了已經加鎖的記錄,並不會釋放鎖然後重新開始,這就可能導致死鎖.

但是在一般情況中,這種策略並不通用,因為,讓乙個程序重新開始是那麼現實的.

在某種情形下,輪詢可用於進入臨界區或者獲取資源.

在下面這段**中,

void process_a(void)

void process_b(void)

如果a程序得到資源1,然後b得到2,然後它們就會一直輪詢下去,雖然沒有死鎖現象(程序沒有阻塞),但是死鎖確實發生了.這就是活鎖;

在動態執行的系統中,在任何時刻都有可能請求資源,這就需要一些策略來決定在什麼時候誰獲得資源.雖然這個策略表面上很有道理,但是依然有可能使一些程序永遠得不到服務,雖然它們並不是死鎖程序.

讀書筆記 現代作業系統 6死鎖 6 5死鎖避免

系統判斷分配資源是否安全,並且只能在保證安全的條件下分配資源。當在t點時系統必須做出正確的判斷,應該將一部分程式掛起以避免產生死鎖 需要區別的是不安全狀態並不是死鎖狀態。從安全狀態出發,系統能夠保證所有程序都能完成,而從不安全狀態吃飯,就沒有這樣的保證。從個人的理解看 不安全狀態有可能進入死鎖狀態但...

讀書筆記 現代作業系統

ch1.1.作業系統中,抽象非常重要,乙個複雜的任務可以抽象成多個簡單的子任務,將複雜的硬體抽象成簡單的介面,書中針對向上層應用提供的介面做詳細的講解,但是對於使用者 終端使用者 介面不會做研究.2.作業系統中的資源有時間資源和空間資源,以及硬碟的空間資源,時間資源是時間復用的 如cpu的輪轉 空間...

《現代作業系統》讀書筆記 記憶體管理篇

標籤 讀書筆記 校招 作業系統 面試 實體地址是指出現在cpu外部位址匯流排上的定址物理記憶體的位址訊號,是邏輯位址變換後的最終結果位址,實體地址空間是指記憶體中實體地址單元的集合。記憶體保護是為了防止乙個作業有意或無意地破壞作業系統或其他作業。常用的儲存保護方法有界限暫存器方法和儲存保護鍵方法。界...