現代作業系統 第六章 死鎖

2021-10-10 06:47:24 字數 3259 閱讀 8611

什麼是死鎖?a請求實驗燒錄機,但該請求在b釋放光碟燒錄機前拒絕,但是程序b非但不放棄燒錄機還去申請掃瞄器,兩個程序被阻塞,並且一直處於這樣的狀態,這就是死鎖(dead lock)

需要排他性使用的物件稱為資源(resource),即硬體裝置或是一組資訊,簡單來說就是隨著時間的推移必須能獲得、使用以及釋放的任何東西。

資源分兩類:可搶占的和不可搶占的。

可搶占資源(preemptable resource)可以從擁有它的程序中搶占而不會產生任何***。

不可搶占資源(nonpreemptable resource)是指在不引起相關的計算失敗的情況下,無法把它從占有它的程序處搶占過來。

使用乙個資源所需要的事件順序:

請求資源;

使用資源;

釋放資源。

若請求時資源不可用,則請求程序被迫等待。當乙個程序請求資源失敗時,它通常會處於這樣乙個小迴圈中:請求資源、休眠、再請求。

如果只有乙個程序,就沒有必要慎重地獲取資源,因為不存在資源競爭。

編碼風格上的細微差別(哪乙個資源先獲取)造成了可以執行的程式和不能執行而且無法檢測錯誤的程式之間的差別。

死鎖(dead clock)的定義:如果乙個程序集合中的每個程序都在等待只能由該程序集合中的其他程序才能引發的事件,那麼,該程序集合就是死鎖的。

發生資源死鎖(resource deadlock)的四個必要條件:

互斥條件:每個資源要麼已經分配給了乙個程序,要麼就是可用的;

占有和等待條件:已經得到了某個資源的程序可以再請求新的資源;

不可搶占條件:已經分配給乙個程序的資源不能強制性地被搶占,它只能被占有它的程序顯式地釋放;

有四種處理死鎖的策略:

忽略該問題:也許如果你忽略它,它也會忽略你;

檢測死鎖並恢復:讓死鎖發生,檢測它們是否發生,一旦發生死鎖,採取行動解決問題;

仔細對資源進行分配:動態地避免死鎖;

通過破壞引起死鎖的四個必要條件之一:防止死鎖發生。

最簡單的解決辦法是鴕鳥演算法,把頭埋進沙子裡,假裝沒有看見(ヾ(≧▽≦*)o)

死鎖檢測和恢復:在使用這種技術時,系統並不試圖阻止死鎖的發生,而是允許死鎖發生,當檢測到死鎖發生後,採取措施進行恢復;

依次將資源分配圖中每乙個節點作為一棵樹的根節點,並進行深度優先搜尋,如果再次碰到已經遇到過的節點,那麼就算找到了乙個環。

可以用一種基於矩陣的演算法來檢測p1到pn這n個程序中的死鎖,假設資源型別數為m,e是現有資源向量(existing resource vector),代表每種已經存在的資源總數,c代表當前分配矩陣(current allocation matrix),r代表請求矩陣(request matrix),死鎖檢測演算法如下:

尋找乙個沒有標記的程序pi,對於它而言r矩陣的第i行向量小於或等於a,

如果找到了這樣乙個程序,那麼將c矩陣的第i行向量加到a中,標記該程序,並轉到第1步,

如果沒有這樣的程序,那麼演算法終止,演算法結束時,所有沒有標記過的程序都是死鎖程序。

何時檢測死鎖:1)每當有資源請求時去檢測,2)每隔k分鐘檢測一次或者當cpu的使用頻率降到某一域值時去檢測。

利用搶占恢復:

在某些情況下,臨時將某個資源從它的當前所有者那裡轉移到另乙個程序。尤其是對執行在大型主機上的批處理作業系統來說,需要人工進行干預

利用回滾恢復:

周期性地對程序進行檢查點檢查(checkpointed,即將程序的狀態寫入乙個檔案以備以後重啟),一旦檢測到死鎖,就進行恢復,從乙個較早的檢查點上開始,擁有所需要資源的程序回滾到乙個時間點,在該時間點後所作的所有工作都丟失。

通過殺死程序恢復:

即殺死乙個或若干個程序,一種方法是殺掉死鎖環中的乙個程序(如果行不通就繼續殺死別的程序直到打破死鎖環),另一種方法是選乙個死鎖環外的程序作為犧牲品以釋放該程序的資源。

是否存在一種演算法總能正確的選擇從而避免死鎖? 有,但條件是事先獲得一些特定的資訊

建立平面直角座標系,上、右兩個方向代表兩個併發執行可能發生資源死鎖的程序的相對於時間的進度,執行某個程序就向相應方向行進相應距離,行進軌跡若部分位於兩程序請求同資源的進度重疊區,則會死鎖。

安全狀態和不安全狀態的區別是:從安全狀態出發,系統能夠保證所有程序都能完成;而從不安全狀態出發,就沒有這樣的保證。

dijkstra提出了一種能夠避免死鎖的排程演算法,稱為銀行家演算法(banker』 algorithm),能夠判斷若滿足程序對資源的請求是否會進入不安全狀態。

已分配資源矩陣c儲存不同程序已被分配的不同資源數,仍被需要資源矩陣r儲存不同程序仍需要的不同資源數,向量e、p、a分別表示現有不同資源數、已分配不同資源數、可用不同資源數,檢測乙個狀態是否安全的演算法如下:1)查詢c矩陣中是否有一行,其沒有被滿足的資源數均小於或等於a,如果不存在這樣的行,那麼系統將會死鎖,因為任何程序都無法執行結束,2)假若找到這樣一行,那麼可以假設它獲得所需的資源並執行結束,將該程序標記為終止,並將其資源加到向量a上,3)重複以上兩步,直到所有的程序都標記為終止,其初始狀態是安全的,或者所有程序的資源需求都得不到滿足,此時就是發生了死鎖。

可以使用假離線技術。

一種實現方法是規定所有程序在開始執行前請求所需的全部資源;另一種方案是要求當乙個程序請求資源時,先暫時釋放其當前占用的所有資源,然後再嘗試一次獲得所需的全部資源。

將資源虛擬化,然後搶占。

一種方法是保證每乙個程序在任何時刻只能占用乙個資源;另一種方法是將所有資源統一編號,所有請求必須按照資源編號的順序提出。

兩階段加鎖(two-phase locking):第一階段,程序試圖對所有所需的記錄進行加鎖,一次鎖乙個記錄,如果第一階段加鎖成功,就開始第二階段,完成更新然後釋放。

兩個程序在相互通訊中可能因丟失資訊而死鎖,這種死鎖稱為通訊死鎖(communication deadlock)。可以用超時來中斷通訊死鎖。

執行的程序沒有阻塞也沒有進展的現象稱為活鎖(live lock)。

飢餓(starvation)即程序因一直得不到資源而阻塞(非死鎖的情況下)的現象。

飢餓可以通過先來先服務資源分配策略來避免。

資源死鎖是程序一直等待其他程序被占用的資源(不可能自行被釋放的)釋放的事件。可以忽略小概率死鎖;可以檢測死鎖並解決它;可以通過跟蹤安全與不安全狀態來避免死鎖;可以在設計系統時就不允許死鎖發生。

作業系統 第六章 同步

協作程序能與系統內的其他執行程序相互影響。協作程序或能直接共享邏輯位址空間 即 和資料 或能通過檔案或訊息來共享資料,然而共享資料的併發訪問可能導致資料的不一致 共享資料併發 並行訪問 例 有界緩衝 防止競爭條件方法 併發程序同步或互斥 互斥若能保證諸程序互斥進入關聯的臨界區,可實現對臨界資源的互斥...

作業系統概念第六章 同步

多個程序併發訪問和操作同一資料並且執行結果與訪問順序有關,稱為競爭條件。為防止出現競爭條件,需確保一次只有乙個程序可以運算元據,為此要求這些程序按照一定方式來進行同步。同步的解決方案1 互斥鎖 當乙個程序試圖獲取不可用的鎖時,它會阻塞,知道鎖被釋放。當有乙個程序在臨界區時,任何其他程序在進入臨界區時...

作業系統第六章 檔案管理

檔案在檔案系統中是乙個基本的管理單元,這個管理單元必然有一組屬性 資料形式 訪問控制屬性 組織形式和處理方法 作業系統中的各類檔案 管理檔案的軟體,以及管理檔案所涉及到的資料結構等資訊的集合 物件及其屬性 對物件操縱和管理的軟體集合 檔案系統的介面 close也會出錯,乙個是資料還沒有寫進乙個是檔案...