操作系统中的死锁问题
1 死鎖問題概述
- 一組阻塞的進程持有一種資源等待獲取另一個進程所占有的一個資源.
- 例子: 系統有兩個磁帶驅動器, P1和P2各有一個, 都需要另外一個.
2 系統模型
資源類型:
,?, ..., 包括CPU cycles, memory space, I/O devices
每個資源類型有實例.
每個進程使用資源過程如下:
可重復使用的資源:
- 在一個時間只能一個進程使用且不能被刪除
- 進程獲取資源, 后來釋放由其他進程重用
- 處理器, I/O通道, 主和副存儲器, 設備和數據結構, 如文件, 數據庫和信號量
- 如果每個進程擁有一個資源并請求其它資源, 死鎖可能發生
使用資源:
- 創建和銷毀
- 在I/O緩沖區的中斷. 信號, 消息, 信息
- 如果接收消息阻塞可能會發生死鎖
- 可能少見的組合事件會引起死鎖
2.1 資源分配圖
資源分配圖:
一組頂點V和邊E的集合:
- V
其中V有兩種類型:
- , 集合包含系統中所有的進程.
- , 集合包含系統中所有的資源類型.
- E
- requesting/claiming edge - directed edge?
- assignment/holding edge -?directed edge?
2.2 資源分配圖舉例
?
- 圖中有四種類型的資源:??(圖中的四個方格),?有一個資源實例可供使用(方格中的小圓),?有兩個,??有一個,?有三個
- 圖中有三個進程:?(圖中的三個大圓圈)
- 有四個資源正在被占用:?中的一個正在被占用,?中的一個正在被占用, 另一個正在被占用,?中的一個正在被占用
- 有兩個資源申請:?申請,?申請
此時的情況是:
- : 正在申請, 但是的唯一資源實例被占用, 等待中
- : 正在申請, 但是的唯一資源實例被占用, 等待中
- : 正在運行中
并不會出現死鎖情況, 因為使用完就會釋放,?就會拿到,?使用完,?,?會對其進行釋放,?就會拿到繼續運行, 最終所有進程順利執行完畢.
如果此時未使用完時申請了, 如圖:
此時就會有死鎖, 此時有兩個環:
通過以上例子可以看出, 當出現死鎖情況時, 資源分配圖中一定是有環的, 但是資源分配圖中有環時并不一定會出現死鎖情況, 例子如下:
?此時存在環, 但是并不會出現死鎖, 因為,?并沒有依賴, 所以其占用的資源最終會釋放, 從而其他進程可以順利拿到需要的資源并執行.
2.3 基本情況
如果資源分配圖中不包含循環, 那么就不會出現死鎖
如果圖中包含循環:
- 如果每個資源類只有一個實例, 那么就會死鎖
- 如果每個資源類有幾個實例, 那么不一定會死鎖
3 死鎖特征
死鎖出現需要以下四個條件:
- 互斥: 在一個時間只能有一個進程使用資源
- 持有并等待: 進程保持至少一個資源正在等待獲取其他進程持有的額外資源
- 無搶占: 一個資源只能被進程自愿釋放, 進程已經完成了它的任務之后.
- 循環等待: 存在等待進程集合,?正在等待所占用的資源,?正在等待所占用的資源, ...,?正在等待所占用的資源,?正在等待所占用的資源.
以上四個條件為死鎖出現的必要非充分條件.
4 死鎖處理方法
- 確保系統永遠不會進入死鎖狀態
- 運行系統進入死鎖狀態, 然后恢復
- 忽略這個問題, 假裝系統中從來沒有發生死鎖. 用于大多數操作系統, 包括UNIX.
原因(忽略死鎖問題):
- 判斷死鎖問題出現的開銷很大
- 預防死鎖會限制操作系統的能力
4.1 Deadlock Prevention
Deadlock Prevention也就是死鎖預防. 因為前文講到, 死鎖出現的四個條件為:
- 互斥
- 持有并等待
- 無搶占
- 循環等待
如果有其中一個條件不滿足, 死鎖也就不會出現.
針對每一個條件的解決方法:
- 互斥: 共享資源不是必須的, 必須占用非共享資源
- 占用并等待: 必須保證當一個進程請求的資源, 它不持有任何其他資源.
- 需要進程請求并分配其所有資源, 它開始執行之前或允許進程請求資源僅當進程沒有資源
- 資源利用率低, 可能發生饑餓.
- 無搶占
- 如果進程占有某些資源, 并請求其它不能被立即分配的資源, 則釋放當前正占有的資源
- 被搶占的資源添加到資源列表中
- 只有當它獲得舊的資源以及它請求新的資源, 進程可以得到執行?
- 循環等待: 對所有資源類型進行排序, 并要求每個進程按資源的順序進行申請?
4.2 Deadlock Avoidance
Deadlock Avoidance也就是死鎖避免, 需要系統具有一些額外的先驗信息提供:
- 最簡單和最有效的模式是要求每個進程聲明它可能需要的每個類型資源的最大數目
- 資源的分配狀態是通過限定提供與分配的資源數量, 和進程的最大需求
- 死鎖避免算法動態檢查的資源分配狀態, 以確保永遠不會有一個環形等待狀態
當一個進程請求可用資源, 系統必須判斷立即分配是否能使系統處于安全狀態. 系統處于安全狀態指: 針對所有進程, 存在安全序列:
安全狀態:
- 序列是安全的: 針對每個,?要求的資源能夠由當前可用的資源 + 所有的持有的資源來滿足, 其中.
- 如果資源的需求不是立即可用, 那么可以等到所有完成.
- 當完成后,?可以得到所需要的資源, 執行, 返回所分配的資源, 并終止.
- 用同樣的方法,?,?和能獲得其所需的資源.
如果系統處于安全狀態, 那么肯定沒有死鎖, 如果系統處于不安全狀態, 那么可能會死鎖. 避免死鎖, 也就是確保系統永遠不會進入不安全狀態, 比如銀行家算法.
4.3 Deadlock Detection
Deadlock Detection也就是死鎖檢測:
- 允許系統進入死鎖狀態
- 死鎖檢測算法
- 恢復機制
檢測方法:
- 每個資源類型單一實例
把資源分配圖簡化, 把資源節點都去掉, 只留下進程節點, 如果某一個進程需要一個資源且需要的資源被另一個進程擁有, 那么就直接建立兩個進程的連線, 并判斷整個圖是否有環
- 資源類型的幾個實例
?1. 與安全判斷算法(銀行家算法)類似, 設置以下:
- : 長度為的向量表示每種類型可用資源的數量
- : 一個的矩陣定義了當前分配給各個進程每種類型資源的數量
- : 一個矩陣表示各進程的當前請求, 如果, 表示進程請求個資源的實例.
2. 初始化:
- ? ? ? ? ? ? ? ? ? ? ? ? ? //為當前空閑資源量
- 表示線程是否結束
3. 找出這樣的索引:
- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //線程沒有結束的線程, 且此線程將需要的資源量小于當前空閑資源量, 如果沒有找到, 跳到第四步
4. 如果找不到可以直接結束的線程, 表示處于死鎖狀態
算法復雜度:
, 開銷較大
檢測算法使用時機:
- 依賴于死鎖多久可能會發生, 多少進程需要被回滾
- 如果檢測算法多次被調用, 有可能是資源圖有多個循環, 所以我們無法分辨出多個可能死鎖進程中的哪些"造成"死鎖?
4.4 Recovery from Deadlock
Recovery from Deadlock也就是死鎖恢復
如果發現系統有死鎖狀態, 有以下處理方式:
- 終止所有的死鎖進程
- 在一個時間內終止一個進程直到死鎖消除
終止進程的順序應該是:
- 進程的優先級
- 進程運行了多久以及需要多少時間才能完成
- 進程占用的資源
- 進程完成需要的資源
- 多少進程需要被終止
- 進程是交互還是批處理
- ?資源搶占
- 選擇一個受害者 -- 最小的成本
- 回滾 -- 返回到一些安全狀態, 重啟進程到安全狀態
- 饑餓 -- 同一進程可能一直被選做受害者, 包括回滾的數量
總結
以上是生活随笔為你收集整理的操作系统中的死锁问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iis7 php5 isapi配置,Wi
- 下一篇: fir滤波器matlab实现_关于FIR