银行家算法.docx
- 文档编号:6856517
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:12
- 大小:75.46KB
银行家算法.docx
《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(12页珍藏版)》请在冰豆网上搜索。
银行家算法
实验报告
课程名称
操作系统
题目
实验2:
银行家算法
姓名
实验地点
实验楼B软件实习基地
学号
1.实验目的
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
2.实验要求
1.要求以个人为单位完成全部实验题目,并在下课前五分钟将本次实验课完成的内容打包发送至指定邮箱;
2.前十名完成实验的同学在教师检查后可以获得一次实验加分;
3.实验课进行过程中不得进行浏览网页、玩游戏等与课程无关内容,违法规定的应给予课程判定不及格的处分;
4.实验课进行过程中应严格遵守实验室相关规定,按照老师的要求完成相关设计任务。
3.实验内容
1.设计进程对各类资源最大申请表示及初值确定。
2.设定系统提供资源初始状况。
3.设定每次某个进程对各类资源的申请表示。
4.编制程序,依据银行家算法,决定其申请是否得到满足。
4.数据结构与算法设计
1.数据结构
程序使用的全局变量:
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
2.算法设计
⑴算法的设计思路
先对用户提出的请求进行合法性检查,即检查请求的是否大于需要的,是否大于可利用的。
若请求合法,则进行试分配。
最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
⑵算法设计流程图
创建资源并显示函数showdata()开始
输入资源种类数
创建资源并显示函数showdata(),
创建成功
5.实验总结与问题分析
此次实验主要就是了解银行家算法的实现过程,了解它是怎样分配资源,从而达到避免死锁的。
由理论和实践可知,银行家算法就是一个分配资源的过程,使分配的序列不会产生死锁。
此算法的中心思想是:
按该法分配资源时,每次分配资源后总存在着一个进程,如果让它单独运行下去,必然可以获得它所需要的全部资源,也就是说,它能结束,而它结束后可以归还这类资源以满足其他申请者的需要,当所有进程都得到资源分配,达到满足时,则就产生了一个安全序列,从而避免了死锁的发生。
通过这次实验让我学会了很多以前所不会的知识,并且真正的理解了银行家的算法过程,同时也使我对课本的上知识进行了进一步的巩固和加深以及对C语言的学习。
在这实验当中也遇到很多问题,如银行家算法安全判断问题,还有一些其他问题等等,但这些都在老师和同学的指导下已完成,在此感谢老师和同学对我的指导和帮助。
实验
成绩
指导
教师
源程序:
#include
#include
#include
#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()
{
inti,j;
cout<<"系统目前可用的资源[Avaliable]:
"< for(i=0;i cout< cout< for(j=0;j cout< cout< cout<<"MaxAllocationNeed"< cout<<"进程名"; for(j=0;j<3;j++) { for(i=0;i cout< cout<<""; } cout< for(i=0;i { cout<<""< for(j=0;j cout< cout<<""; for(j=0;j cout< cout<<""; for(j=0;j cout< cout< } } //进行资源分配 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}; intj; intflag=0; Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;i { apply=0; for(j=0;j { if(Finish[i]==False&&Need[i][j]<=Work[j]) { apply++; if(apply==N) { for(m=0;m Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i; i=-1; k++; flag++; } } } } for(i=0;i { if(Finish[i]==False) { cout<<"\n系统不安全,分配不成功! ! ! "< return-1; } } cout<<"\n系统是安全的,分配成功! ! ! "< cout<<"\n成功分配的序列: "; for(i=0;i {//输出运行进程数组 cout< if(i } cout< return0; } //利用银行家算法对申请资源对进行判定 voidshare() { charch; inti=0,j=0; ch='y'; cout<<"\n请输入要求分配的资源进程号(0-"< "; cin>>i;//输入须申请的资源号 cout<<"\n请输入进程"< "< for(j=0;j { cout< "; cin>>Request[j];//输入需要申请的资源 } for(j=0;j { if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错 { cout<<"\n进程"< cout<<"\n分配不合理,不予分配! "< ch='n'; break; } else { if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 {//出错 cout<<"进程"< cout<<"分配出错,不予分配! "< ch='n'; break; } } } if(ch=='y') { changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } //修改资源函数 voidchangeresources() { cout<<"系统目前可用的资源[Avaliable]: "< for(inti=0;i cout< "< cout<<"输入系统可用资源[Avaliable]: "< cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<"经修改后的系统可用资源为"< for(intk=0;k cout< "< showdata(); safe(); } intmain()//主函数 { inti,j,number,choice,m,n,flag; charming; cout<<"************************银行家算法的设计与实现**********************"< cout<<"\n请首先输入系统可供资源种类的数量: "; cin>>n; N=n; for(i=0;i { cout<<"\n资源"< "; cin>>ming; name[i]=ming; cout<<"\n资源的数量: "; cin>>number; Avaliable[i]=number; } cout< cout<<"请输入进程的数量: "; cin>>m; M=m; cout<<"\n请输入各进程的最大需求量("< "< for(i=0;i for(j=0;j cin>>Max[i][j]; do{ flag=0; cout<<"\n请输入各进程已经申请的资源量("< "< for(i=0;i for(j=0;j { cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag) cout<<"\n申请的资源大于最大需求量,请重新输入! \n"; } while(flag); showdata();//显示各种资源 safe();//用银行家算法判定系统是否安全 while(choice) { cout<<"********************银行家算法演示*******************"< cout<<"1: 修改资源"< cout<<"2: 分配资源"< cout<<"0: 离开"< cout<<"****************************************************"< cout<<"\n请选择功能号: "; cin>>choice; switch(choice) { case1: changeresources(); break; case2: share(); break; case0: choice=0; break; default: cout<<"\n请正确选择功能号(0-2)! ! ! "< break; } } return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法