死鎖避免中的安全狀態和不安全狀態

夏日流螢發表於2020-11-26

在圖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先完成,從而避免了死鎖。因而,安全狀態和不安全狀態的區別是:從安全狀態出發,系統能夠保證所有程式都能完成;而從不安全狀態出發,就沒有這樣的保證。
在這裡插入圖片描述

相關文章