操作系统实验报告之银行家算法和随机算法实现资源分配.docx
- 文档编号:7253870
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:22
- 大小:200.51KB
操作系统实验报告之银行家算法和随机算法实现资源分配.docx
《操作系统实验报告之银行家算法和随机算法实现资源分配.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告之银行家算法和随机算法实现资源分配.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统实验报告之银行家算法和随机算法实现资源分配
操作系统实验三:
银行家算法
时间:
2013-12-13
地点:
计算机实验机房2
实验人:
朱蓉蓉学号:
E01114336
本次实验主要针对银行家算法的实现和安全序列的检测。
银行家算法实验代码:
#include
#include
#include
#defineFalse0
#defineTrue1
usingnamespacestd;
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;//进程的最大数为
intN=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<<"系统不安全"< return-1; } } cout<<"系统是安全的! "< cout<<"分配的序列: "; for(i=0;i cout< if(i } cout< return0; } voidshare()//利用银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; cout<<"请输入要求分配的资源进程号(0-"< "; cin>>i;//输入须申请的资源号 cout<<"请输入进程"< "< for(j=0;j { cout< "; cin>>Request[j];//输入需要申请的资源 } for(j=0;j if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错 { cout<<"进程"< cout<<"分配不合理,不予分配! "< ch='n'; break; } else{ if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 {//出错 cout<<"进程"< cout<<"分配出错,不予分配! "< ch='n'; break; } } } if(ch=='y'){ changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } voidaddresources(){//添加资源 intn,flag; cout<<"请输入需要添加资源种类的数量: "; cin>>n; flag=N; N=N+n; for(inti=0;i cout<<"名称: "; cin>>name[flag]; cout<<"数量: "; cin>>Avaliable[flag++]; } showdata(); safe(); } voiddelresources(){//删除资源 charming; inti,flag=1; cout<<"请输入需要删除的资源名称: "; do{ cin>>ming; for(i=0;i if(ming==name[i]){ flag=0; break; } if(i==N) cout<<"该资源名称不存在,请重新输入: "; } while(flag); for(intj=i;j { name[j]=name[j+1]; Avaliable[j]=Avaliable[j+1]; } N=N-1; 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(); } voidaddprocess(){//添加作业 intflag=M; M=M+1; cout<<"请输入该作业的最大需求量[Max]"< for(inti=0;i cout< "; cin>>Max[flag][i]; Need[flag][i]=Max[flag][i]-Allocation[flag][i]; } showdata(); safe(); } intmain()//主函数 { inti,j,number,choice,m,n,flag; charming; cout<<"\t---------------------------------------------------"< cout<<"\t||||"< cout<<"\t||银行家算法的实现||"< cout<<"\t||E01114336||"< cout<<"\t||朱蓉蓉||"< cout<<"\t||||"< cout<<"\t||||"< cout<<"\t---------------------------------------------------"< cout<<"请首先输入系统可供资源种类的数量: "; cin>>n; N=n; for(i=0;i { cout<<"资源"< "; cin>>ming; name[i]=ming; cout<<"资源的数量: "; cin>>number; Avaliable[i]=number; } cout< cout<<"请输入作业的数量: "; cin>>m; M=m; cout<<"请输入各进程的最大需求量("< "< for(i=0;i for(j=0;j cin>>Max[i][j]; do{ flag=0; cout<<"请输入各进程已经申请的资源量("< "< 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"; } while(flag); showdata();//显示各种资源 safe();//用银行家算法判定系统是否安全 while(choice) { cout<<"\t-------------------银行家算法演示------------------"< cout<<"1: 增加资源"< cout<<"2: 删除资源"< cout<<"3: 修改资源"< cout<<"4: 分配资源"< cout<<"5: 增加作业"< cout<<"0: 离开"< cout<<"\t---------------------------------------------------"< cout<<"请选择功能号: "; cin>>choice; switch(choice) { case1: addresources();break; case2: delresources();break; case3: changeresources();break; case4: share();break; case5: addprocess();break; case0: choice=0;break; default: cout<<"请正确选择功能号(0-5)! "< } } return1; } 实验程序截图: 随机算法实现: #include #include #include #include usingnamespacestd; intr[3]={3,3,2};//系统拥有的资源 intr0=0,r1=0,r2=0;//记录申请资源 classpcb { public: intid; boolstate; intmax[3]; intalc[3]; intneed[3]; pcb() { } voidinit() { state=false; cout<<"请输入进程的id,各个资源总需求量和已占用资源"< cin>>id; cout<<"a,b,c三种资源的最大使用量"< cin>>max[0]>>max[1]>>max[2]; cout<<"a,b,c三种资源的已占有量"< cin>>alc[0]>>alc[1]>>alc[2]; } intrd(intn) { returnrand()%(n+1); } intrequest() { //Sleep(1000); r0=rd(max[0]-alc[0]); r1=rd(max[1]-alc[1]); r2=rd(max[2]-alc[2]); cout<<"进程"< if(r0>r[0]||r1>r[1]||r2>r[2]) { cout<<"没有那么多资源! ! ! "< return0; } if((r0==(max[0]-alc[0]))&&r1==(max[1]-alc[1])&&r2==(max[2]-alc[2])) { r[0]=r[0]+alc[0]; r[1]=r[1]+alc[1]; r[2]=r[2]+alc[2]; return1; } return2; } }; boolsafe(vector { intu=r[0]-r0,k=r[1]-r1,l=r[2]-r2; for(intj=i;j temp[j]=temp[j+1]; temp.pop_back(); intsize=temp.size();//记录下容器内还有多少个进程 //intrange[size];//记录下队列 intx=0;//计数器 while(! temp.empty()) { staticintj=0; if((temp[j].max[0]-temp[j].alc[0])<=u&&(temp[j].max[1]-temp[j].alc[1])<=k&& (temp[j].max[2]-temp[j].alc[2])<=l)//判断是否能运行完 { cout<<"运行"< u=u+temp[j].alc[0]; k=k+temp[j].alc[1]; l=l+temp[j].alc[2]; for(inte=j;e temp[e]=temp[e+1]; temp.pop_back(); if(j>=temp.size()) j=0; } else { j++; if(j>=temp.size()) j=0; } x++; if(x==(size*size)) { cout<<"没有安全队列,以上情况不成立"< cout< returnfalse; } } returntrue; } intmain() { srand(time(0)); pcbp[5]; vector for(inti=0;i<5;i++) { p[i].init(); vp.push_back(p[i]); } intx=0;//计算器 intc; cout<<"请选择分配资源方法: 1.银行家算法2.随机算法"< cin>>c; switch(c) { case1: while(! vp.empty()) { inta; staticinti=0; if((a=vp[i].request())! =0) { if(a==1) { cout<<"进程"< for(intj=i;j { vp[j]=vp[j+1]; } vp.pop_back(); if(i>=vp.size()) i=0; cout<<"a资源还剩"< cout< } else { if(safe(vp,i)) { cout<<"存在安全队列"< cout< vp[i].alc[0]=vp[i].alc[0]+r0; vp[i].alc[1]=vp[i].alc[1]+r1; vp[i].alc[2]=vp[i].alc[2]+r2; r[0]=r[0]-r0; r[1]=r[1]-r1; r[2]=r[2]-r2; cout<<"a资源还剩"< cout< } i++; if(i>=vp.size()) i=0; } } else i++; if(i>=vp.size()) i=0; x++; if(x>=200) { cout<<"初始化的表不安全"< return0; } } cout<<"进程已经全部结束"< break; case2: while(! vp.empty()) { inta2; staticinti2=0; if((a2=vp[i2].request())! =0) { if(a2==1) { cout<<"进程"< for(intj=i2;j { vp[j]=vp[j+1]; } vp.pop_back(); if(i2>=vp.size()) i2=0; cout<<"a资源还剩"< cout< } else { vp[i2].alc[0]=vp[i2].alc[0]+r0; vp[i2].alc[1]=vp[i2].alc[1]+r1; vp[i2].alc[2]=vp[i2].alc[2]+r2; r[0]=r[0]-r0; r[1]=r[1]-r1; r[2]=r[2]-r2; cout<<"a资源还剩"< cout< i2++; if(i2>=vp.size()) i2=0; } } else i2++; if(i2>=vp.size()) i2=0; x++; if(x>=200) { cout<<"产生死锁"< return0; } } cout<<"进程已经全部结束"< break; default: cout<<"选择错误"< break; } return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告 银行家 算法 随机 实现 资源 分配
![提示](https://static.bdocx.com/images/bang_tan.gif)