当前位置:文档之家› 大作业_银行家算法课程设计报告

大作业_银行家算法课程设计报告

《操作系统》课程设计报告设计题目:银行家算法的实现:梅济民学号: 2012015014 同组人:宇昊学号: 2012012962班级: 2012级信息与计算科学完成日期: 2015年 11 月 12 日银行家算法分析、设计与实现一、理论描述银行家算法要求每个进程的最大资源需求,其基本思想是:始终保持系统处于安全状态,当设计进程提出资源请求时,系统先进行预分配,再判断系统分配后是否仍然处于安全状态。

如果仍然处于安全状态,就进行实际分配;如果处于不安全状态,则拒绝该进程的资源请求。

二、算法描述及数据结构模型#define False 0#define True 1int Max[100][100]={0};//各进程所需各类资源的最大需求int Avaliable[100]={0};//系统可用资源char name[100]={0};//资源的名称int Allocation[100][100]={0};//系统已分配资源int Need[100][100]={0};//还需要资源int Request[100]={0};//请求资源向量int temp[100]={0};//存放安全序列int Work[100]={0};//存放系统可提供资源int M=100;//作业的最大数为100int N=100;//资源的最大数为10三、源代码void showdata()//显示资源矩阵{int i,j;printf("系统目前可用的资源[Avaliable]:\n");for(i=0;i<N;i++)printf("%c ",name[i]);printf("\n");for (j=0;j<N;j++)printf("%d ",Avaliable[j]);//输出分配资源printf("\n");printf(" Max Allocation Need \n"); printf("进程名 ");for(j=0;j<3;j++){for(i=0;i<N;i++)printf("%c ",name[i]);printf(" ");}printf("\n");for(i=0;i<M;i++){printf(" %d ",i);for(j=0;j<N;j++)printf("%d ",Max[i][j]);printf(" ");for(j=0;j<N;j++)printf("%d ",Allocation[i][j]);printf(" ");for(j=0;j<N;j++)printf("%d ",Need[i][j]);printf("\n");}}int changdata(int i)//进行资源分配{int j;for (j=0;j<M;j++) {Avaliable[j]=Avaliable[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j];}return 1;}int safe()//安全性算法{int i,k=0,m,apply,Finish[100]={0};int j;int flag=0;Work[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2];for(i=0;i<M;i++){apply=0;for(j=0;j<N;j++){if (Finish[i]==False&&Need[i][j]<=Work[j]){ apply++;if(apply==N){for(m=0;m<N;m++)Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True;temp[k]=i;i=-1;k++;flag++;}}}}for(i=0;i<M;i++){if(Finish[i]==False){printf("系统不安全\n");//不成功系统不安全return -1;}}printf("系统是安全的!\n");//如果安全,输出成功 printf("分配的序列:");for(i=0;i<M;i++){//输出运行进程数组printf("%d",temp[i]);if(i<M-1) printf("->");}printf("\n");return 0;}void share()//利用银行家算法对申请资源对进行判定{char ch;int i=0,j=0;ch='y';printf("请输入要求分配的资源进程号(0-%d):",M-1);scanf("%d",&i);//输入须申请的资源号printf("请输入进程 %d 申请的资源:\n",i);for(j=0;j<N;j++){printf("%c:",name[j]);scanf("%d",&Request[j]);//输入需要申请的资源}for (j=0;j<N;j++){if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错{printf("进程 %d申请的资源大于它需要的资源, 分配不合理,不予分配!\n",i);ch='n';break;}else {if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则出错{printf("进程%d申请的资源大于系统现在可利用的资源\n",i);printf(" 分配出错,不予分配!\n");ch='n';break;}}}if(ch=='y') {changdata(i);//根据进程需求量变换资源showdata();//根据进程需求量显示变换后的资源safe();//根据进程需求量进行银行家算法判断}}int main()//主函数{int i,j,q,choice,m,n,flag;char ming;printf("请首先输入系统可供资源种类的数量:");scanf("%d",&n);N=n;for(i=0;i<n;i++){printf("资源%d的名称:",i+1);scanf("%s",&ming);name[i]=ming;printf("资源%d的数量:",i+1);scanf("%d",&q);Avaliable[i]=q;}// printf("\n");printf("请输入作业的数量:");scanf("%d",&m);M=m;printf("请输入各进程的最大需求量%d*%d矩阵[Max]:\n",m,n);for(i=0;i<m;i++){for(j=0;j<n;j++)scanf("%d",&Max[i][j]);//printf("\n");}do{flag=0;printf("请输入各进程已经申请的资源量(%d*%d矩阵)[Allocation]:\n",m,n);for(i=0;i<m;i++)for(j=0;j<n;j++){scanf("%d",&Allocation[i][j]);if(Allocation[i][j]>Max[i][j]) flag=1;Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag)printf("申请的资源大于最大需求量,请重新输入!\n");}while(flag);showdata();//显示各种资源safe();//用银行家算法判定系统是否安全while(choice){printf("\n");printf(" 0:离开 \n");printf(" 1:分配资源 \n");printf("请选择功能号:");scanf("%d",&choice);switch(choice){case 1: share();break;case 0: break;default: printf("请正确选择功能号(0-1)!\n");break;}}return 1;四、程序运行结果及分析时刻的资源分配表(各种资源的数量分别为:10、5、7) T运行结果五、课程设计心得与体会通过这次实验,我了解了银行家算法的原理,在编写和调试程序过程中,我的算法和编程能力提高了很多六.参考文献:《计算机操作系统》第四版,《C程序设计教程》谭浩强。

相关主题