標籤:演算法 lazy tps mib class cat .com 描述 n6k
【作業系統】銀行家演算法2017-05-10 若愚
上次介紹了死結的相關概念,以及各種解決辦法。今天講的是死結避免裡面的銀行家演算法。請多多指教~
一、演算法的背景
演算法由迪傑斯特拉在1965年提出。
在銀行中,客戶申請貸款的數量是有限的,每個客戶在第一次申請貸款時要聲明完成該項目所需的最大資金量,在滿足所有貸款要求時,客戶應及時歸還。銀行家在客戶申請的貸款數量不超過自己擁有的最大值時,都應盡量滿足客戶的需要。在這樣的描述中,銀行家就好比作業系統,資金就是資源,客戶就相當於要申請資源的進程。
二、演算法的思想
銀行家演算法讓進程動態地申請資源,系統在每次實施資源分派之前,先計算資源分派的安全性,即分配完是否會進入不安全狀態。若此次資源分派安全,便將資源分派給進程,否則不分配資源,讓進程等待。
三、安全狀態和不安全狀態
安全狀態就是按照某種資源分派的順序,系統所有的進程能夠順利的執行完畢,完成一些功能。
不安全狀態就是系統在某一個時刻找不到一個順利執行下去的安全序列,著這種狀態就是不安全狀態。
四、演算法理解
書面理解:作業系統按照銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就延遲分配。當進程在執行中繼續申請資源時,先測試該進程已佔用的資源數與本次申請的資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統現存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要延遲分配。
通俗理解:系統有多個種資源並且每一種資源的數目有限,有多個想要申請這些資源的進程,僧多粥少,所以要好好安排分配的順序,不然就會導致不安全狀態甚至死結。那麼如何解決呢?
首先搞出三個矩陣,一個Max各個進程需要各個資源的最大數目,Available系統有的各個資源的數目,然後就是Allocation各個進程已經得到的資源數目,然後用
Max - Allocation = Need,
就可以得到各個進程仍然需要的各個資源數目。
然後每次系統要分配資源的時候,考察兩個量:1、進程請求的資源和已經分配給他的資源之和是否超過了他的Max最大需求;2、系統的資源剩下數目能否滿足這次請求。
如果請求沒有超標並且系統足夠滿足這次請求,就分配。然後取回這個進程佔有的所有資源。
就像萬惡的資本家~
五、經典的題目類型
1)判斷系統某個狀態時候處於安全狀態
2)找出系統的一個安全序列
3)判斷按照某種分配後是否會進入死結狀態
六、例子講解
(畫圖太麻煩了...圖片來自與維基百科)
1.首先給出在某個狀態下系統的資源情況,是三個矩陣,最大需求矩陣Max,已經分配資源矩陣Allocation,系統可以分配的資源矩陣Available;
2.最大需求減去已經分配的資源,得到仍然需要的資源矩陣:
3.這個時候觀察四個進程的需求情況和系統能夠分配的資源情況,發現P2對於ABCD四種資源的需求都小於系統的資源數目,分配給P2不會進入不安全狀態,所以滿足P2的請求。然後回收P2資源,注意這裡回收的是剛剛分配出去給P2的加上P2已經有的資源。得到下面的矩陣:
4.接著發現P3的需求為 0 0 0 2,小於系統的已有資源 2 9 5 2,所以分配給P3然後回收;
5.同理,接下來分配給P4,再分配給P1,就可以完成系統的任務。或者先分配給P1也可以。可見安全序列往往不唯一。
喜歡就關注吧~
【作業系統】銀行家演算法