【梳理】簡明操作系統原理:銀行家算法(內附文檔高清截圖)

銀行家算法
W. Dijkstra的銀行家算法是一種避免死鎖的算法。命名原因是該算法原本爲銀行設計,確保銀行發放貸款時,不會發生不能滿足全部客戶的需求的情況。
1、銀行家算法需要的數據結構
設1個CPU核心上有:
s個進程。進程向量
P ⃗=(p,p_2,…,p_s)
t種空閒資源。空閒資源向量
F ⃗=(f_1,f_2,…,f_t)
最大需求矩陣
M =(m_i ,j )(s×t)
m_i ,_j表示:第i個進程p_i在運行過程中需要j種資源的最大數量。
分配矩陣
A=(a_i ,j )(s×t)
a_i ,_j表示:進程p_i已經分配到資源j的數量。
需求矩陣
N=(n_i ,j )(s×t)
n_i ,_j表示:進程p_i在對資源j的需求最大的時刻,仍然需要分配的資源j的數量。
不難看出
∀i∈{1,…,s}, j∈{1,…,t}, n_i ,_j=m_i ,_j-a_i ,_j
2、銀行家算法的步驟
設現在開始向進程p_i嘗試分配需要的資源。進程p_i需要的每種資源的數量用請求向量R_i=(r_i ,_1,〖 r〗_i ,_2,…, r_i ,_t)表示。
銀行家算法的步驟是:
【1】如果r_i ,_j≤n_i ,_j,則跳至【2】;否則報錯,因爲進程p_i需要的資源用量超過原先已知的最大值。
【2】如果r_i ,_j≤a_i ,_j,則跳至【3】;否則,當前可用資源不足,進程p_i需要等待,或嘗試爲另一個進程分配資源。
【3】系統開始嘗試將資源分配給進程p_i。先修改如下的值:
F ⃗_j-=r_i ,_j
a_i ,_j+=r_i ,_j
n_i ,_j-=r_i ,_j
注:因爲要模擬滿足該進程的請求後,該進程及其它進程剩餘的資源獲取請求是否依然能滿足,所以上述三條表達式中的第1、第3條是必須的;第2條可以移到【4】中執行,但安全性算法中也需要相應修改。
【4】執行安全性算法。若安全,則正式將資源分配給進程p_i(即:在完成【3】的基礎上繼續);否則,撤銷【3】(即嘗試分配作廢,進程p_i繼續等待)。
3、安全性算法
【1】設:工作向量
W ⃗=F ⃗
其長度爲t,用於模擬資源分配後各個資源剩餘的數量。
完成向量
C ⃗=(0, 0,…, 0)
其長度爲s,用於在模擬中標記一個進程在資源需求最高時是否仍能順利獲得所需資源並完成。進程未完成和完成分別標記0和1。
【2】在s個進程中,任選一個進程p_i能滿足
c_i=0
n_i ,_j≤w_i ,_j
若找到,跳至【3】;否則,跳至【4】。
【3】找到了【2】中所描述的進程,意味着剩餘資源數量可以滿足該進程的最大需求,並供該進程運行至完成。該進程在完成後釋放它佔有的全部資源:
w_j+=a_i ,_j
c_i=1
【4】如果s個進程全部完畢,即C ⃗的每一項均爲1,則系統處於安全狀態;否則,系統處於不安全狀態。
系統處於安全狀態,意味着存在一個序列
{〖P_k〗_1,…,〖P_k〗_s }, k_1,…,k_s 是1,2,……,s的一個全排列
使得:按照該順序爲s個進程分配所需資源,且每個進程都在上一個進程結束後才繼續,則能夠保證所有進程都可以順利結束,不會產生死鎖。

銀行家算法並不是普適性的算法。它只在少數領域有用,例如只運行特定任務、對每個運行任務的行爲都知根知底的一些嵌入式系統。總之,死鎖一般是不可完全避免的。各種預防、避免死鎖的方法都有其弊端。具體採用哪些方案,應當結合操作系統面對的應用環境來決定。
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章