操作系统银行家算法实验报告_第1页
操作系统银行家算法实验报告_第2页
操作系统银行家算法实验报告_第3页
操作系统银行家算法实验报告_第4页
操作系统银行家算法实验报告_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四死锁实验目的当系统的总资源数m小于或等于所有进程对对资源的最大需求时,就可能产生死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过本实验使学生能进一步理解死锁的概念,并能选择一个算法来避免死锁。二、实验题目系统中有m个同类资源被n个进程共享,每个进程对资源的最大需求数分别为S1,S2,…,Sn,且Max(Si)<=m,(i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。三、数据结构主要数据结构:Structaa{voidPrint();//用于打印输出表格的函数voidInput();//用于输入的函数voidtryfenpei(inti);//试分配函数voidrefenpei(inti);//恢复数据函数voidchecksafe(ints);//安全检测函数};四、银行家算法的流程图五、源代码#include<iostream.h>#include"stdio.h"constunsignedshortc=3;//资源类数constunsignedshortt=5;//进程数voidPrint();//用于打印输出表格的函数voidInput();//用于输入的函数voidtryfenpei(inti);//试分配函数voidrefenpei(inti);//恢复数据函数voidchecksafe(ints);//安全检测函数//定义初始化数组intAvailable[c],Max[t][c],Allocation[t][c],Need[t][c],Request[c];intin;//用户选择的进程号intmain(intargc,char*argv[]){inti;charch='Y';cout<<"初始化数据如下:"<<endl;Input();//输入相关数据函数Print();//打印输出相关数据表函数cout<<"初始化完成!"<<endl<<endl;do{if(ch=='Y'||ch=='y'){cout<<"欢迎进入实验!"<<endl;cout<<"请输入发起请求的进程号(0-4):";while(cin>>in){if(in<0||in>4){cout<<"不存在该进程,请重新输入"<<endl;}elsebreak;};cout<<"您输入的是"<<"p["<<in<<"]"<<"进程"<<endl;cout<<"该进程需求量为:";for(i=0;i<c;i++)cout<<Need[in][i]<<"";cout<<endl;cout<<"请输入请求资源的数目:";//输入格式为Xfor(i=0;i<c;i++){while(cin>>Request[i]){if(Request[i]<0)cout<<"错误!输入的数字无效."<<endl;elseif(Request[i]>Need[in][i])cout<<"错误!超出进程需求量"<<endl<<endl;if(Request[i]>Available[i])cout<<"错误!系统还没有足够的可用资源量满足进程需要"<<endl<<endl;elsebreak;}}cout<<"输入成功,您输入的是:"<<Request[0]<<""<<Request[1]<<""<<Request[2]<<endl;cout<<"开始执行银行家算法,下面进行试分配"<<endl;tryfenpei(in);//分配函数cout<<"试分配完成!"<<endl;cout<<"进入安全性检测..."<<endl;checksafe(in);//安全性检测函数cout<<"需要继续实验吗?(y-继续n终止)";}elseif(ch=='N'||ch=='n'){cout<<"感谢您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;break;}elsecout<<"输入无效!请重新输入."<<endl;}while(cin>>ch);return0;}voidPrint(){inti,j;cout<<"进程个数:"<<t<<"资源个数:"<<c<<endl;cout<<endl;cout<<"|*****|***********|***********|**********|***********|"<<endl;cout<<"|****|最大需求矩阵|已分配矩阵-|-需求矩阵-可用资源向量|"<<endl;cout<<"|资源|Max|Allocation|Need|Available|"<<endl;cout<<"||ABC|ABC|ABC|ABC|"<<endl;cout<<"|进程|||||"<<endl;cout<<"|*****|**********|************|**********|***********|"<<endl;for(i=0;i<5;i++){cout<<"|p"<<i<<"|";for(j=0;j<3;j++){cout<<Max[i][j]<<"";}cout<<"|";for(j=0;j<3;j++){cout<<""<<Allocation[i][j];}cout<<"|";for(j=0;j<3;j++){cout<<""<<Need[i][j];}cout<<"|";if(i==0){for(j=0;j<3;j++){cout<<""<<Available[j];}cout<<"|";}if(i>0){cout<<"|";}cout<<endl;}cout<<"|*****|**********|************|**********|***********|"<<endl;}//输入函数voidInput(){for(intj=0;j<c;j++){cout<<"请输入Available["<<j<<"]:";while(cin>>Available[j]){if(Available[j]<0)cout<<"输入数字无效,请重新输入"<<endl;elsebreak;};}for(intk=1;k<4;k++)//其他三个属性和一次打印输出表{for(intl=0;l<t;l++)//五个进程循环输入{for(intm=0;m<c;m++)//三个类资源ABC循环输入{if(k==1&&m<t){cout<<"请输入Max["<<l<<"]["<<m<<"]:";while(cin>>Max[l][m]){if(Max[l][m]<0)cout<<"输入数字无效,请重新输入"<<endl;elsebreak;};}if(k==2&&m<t){cout<<"请输入Allocation["<<l<<"]["<<m<<"]:";while(cin>>Allocation[l][m])if(Allocation[l][m]<0)cout<<"输入数字无效,请重新输入"<<endl;elsebreak;}if(k==3&&m<t)Need[l][m]=Max[l][m]-Allocation[l][m];}}}}//输入函数结束//试分配函数voidtryfenpei(inti){for(intf=0;f<c;f++){Available[f]=Available[f]-Request[f];Allocation[i][f]=Allocation[i][f]+Request[f];Need[i][f]=Need[i][f]-Request[f];}}//试分配函数结束//恢复数据函数voidrefenpei(inti){for(intf=0;f<c;f++){Available[f]=Available[f]+Request[f];Allocation[i][f]=Allocation[i][f]-Request[f];Need[i][f]=Need[i][f]+Request[f];}}//恢复数据函数结束//安全检测函数voidchecksafe(ints){intWork,flag,temp[t],i,j,l=0,k=0;boolFinish[t];for(i=0;i<t;i++)Finish[i]=false;for(j=0;j<3;j++){Work=Available[j];//cout<<"Work="<<Work<<endl;for(i=0;i<t;i++){if(Finish[i]==true)l++;//用l是否达到5来判断这条进程A类资源或者B类资源是否通过安全检测,C类资源没有经过这里}if(l==5)//一共有三类资源ABC,一条进程下面的安全性检测只检测了A类。如果A类通过了,那么还要判断B类,C类。否则不用{for(i=0;i<t;i++)Finish[l]=false;//A类通过了,就把B类的Finish重置为false,C类类推}i=s;//s传递进来赋给i,s是用户输入的进程号(有主函数里的in传递进来)while(i<t){if(Finish[i]==false&&Need[i][j]<=Work){Work=Work+Allocation[i][j];Finish[i]=true;temp[k]=i;//cout<<"temp="<<temp[k]<<endl;k++;i=(i+1)%t;//从用户选择的进程开始对每个进程都要检测}elsei=(i++)%t;}}for(i=0;i<t;i++){if(Finish[i]==false){flag=1;//标记}}if(flag==1){cout<<"系统不安全!本次资源申请不成功!"<<endl;cout<<"正在恢复原来的数据"<<endl; refenpei(in);cout<<"恢复数据成功!正在打印输出"<<endl;Print();}else{cout<<"找到一个安全序列:";for(i=0;i<t;i++)cout<<"P"<<temp[i]<<"--->"; cout<<endl<<"已通过安全性测试!"<<endl;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论