银行家算法实验报告Word文档下载推荐.docx
《银行家算法实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《银行家算法实验报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。
“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。
显然,,每个进程的资源需求总量不能超过系统拥有的资源总数,银行算法进行资源分配可以避免死锁.
二、算法描述及数据结构模型
1.银行家算法:
设进程i提出请求Request[n],则银行家算法按如下规则进行判断。
(1)如果Request[n]>
Need[i,n],则报错返回。
(2)如果Request[n]>
Available,则进程i进入等待资源状态,返回。
(3)假设进程i的申请已获批准,于是修改系统状态:
Available=Available-Request
Allocation=Allocation+Request
Need=Need-Request
(4)系统执行安全性检查,如安全,则分配成立;
否则试探险性分配作废,系统恢复原状,进程等待。
2.安全性检查
(1)设置两个工作向量Work=Available;
Finish[M]=False
(2)从进程集合中找到一个满足下述条件的进程,
Finish[i]=False
Need<
=Work
如找到,执行(3);
否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work=Work+Allocation
Finish=True
GOTO2
(4)如所有的进程Finish[M]=true,则表示安全;
否则系统不安全。
3.数据结构
#defineFalse0
#defineTrue1
intMax[100][100]={0};
//各进程所需各类资源的最大需求
intAvaliable[100]={0};
//系统可用资源
charname[100]={0};
//资源的名称
intAllocation[100][100]={0};
//系统已分配资源
intNeed[100][100]={0};
//还需要资源
intRequest[100]={0};
//请求资源向量
inttemp[100]={0};
//存放安全序列
intWork[100]={0};
//存放系统可提供资源
intM=100;
//作业的最大数为100
intN=100;
//资源的最大数为100
voidshowdata()//显示资源矩阵
三、源代码
#include<
iostream.h>
string.h>
stdio.h>
{
inti,j;
cout<
<
"
系统目前可用的资源[Avaliable]:
endl;
for(i=0;
i<
N;
i++)
name[i]<
"
;
for(j=0;
j<
j++)
Avaliable[j]<
//输出分配资源
MaxAllocationNeed"
进程名"
for(j=0;
3;
j++){
}
M;
i++){
Max[i][j]<
Allocation[i][j]<
Need[i][j]<
}
intchangdata(inti)//进行资源分配
{
intj;
for(j=0;
j++){
Avaliable[j]=Avaliable[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
return1;
intsafe()//安全性算法
inti,k=0,m,apply,Finish[100]={0};
intflag=0;
Work[0]=Avaliable[0];
Work[1]=Avaliable[1];
Work[2]=Avaliable[2];
for(i=0;
i++){
apply=0;
if(Finish[i]==False&
&
=Work[j]){
apply++;
if(apply==N){
for(m=0;
m<
m++)
Work[m]=Work[m]+Allocation[i][m];
//变分配数
Finish[i]=True;
temp[k]=i;
i=-1;
k++;
flag++;
if(Finish[i]==False){
系统不安全"
//不成功系统不安全
return-1;
系统是安全的!
//如果安全,输出成功
分配的序列:
i++){//输出运行进程数组
temp[i];
if(i<
M-1)cout<
->
return0;
voidshare()//利用银行家算法对申请资源对进行判定
charch;
inti=0,j=0;
ch='
y'
cout<
请输入要求分配的资源进程号(0-"
M-1<
):
cin>
>
i;
//输入须申请的资源号
请输入进程"
申请的资源:
for(j=0;
name[j]<
:
Request[j];
//输入需要申请的资源
if(Request[j]>
Need[i][j])//判断申请是否大于需求,若大于则出错
{
进程"
申请的资源大于它需要的资源"
分配不合理,不予分配!
ch='
n'
break;
else{
Avaliable[j])//判断申请是否大于当前资源,若大于则
{//出错
进程"
申请的资源大于系统现在可利用的资源"
分配出错,不予分配!
if(ch=='
){
changdata(i);
//根据进程需求量变换资源
showdata();
//根据进程需求量显示变换后的资源
safe();
//根据进程需求量进行银行家算法判断
voidaddresources(){//添加资源
intn,flag;
请输入需要添加资源种类的数量:
cin>
n;
flag=N;
N=N+n;
for(inti=0;
名称:
name[flag];
数量:
Avaliable[flag++];
showdata();
safe();
voiddelresources(){//删除资源
charming;
inti,flag=1;
请输入需要删除的资源名称:
do{
ming;
if(ming==name[i]){
flag=0;
if(i==N)
该资源名称不存在,请重新输入:
while(flag);
for(intj=i;
N-1;
name[j]=name[j+1];
Avaliable[j]=Avaliable[j+1];
N=N-1;
voidchangeresources(){//修改资源函数
for(inti=0;
Avaliable[i]<
输入系统可用资源[Avaliable]:
Avaliable[0]>
Avaliable[1]>
Avaliable[2];
经修改后的系统可用资源为"
for(intk=0;
k<
k++)
name[k]<
Avaliable[k]<
voidaddprocess(){//添加作业
intflag=M;
M=M+1;
请输入该作业的最打需求量[Max]"
Max[flag][i];
Need[flag][i]=Max[flag][i]-Allocation[flag][i];
intmain()//主函数
inti,j,number,choice,m,n,flag;
*****************单处理机系统进程调度实现*****************"
请首先输入系统可供资源种类的数量:
N=n;
资源"
i+1<
的名称:
name[i]=ming;
资源的数量:
number;
Avaliable[i]=number;
请输入作业的数量:
m;
M=m;
请输入各进程的最大需求量("
*"
n<
矩阵)[Max]:
Max[i][j];
请输入各进程已经申请的资源量("
矩阵)[Allocation]:
Allocation[i][j];
if(Allocation[i][j]>
Max[i][j])
flag=1;
Need[i][j]=Max[i][j]-Allocation[i][j];
if(flag)
申请的资源大于最大需求量,请重新输入!
\n"
//显示各种资源
//用银行家算法判定系统是否安全
while(choice)
**************银行家算法演示***************"
1:
增加资源"
2:
删除资源"
3:
修改资源"
4:
分配资源"
5:
增加作业"
0:
离开"
*******************************************"
请选择功能号:
choice;
switch(choice)
{
case1:
addresources();
break;
case2:
delresources();
case3:
changeresources();
case4:
share();
case5:
addprocess();
case0:
choice=0;
default:
请正确选择功能号(0-5)!
return1;
四、程序运行结果及分析
T0时刻的资源分配表(各种资源的数量分别为:
10、5、7)
资源情况
进程
Max
ABC
Allocation
Need
Available
P0
753
010
743
332
P1
322
200
122
P2
902
302
600
P3
222
211
011
P4
433
002
431
运行结果
五、课程设计心得与体会
银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;
第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;
第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;
第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。
防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。
六.参考文献:
[1]《计算机操作系统》汤子瀛等:
西安电子科技大学出版社
[2]《高级语言c++程序设计》刘璟等:
高等教育出版社
出师表
两汉:
诸葛亮
先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。
然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。
诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
宫中府中,俱为一体;
陟罚臧否,不宜异同。
若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理;
不宜偏私,使内外异法也。
侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下:
愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰“能”,是以众议举宠为督:
愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
亲贤臣,远小人,此先汉所以兴隆也;
亲小人,远贤臣,此后汉所以倾颓也。
先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。
侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之、信之,则汉室之隆,可计日而待也
。
臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。
先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。
后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
先帝知臣谨慎,故临崩寄臣以大事也。
受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;
故五月渡泸,深入不毛。
今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。
此臣所以报先帝而忠陛下之职分也。
至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。
若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;
陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。
臣不胜受恩感激。
今当远离,临表涕零,不知所言。