操作系统实验银行家算法C语言实现

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

23#includestdio.h#includestdlib.h#includestring.h#definea10#defineb10//****银行家算法中的数据结构***********************intAvailable[a];//.............各资源可利用的数量intMax[b][b];//..................各进程对各类资源的最大需求数intAllocation[b][b];//.............各进程当前已分配的资源数量intNeed[b][b];//.................尚需多少资源//*************************************************intRequest[a];//.................申请多少资源intWork[a];//...................工作向量,表示系统可提供给进程继续运行所需的各类资源数量intFinish[b];//...................表示系统是否有足够的资源分配给进程,1为是//**********函数声明************************************voidinit();//..................创建进程,资源种类与分配等,初始化函数intbanker();//..........................银行家分配算法voidsafe();//...........................判断算法的安全性//**********************************************//******过程中定义的全局变量********************inti,j,x,y,l,counter=0;intp;//记录是哪个进程正在申请资源intq[b];//存储安全序列//*************************************************//*************************创建进程*************************voidinit()//初始化23{printf(输入当前进程量:\n);scanf(%d,&x);printf(输入资源的种类数目:\n);scanf(%d,&y);printf(***输入各种资源当前可用的数量***\n);for(i=0;iy;i++){printf(请输入资源%d的资源可利用量\n,i);scanf(%d,&Available[i]);Work[i]=Available[i];//初始化Work[i],它的初始值就是当前可用的资源数}printf(请输入每个进程申请到的资源\n);for(j=0;jx;j++){for(i=0;iy;i++){printf(请输入进程%d的申请到的资源%d:\n,j,i);scanf(%d,&Allocation[j][i]);}Finish[j]=0;//初始化Finish[j]}printf(请输入每个进程需要的最大的资源数目:\n);for(j=0;jx;j++){for(i=0;iy;i++){printf(请输入进程%d需要的最大的资源数目%d:\n,j,i);scanf(%d,&Max[j][i]);if(Max[j][i]=Allocation[j][i])//根据需求量=需要最大资源数目-已分配数目,计算需求量needNeed[j][i]=Max[j][i]-Allocation[j][i];elseNeed[j][i]=0;//资源充足,不需要再申请}}printf(初始化完成\n);}//安全性算法函数voidsafe(){23l=0;for(j=0;jy;j++){if(Finish[j]==0){//逐个查找Finish[j]==0的进程条件一counter=0;//记数器for(i=0;ix;i++){if(Work[i]=Need[j][i])counter=counter+1;//可用大于需求,记数}if(counter==x)//i进程的每类资源都符合Work[i]=Need[j][i]条件二{q[l]=j;//存储安全序列Finish[j]=1;//i进程标志为可分配for(i=0;ix;i++)Work[i]=Work[i]+Allocation[j][i];//释放资源l=l+1;//记数,现在有L个进程是安全的,当L=N时说明满足安全序列j=-1;//从第一个进程开始继续寻找满足条件一二的进程}}}}//*************************银行家算法***********************intbanker()//..........................银行家分配算法{printf(请输入请求资源的进程\n);scanf(%d,&p);printf(\n请输入此进程请求各种资源的个数\n);for(i=0;ix;i++){do{printf(进程%d申请资源%d的数量,p,i);scanf(%d,&Request[i]);if(Request[i]Need[p][i])//申请量不能超过需求量printf(申请量超过需求量出错;!!请重新输入!!\n);elseif(Request[i]Available[i]){printf(资源不充足,目前可用资源只有%d,进程要等待!!,Available[i]);Finish[p]=0;//该进程等待return0;}}while(Request[i]Need[p][i]||Request[i]Available[i]);23for(i=0;ix;i++){Available[i]=Available[i]-Request[i];Allocation[p][i]=Allocation[p][i]+Request[i];Need[p][i]=Need[p][i]-Request[i];Work[i]=Available[i];}//改变Avilable、Allocation、Need的值}//判断银行家算法的安全性if(lx){l=0;printf(试分配不成功,不与分配,恢复原状态!!);for(i=0;ix;i++){Available[i]=Available[i]+Request[i];Allocation[p][i]=Allocation[p][i]-Request[i];Need[p][i]=Need[p][i]+Request[i];Work[i]=Available[i];}for(j=0;jy;j++)Finish[j]=0;//进程置为未分配状态}else{l=0;printf(\n申请资源成功!!!\n);for(i=0;ix;i++){if(Need[p][i]==0);else{//有一种资源还没全部申请到,该进程还处于就绪态l=1;//判断标志break;}}if(l!=1){//进程可以执行,释放该进程的所有资源for(i=0;ix;i++){Available[i]=Available[i]+Allocation[p][i];Allocation[p][i]=0;}printf(有需求资源,执行后将释放其所有拥有资源!);23}l=0;//归零printf(安全序列为:\n);printf(进程%d,q[0]);//输出安全序列,考虑显示格式,先输出第一个Finish[0]=0;for(i=1;iy;i++){printf(进程%d,q[i]);Finish[i]=0;//重新将所有进程置为未分配状态}printf(\n\n\n);}return0;}voidmain(){printf(\n************************************************************\n);printf(\n银行家算法模拟\n);printf(\n************************************************************\n);init();//safe();//判断当前状态的安全性if(ly)printf(找不到安全序列,拒绝申请\n);else{intm;printf(当前序列是安全的,安全序列为:\n);printf(进程%d\n,q[0]);Finish[m]=0;for(m=1;mx;m++){printf(进程%d\n\n,q[m]);Finish[m]=0;}}banker();//调用银行家算法函数}2323

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功