《銀行家算法 實(shí)驗(yàn)資料報(bào)告材料》由會(huì)員分享,可在線閱讀,更多相關(guān)《銀行家算法 實(shí)驗(yàn)資料報(bào)告材料(10頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、word
淮海工學(xué)院計(jì)算機(jī)工程學(xué)院
實(shí)驗(yàn)報(bào)告書
課程名:《操作系統(tǒng)原理》
題 目: 銀行家算法
班 級(jí):
學(xué) 號(hào):
姓 名:
評(píng)語(yǔ):
成績(jī): 指導(dǎo)教師:
批閱時(shí)間: 年 月 日
9 / 10
一、實(shí)驗(yàn)?zāi)康?
銀行家算法是操作系統(tǒng)中防止死鎖的典型算法,本實(shí)驗(yàn)可以加深對(duì)銀行家算法的步驟
2、和相關(guān)數(shù)據(jù)結(jié)構(gòu)用法的更好理解。
實(shí)驗(yàn)環(huán)境
實(shí)驗(yàn)學(xué)時(shí)
4學(xué)時(shí),必做實(shí)驗(yàn)。
二、實(shí)驗(yàn)容
用C語(yǔ)言編寫一個(gè)簡(jiǎn)單的銀行家算法模擬程序,用銀行家算法實(shí)現(xiàn)資源分配。程序能模擬多個(gè)進(jìn)程共享多種資源的情形。進(jìn)程可動(dòng)態(tài)地申請(qǐng)資源,系統(tǒng)按各進(jìn)程的申請(qǐng)動(dòng)態(tài)地分配資源。要求程序具有顯示和打印各進(jìn)程的某一時(shí)刻的資源分配表和安全序列;顯示和打印各進(jìn)程依次要求申請(qǐng)的資源數(shù)量以與為某進(jìn)程分配資源后的有關(guān)資源數(shù)據(jù)的情況。
三、 實(shí)驗(yàn)說(shuō)明
實(shí)驗(yàn)中進(jìn)程的數(shù)量、資源的種類以與每種資源的總量Total[j]最好允許動(dòng)態(tài)指定。初始時(shí)每個(gè)進(jìn)程運(yùn)行過(guò)程中的最大資源需求量Max[i,j]和系統(tǒng)已分配給該進(jìn)程的資源量A
3、llocation[i,j]均為〔這些數(shù)值可以在程序運(yùn)行時(shí)動(dòng)態(tài)輸入〕,而算法中其他數(shù)據(jù)結(jié)構(gòu)的值〔包括Need[i,j]、Available[j]〕如此需要由程序根據(jù)量的值計(jì)算產(chǎn)生。
四、 實(shí)驗(yàn)步驟
1、 理解本實(shí)驗(yàn)中關(guān)于兩種調(diào)度算法的說(shuō)明。
2、 根據(jù)調(diào)度算法的說(shuō)明,畫出相應(yīng)的程序流程圖。
3、 按照程序流程圖,用C語(yǔ)言編程并實(shí)現(xiàn)。
五、分析與思考
1. 要找出某一狀態(tài)下所有可能的安全序列,程序該如何實(shí)現(xiàn)?
答:要找出這個(gè)狀態(tài)下的所有可能的安全序列,前提是要是使這個(gè)系統(tǒng)先處于安全狀態(tài),而
系統(tǒng)的狀態(tài)可通過(guò)以下來(lái)描述:
進(jìn)程剩余申請(qǐng)數(shù)=最大申請(qǐng)數(shù)-占有數(shù); 可分配資源數(shù)=
4、總數(shù)-占有數(shù)之和;
通過(guò)這個(gè)描述來(lái)算出系統(tǒng)是否安全,從而找出所有的安全序列。
2. 銀行家算法的局限性有哪些?
答:銀行家算法是一種最有代表性的防止死鎖的算法。銀行家算法即把操作系統(tǒng)看作是銀行 家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請(qǐng)求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)如此為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源時(shí),要測(cè)試該進(jìn)程對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量如此按當(dāng)前的申請(qǐng)量分配資源,否如此就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程已占用的資源數(shù)與本次申請(qǐng)的資源數(shù)之和是否超過(guò)了該進(jìn)程對(duì)資源的最大需求
5、量。假設(shè)超過(guò)如此拒絕分配資源,假設(shè)沒(méi)有超過(guò)如此再測(cè)試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,假設(shè)能滿足如此按當(dāng)前的申請(qǐng)量分配資源,否如此也要推遲分配。但任何一種算法都存在其缺點(diǎn),對(duì)各進(jìn)程的資源分配要求嚴(yán)格,經(jīng)常使其處于不安全狀態(tài),銀行家算法的主要局限是過(guò)于慎重和檢查各申請(qǐng)者對(duì)各類資源的最大需求量開銷較大。
六、測(cè)試數(shù)據(jù)與實(shí)驗(yàn)結(jié)果
銀行家算法流程圖〔1〕所示:
完畢
否
是
申請(qǐng)失敗。
以上分配作廢,恢復(fù)原來(lái)的分配狀態(tài):
Available[j] = Available[j] + Requesti[j]
Allocation[i][j]= Allocation[
6、i][j]-Requesti[j]
Need[i][j] = Need[i][j]+Requesti[j]
N
Y
N
Y
Requesti[j]> Need[i][j]
出錯(cuò)返回:return(error)
Requesti[j]> Available[j]
出錯(cuò)返回:(進(jìn)程阻塞)
return(error)
Available[j] = Available[j] – Requesti[j]
Allocation[i][j]= Allocation[i][j] + Requesti[j]
Need[i][j] = Need[i][j] – Requesti[j]
7、
假定分配:
輸入初始參數(shù)〔資源分配與請(qǐng)求情況〕
開始
假定分配之后,系統(tǒng)安全嗎?
申請(qǐng)成功。輸出各種數(shù)據(jù)的變化
圖〔1〕銀行家算法流程圖
運(yùn)行結(jié)果如圖〔2〕〔3〕所示:
圖〔2〕
圖〔3〕銀行家算法截圖
七、實(shí)驗(yàn)心得與體會(huì)
銀行家算法是操作系統(tǒng)中防止死鎖的典型算法。所謂死鎖: 是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過(guò)程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,假設(shè)無(wú)外力作用,它們都將無(wú)法推進(jìn)下去。此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在
8、互相等待的進(jìn)程稱為死鎖進(jìn)程。 由于資源占用是互斥的,當(dāng)某個(gè)進(jìn)程提出申請(qǐng)資源后,使得有關(guān)進(jìn)程在無(wú)外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無(wú)法繼續(xù)運(yùn)行,這就產(chǎn)生了一種特殊現(xiàn)象死鎖。
通過(guò)這次實(shí)驗(yàn),加深了我對(duì)銀行家算法的了解,掌握了如何利用銀行家算法防止死鎖。在實(shí)驗(yàn)中,難免會(huì)遇到問(wèn)題,通過(guò)自己在網(wǎng)上查找資料、詢問(wèn)同學(xué),這些問(wèn)題都得到了解決,完成了本次實(shí)驗(yàn)。通過(guò)這次的實(shí)驗(yàn),使我的理論知識(shí)更加的結(jié)實(shí)。
附錄
#include
#include
#include
#define False 0
#define True 1
in
9、t Max[100][100]={0};//各進(jìn)程所需各類資源的最大需求
int Avaliable[100]={0};//系統(tǒng)可用資源
char name[100]={0};//資源的名稱
int Allocation[100][100]={0};//系統(tǒng)已分配資源
int Need[100][100]={0};//還需要資源
int Request[100]={0};//請(qǐng)求資源向量
int temp[100]={0};//存放安全序列
int Work[100]={0};//存放系統(tǒng)可提供資源
int M=100;//作業(yè)的最大數(shù)為100
int N=100;//資源的
10、最大數(shù)為100
void showdata()//顯示資源矩陣
{
int i,j;
cout<<"系統(tǒng)目前可用的資源[Avaliable]:"<
11、<"進(jìn)程名 ";
for(j=0;j<3;j++){
for(i=0;i
12、[j]<<" ";
cout<<" ";
for(j=0;j
13、Request[j];
}
return 1;
}
int safe()//安全性算法
{
int i,k=0,m,apply,Finish[100]={0};
int j;
int flag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;i
14、 if(apply==N){
for(m=0;m
15、-1;
}
}
cout<<"系統(tǒng)是安全的!"<";
}
cout<
16、 cin>>i;//輸入須申請(qǐng)的資源號(hào)
cout<<"請(qǐng)輸入進(jìn)程 "<>Request[j];//輸入需要申請(qǐng)的資源
}
for (j=0;jNeed[i][j])//判斷申請(qǐng)是否大于需求,假設(shè)大于如此出錯(cuò)
{
cout<<"進(jìn)程 "<
17、l;
ch='n';
break;
}
else {
if(Request[j]>Avaliable[j])//判斷申請(qǐng)是否大于當(dāng)前資源,假設(shè)大于如此
{ //出錯(cuò)
cout<<"進(jìn)程"<
18、 {
changdata(i);//根據(jù)進(jìn)程需求量變換資源
showdata();//根據(jù)進(jìn)程需求量顯示變換后的資源
safe();//根據(jù)進(jìn)程需求量進(jìn)展銀行家算法判斷
}
}
void addresources(){//添加資源
int n,flag;
cout<<"請(qǐng)輸入需要添加資源種類的數(shù)量:";
cin>>n;
flag=N;
N=N+n;
for(int i=0;i>name[flag];
cout<<"數(shù)量:";
cin>>
19、Avaliable[flag++];
}
showdata();
safe();
}
void delresources(){//刪除資源
char ming;
int i,flag=1;
cout<<"請(qǐng)輸入需要?jiǎng)h除的資源名稱:";
do{
cin>>ming;
for(i=0;i
20、{
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
}
N=N-1;
showdata();
safe();
}
void changeresources(){//修改資源函數(shù)
cout<<"系統(tǒng)目前可用的資源[Avaliable]:"<>Avaliable[0]>>A
21、valiable[1]>>Avaliable[2];
cout<<"經(jīng)修改后的系統(tǒng)可用資源為"<>Max[flag][
22、i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
}
showdata();
safe();
}
int main()//主函數(shù)
{
int i,j,number,choice,m,n,flag;
char ming;
cout<<"*****************單處理機(jī)系統(tǒng)進(jìn)程調(diào)度實(shí)現(xiàn)*****************"<>n;
N=n;
for(i=0;i
23、1<<"的名稱:";
cin>>ming;
name[i]=ming;
cout<<"資源的數(shù)量:";
cin>>number;
Avaliable[i]=number;
}
cout<>m;
M=m;
cout<<"請(qǐng)輸入各進(jìn)程的最大需求量("<>Max[i][j];
do{
flag=0;
cout<<
24、"請(qǐng)輸入各進(jìn)程已經(jīng)申請(qǐng)的資源量("<>Allocation[i][j];
if(Allocation[i][j]>Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
}
if(flag)
cout<<"申請(qǐng)的資源大于最大需求量,請(qǐng)重新輸入!\n";
}
while(flag
25、);
showdata();//顯示各種資源
safe();//用銀行家算法判定系統(tǒng)是否安全
while(choice)
{
cout<<"**************銀行家算法演示***************"<
26、 4:分配資源 "<>choice;
switch(choice)
{
case 1: addresources();break;
case 2: delresources();break;
case 3: changeresources();break;
case 4: share();break;
case 5: addprocess();break;
case 0: choice=0;break;
default: cout<<"請(qǐng)正確選擇功能號(hào)(0-5)!"<