第十五天 Deadlocks(死結)--中
今天我們來說如何處理deadlock吧!
處理deadlock的方法有四種:Prevention、Avoidance、Detection跟Ignore
Prevention(預防):設計時就不讓deadlock產生
如果要用預防這個方法會比較辛苦,他就要針對我們上一篇所說形成deadlock的四個條件做處理。
Avoidance(避免):有可能會發生deadlock,但盡量避免
在avoidance前system必須要知道的事有:
Safe state是判斷system是否是安全狀態,如果所有process在要求resource時,都能照順序就不會有circular wait和deadlock的情形。也就是說如果有process1要資源時,並不用立刻要求,可以等到另外一個process2用完。而process2用完歸還後,還能拿到下一個要使用的resource。System如果在safe state,那他一定沒有deadlock,但如果在unsafe state,那他就有可能會發生deadlock。Avoidance就是確保system不會進到unsafe state。
Avoidance的演算法分為兩種:
Resource-Allocation Graph:
產生時有個標準:
在這裡process也必須先知道要多少resource,而且只有在不形成cycle時才能接受請求。以下是不安全的RAG:
Banker’s algorithm:
在使用前有些事要注意,1. 就是每個process要預先知道運用多少resource 2. Process要求resource時,需要等待 3. 當process用完resource時,要return回去
Banker’s algorithm的資料結構為:
假設有n個process,m個resource type
判斷是不是safety的演算法,是用兩個暫時的陣列Work(代表resource type)和Finish[i](代表process是否執行完成,i = 0,1,…,n-1):
判斷resource-request演算法是否安全,用下面幾個步驟判別:
Request i = Process i的request vector
Request i [j] = k -> Pi要Rj內k個instance
如果結果計算出來是safe,resource可以分配給process; 如果結果計算出來是unsafe,那process就還要繼續等,而且要把舊的resource-allocation state結束掉。
以下有例題及運算:
有5個process,3個resource type(A有10個instance、B有5個instance、C有7個instance)
如果process照著順序做完,那system就是在safe state(會釋放instance)。
像下面第一張圖,P1要先request(1,0,2),他一樣也可以繼續進行,因為instance還夠用,但如果現在是P4要先request(3,3,0)那就不行,因為現有的instance不足。而第二張圖是P0要先request(0,2,0),如果照第一張圖的順序是unsafe的,要換成另外一種執行順序才可以。
剩下兩個我們明天繼續加油!