银行家算法C语言模拟程序 这个最简单的模拟程序,为了完成操作系统作业而做的。大家放心,绝对可以运行,呵呵! 有什么不完善的地方请提出!(在计数器的运用上比较乱,希望大家看的明白) (注:各位大哥大姐们,希望大家重视小弟我身为初学者不容易,到时别在其他网站到处乱添,这样小弟我会很伤心的!作者:luo卢丹) 源程序: - #include<stdio.h>
- #include<stdlib.h>
- #include<conio.h>
- int Available[10]; //可使用资源向量
- int Max[10][10]; //最大需求矩阵
- int Allocation[10][10]={0}; //分配矩阵
- int Need[10][10]={0}; //需求矩阵
- int Work[10]; //工作向量
- int Finish[10]; //状态标志
- int Request[10][10]; //进程申请资源向量
- int Pause[10];
- int List[10];
- int i,j;
- int n; //系统资源总数
- int m; //总的进程数
- int a; //当前申请的进程号
- int l,e; //计数器
- int b=0,c=0,f=0,g; //计数器
- void mainenter()//主要的输入部分代码
- {
- printf("请输入系统总共有的资源数:");
- scanf("%d",&n);
- printf("请输入总共有多少个进程:");
- scanf("%d",&m);
- for(i=1;i<=n;i++)
- {
- printf("第%d类资源有的资源实例:",i);
- scanf("%d",&Available[i]);
- }
- for(i=1;i<=m;i++)
- {
- for(j=1;j<=n;j++)
- {
- printf("进程P[%d]对第%d类资源的最大需求量:",i,j);
- scanf("%d",&Max[i][j]);
- Need[i][j]=Max[i][j];
- }
- }
- }
- void mainrequest() //进程提出新申请的代码部分
- {
- printf("请输入申请资源的进程:");
- scanf("%d",&a);
- for(i=1;i<=n;i++)
- {
- printf("请输入进程P[%d]对%d类资源的申请量:",a,i);
- scanf("%d",&Request[a][i]);
- if(Request[a][i]>Need[a][i])
- printf("n出错!进程申请的资源数多于它自己申报的最大量n");
- if(Request[a][i]>Available[i])
- printf("nP[%d]必须等待n",a);
- //以下是试探性分配
- Available[i]=Available[i]-Request[a][i];
- Allocation[a][i]=Allocation[a][i]+Request[a][i];
- Need[a][i]=Need[a][i]-Request[a][i];
- Work[i]=Available[i];
- }
- for(i=1;i<=m;i++)
- {
- Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面
- //安全性检查时修改到Available[i]而代替的一维数组
- Finish[i]=false;
- }
- for(g=1;g<=m;g++)
- {
- for(i=1;i<=m;i++)
- {
- b=0; //计数器初始化
- for(j=1;j<=n;j++)
- {
- if(Need[i][j]<=Pause[j])
- {
- b=b+1;
- }
- if(Finish[i]==false&&b==n)
- {
- for(l=1;l<=n;l++)
- {
- Pause[l]=Pause[l]+Allocation[i][l];
- }
- Finish[i]=true;
- printf("$ %d ",i);//依次输出进程安全序列之一中每个元素
- }
- }
- }
- }
- printf("n");
- for(i=1;i<=m;i++)
- {
- if(Finish[i]==true) f=f+1;//统计Finish[i]==true的个数
- }
- if (f==m)
- {
- printf("safe static");
- f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备
- }
- else
- {
- printf(" unsafe static ");//以下代码为当系统被判定为不安全状态时
- //返回提出申请前的状态
- for(i=1;i<=n;i++)
- {
- Available[i]=Available[i]+Request[a][i];
- Allocation[a][i]=Allocation[a][i]-Request[a][i];
- Need[a][i]=Need[a][i]+Request[a][i];
- }
- }
- }
- void mainprint()
- {
- printf("当前的系统状态n");
- printf(" 目前占有量 最大需求量 尚需要量 n进程");
- for(i=1;i<=n;i++)
- for(j=1;j<=n;j++)
- {
- printf(" %d类",j);
- }
- for(i=1;i<=m;i++)
- {
- printf("nP[%d]",i);
- for(j=1;j<=n;j++)
- {
- printf(" %d ",Allocation[i][j]);
- }
- for(j=1;j<=n;j++)
- {
- printf(" %d ",Max[i][j]);
- }
- for(j=1;j<=n;j++)
- {
- printf(" %d ",Need[i][j]);
- }
- }
- printf("nn系统剩余资源量: ");
- for(i=1;i<=n;i++)
- {
- printf(" %d ",Available[i]);
- }
- printf("n");
- }
- void main()
- { int k,h=1;
- while(h)
- { system("cls");
- {
- printf("nn ★ 欢迎使用本程序 ★n");
- printf("nn 1:输入系统的资源数、申请进程数、每个类资源的实例数");
- printf("n 2:…………………………………… 输入进程的资源申请");
- printf("n 3:…………………………………………… 输出系统状态");
- printf("n 4:………………………………………………… 退出程序");
- printf("nn please choose ");
- scanf("%d",&k);
- }
- switch(k)
- {
- case 1:mainenter(); break;
- case 2:mainrequest(); break;
- case 3:mainprint(); break;
- case 4:h=0; break;
- }
- printf("n");
- system("pause");
- }
- system("cls");
- printf("nn 谢谢使用 n");
- printf("nn See you next time!!!nnn");
- }
复制代码
以下是程序运行截图:
以此输入每个进程对各类资源的需求量; 所有进程输入完成后系统的当前状态 进程P[2]再次提出申请,系统为安全状态;
对进程P[2]分配后的系统状态;
进程P[1]再次提出资源申请,分配后系统为不安全状态,则不提供资源分配;
由于P[1]分配后系统状态不安全,则退回到前一状态;
|