一、需求分析
1、程序的狀態有:就緒,等待和完成。當系統不能滿足程序的資源請求時,程序出於等待狀態。資源需求總量表示程序執行過程中對資源的總的需求量。已佔資源量表示程序目前已經得到但還為歸還的資源量。因此,程序在以後還需要的剩餘資源量等於資源需要總量減去已佔資源量。陷入每個程序的資源需求總量不應超過系統擁有的資源總量。
2、銀行家演算法分配資源的原則是:當某個程序提出資源請求時,假定先分配資源給它,然後查詢各程序的剩餘請求,檢查系統的剩餘資源量是否由於程序的分配而導致系統死鎖。若能,則讓程序等待,否則,讓程序的假分配變為真分配。
(1)查詢各程序的剩餘請求,檢查系統的剩餘資源量是否能滿足其中一程序,如果能,則轉b)。
(2)將資源分配給所選的程序,這樣,該程序已獲得資源最大請求,最終能執行完成。標記這個程序為終止程序,並將其占有的全部資源歸還給系統。
重複第(1)步(2)步,直到所有程序都標記為終止程序,或知道乙個死鎖發生。若所有程序都標記為終止程序,則系統的初始狀態是安全的,否則為不安全的。若安全,則正式將資源分配給它,否則,假定的分配作廢,讓其等待。
二、系統結構設計
1、設計分析
當某個程序對某類資源提出請求時,假定先分配資源給它,然後查詢各程序的剩餘請求,檢查系統的剩餘資源量是否由於程序的分配而導致系統死鎖。若能,則讓程序等待,否則,讓程序的假分配變為真分配。
2、資料結構
(1)可利用資源向量**ailable。這是乙個含有m個元素的陣列,其中的每乙個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可利用資源的數目,其中的每乙個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可利用資源的數目,其數值隨該類資源的分配和回首而動態的改變,如果**ailable=k,則代表rj類資源k個。
(2)最大需求矩陣max。這是乙個nm的矩陣,它定義了系統中n個程序中的每乙個程序對m類資源的最大需求。
(3)分配矩陣allocation。這也是乙個nm的矩陣,它定義了系統中每一類資源當前已分配給每一程序的資源數。
(4)需求矩陣need。這也是乙個nm的矩陣,用以表示每乙個程序還需要各類資源數。
3、銀行家演算法
設requesti是程序pi的請求向量,如果requesti[j]=k,表示程序pi需要k個rj型別的資源。當pi發出資源請求後,系統按照以下步驟進行檢查:
a:如果requesti[j]<=need[i,j],執行b,否則認為出錯,因為它需要的資源數已經超過它所宣布的最大值。
b: 如果requesti[j]<=**ailable[j],轉向步驟c,否則尚無足夠資源,pi必須等待。
c:系統試探著把資源分配給程序pi,並修改下面資料結構中的數值:
**ailable[j]:= **ailable[j]- requesti[j];
allocation[i,j]:=allocation[i,j]+ requesti[j];
need[i,j]:= need[i,j]- requesti[j];
d:系統執行安全性演算法,檢查此次自奧運分配後系統是否處於安全狀態。若安全,才正式將資源分配給程序pi,以完成本次分配,否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓程序pi等待。
設定work[r]是系統可提供給程序繼續執行所需的各類資源數目, 剛開始 系統可提供給程序繼續執行所需的j類資源數目,finish[i]檢查安全性是否通過。
4、程式流程圖
三、總結和體會
通過在劉玉巨集老師的幫助下,我成功的完成了這次課程設計,雖然其中存在很多的不足。在這個銀行家演算法課程設計中,利用二維陣列作為基本的資料結構用以儲存資源及程序資訊,利用check()函式來判斷程序執行是否安全,通過二維陣列和distribute ()和restore()函式很好的解決了程序的分配及撤銷問題。
實驗中我使用當乙個程序不滿足安全狀態時緊接著查詢它的下乙個程序,若下乙個程序滿足則給予分配資源,然後又返回從頭開始才找滿足安全狀態的程序,經過劉老師的課堂講解我知道還可以按照程序的編號從小到大一次下迴圈查詢,直到程序執行完畢。
不同的演算法可以實現相同的功能,這是我從本次實驗中深深體會到的,因而在今後的學習中遇到問題我會嘗試著用的不同的方法來解決,有時候換個角度可以很方便的解決問題。
四、主要演算法清單
#include
#include
#define false 0
#define true 1
#define w 10
#define r 10
int m ; //總程序數
int n ; //資源種類
int all[w];//各種資源的數目總和
int max[w][r]; //m個程序對n類資源最大資源需求量
int **ailable[r]; //系統可用資源數
int allocation[w][r]; //m個程序已經得到n類資源的資源量
int need[w][r]; //m個程序還需要n類資源的資源量
int request[r]; //請求資源個數
void output() //輸出資源分配情況
int i,j;
cout<
cout<
for (j=0;j
cout<
cout<
cout<
cout<
for (j=0;j
cout<
cout<
cout<
cout<
for (j=0;j
while (max[i][j]>all[j]);
cout<
cout<
for (i=0;i
for (j=0;j
docin>>allocation[i][j];
if (allocation[i][j]>max[i][j])
cout<
}while (allocation[i][j]>max[i][j]);
for (j=0;j
p=all[j];
for (i=0;i
p=p-allocation[i][j];//減去已經被佔據的資源
**ailable[j]=p;
if(**ailable[j]<0)
**ailable[j]=0;
for (i=0;i
for(j=0;j
need[i][j]=max[i][j]-allocation[i][j];
output();
bank();
作業系統之銀行家演算法
1 利用銀行家演算法設計系統,程序可動態地申請資源和釋放資源,系統按各程序的申請動態地分配資源。2 設計用銀行家演算法和隨機分配演算法,實現資源分配的兩個資源分配程式,應具有顯示或列印各程序依次要求申請的資源數以及依次分配資源的情況。3 確定一組各程序依次申請資源數的序列,在相同的情況下分別執行上述...
作業系統實驗 銀行家演算法
include include include 自定義bool型別 typedef int bool define false 0 define true false 系統中所有程序數量 define num of processes 5 有三類資源 a,b,c typedef struct res...
作業系統概念 銀行家演算法
互斥 一次只能有乙個程序使用資源。占有並等待 擁有至少乙個資源的程序正在等待獲取其他程序擁有的其他資源。非搶占 資源只能在擁有資源的程序完成其任務後才自動釋放。迴圈等待 等待資源的程序之間存在環 存在一組等待過程,這樣p0正在等待p1保留的資源,p1正在等待p2,pn 1保留的資源 正在等待pn保留...