死鎖避免中的安全狀態和不安全狀態
在圖6-9a中有一個A擁有3個資源例項但最終可能會需要9個資源例項的狀態。B當前擁有2個資源例項,將來共需要4個資源例項。同樣,C擁有2個資源例項,還需要另外5個資源例項。總共有10個資源例項,其中有7個資源已經分配,還有3個資源是空閒的。
圖 6-9a
圖6-9a的狀態是安全的,這是由於存在一個分配序列使得所有的程式都能完成。也就是說,這個方案可以單獨地執行B,直到它請求並獲得另外兩個資源例項,從而到達圖6-9b的狀態。當B完成後,就到達了圖6-9c的狀態。然後排程程式可以執行C,再到達圖6-9d的狀態。當C完成後,到達了圖6-9e的狀態。現在A可以獲得它所需要的6個資源例項,並且完成。這樣系統通過仔細的排程,就能夠避免死鎖,所以圖6-9a的狀態是安全的。
現在假設初始狀態如圖6-10a所示。但這次A請求並得到另一個資源,如圖6-10b所示。我們還能找到一個序列來完成所有工作嗎?我們來試一試。排程程式可以執行B,直到B獲得所需資源,如圖6-10c所示。
最終,程式B完成,狀態如圖6-10d所示,此時進入困境了。只有4個資源例項空閒,並所有活動程式都需要5個資源例項。任何分配資源例項的序列都無法保證工作的完成。於是,從圖6-10a到圖6-10b的分配方案,從安全狀態進入到了不安全狀態。從圖6-10c的狀態出發執行程式A或C也都不行。回過頭來再看,A的請求不應該滿足。
值得注意的是,不安全狀態並不是死鎖。從圖6-10b出發,系統能執行一段時間。實際上,甚至有一個程式能夠完成。而且,在A請求其他資源例項前,A可能先釋放一個資源例項,這就可以讓C先完成,從而避免了死鎖。因而,安全狀態和不安全狀態的區別是:從安全狀態出發,系統能夠保證所有程式都能完成;而從不安全狀態出發,就沒有這樣的保證。
相關文章
- 執行緒狀態和鎖執行緒
- 使用jstack檢測Java應用的死鎖(deadlock)狀態JSJava
- mysql 鎖狀態的一些狀態資訊記錄MySql
- 偏向鎖狀態轉移原理
- 約玩原始碼中執行緒的呈現狀態,死鎖程式碼如何寫?原始碼執行緒
- synchronized四種鎖狀態的升級synchronized
- java執行緒的狀態+鎖分析Java執行緒
- Flutter 中如何保持Tabbar和TabbarView的狀態?FluttertabBarView
- 狀態模式的理解和示例模式
- 前端狀態管理與有限狀態機前端
- SAP Fiori和WebClient UI的有狀態和無狀態行為設計原理WebclientUI
- Blazor中的無狀態元件Blazor元件
- React Native 中的狀態列React Native
- 程式的建立和程式的狀態
- Java執行緒狀態及同步鎖Java執行緒
- win10中word怎麼切換改寫狀態_win10怎樣切換插入狀態和改寫狀態Win10
- React 狀態管理:狀態與生命週期React
- MySQL探祕(五):InnoDB鎖的型別和狀態查詢MySql型別
- 如何避免死鎖和活鎖? - simar
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- JavaSE_多執行緒入門 執行緒安全 死鎖 狀態 通訊 執行緒池Java執行緒
- 狀態管理
- 狀態碼
- 狀態機
- 狀態列
- 淺談前端的狀態管理,以及anguar的狀態管理庫前端
- 深入理解Flink中的狀態
- 架構設計(五):有狀態服務和無狀態服務架構
- ⚠️Flutter的 狀態管理⚠️Flutter
- DeFi:Meme的狀態
- React的狀態管理React
- 死鎖是什麼?如何預防和避免死鎖?
- docker - 生命週期和狀態Docker
- 談談RxSwift和狀態管理Swift
- HTTP 狀態碼 和 git 命令HTTPGit
- 狀態管理庫MobX和reactReact
- 狀態管理庫 MobX 和 reactReact
- 皮帶執行狀態識別智慧礦山一體機人員乘坐皮帶識別針對物的不安全狀態的演算法保障演算法