银行家算法演示【原创】
-
-
-
-
-
-
-
-
-
-
- #include<stdio.h>
- #define RN 3//资源的数目为3
- #define PN 5//进程数目为5
-
-
-
- void Init();
- int Banker(int i,int Requist[]);
- bool Security(int s[],int t[][RN],int p[][RN]);
-
- void main()
- {
-
- int Available[RN]={3,3,2};
- int Max[PN][RN]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
-
- int Allocation[PN][RN]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
-
- int Need[PN][RN]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
- int P1[]={1,0,2};
- int P4[]={3,3,0};
- int P0[]={0,1,0};
- int i=0;
- bool flag1;
-
- Init();
-
- flag1=Security(Available,Need,Allocation);
- if(flag1)
- {
- printf("/n");
- printf("当前系统处于安全状态!/n");
- }
- else
- {
- printf("/n");
- printf("当前系统处于不安全状态!/n");
- }
-
- i=1;
- Banker(i,P1);
- printf("/n");
-
-
-
-
-
-
-
-
- }
-
-
- void Init()
- {
- int i,j;
-
- int Available[RN]={3,3,2};
- int Max[PN][RN]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
-
- int Allocation[PN][RN]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
-
- int Need[PN][RN]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
- printf("T0时刻的资源分配图如下:/n");
- printf("各个资源最大需求矩阵如下:/n");
- printf(" A B C/n");
- for(i=0;i<PN;i++)
- {
- printf("p%d:",i);
- for(j=0;j<RN;j++)
- printf("%d ",Max[i][j]);
- printf("/n");
- }
- printf("各个资源分配矩阵如下:/n");
- printf(" A B C/n");
- for(i=0;i<PN;i++)
- {
- printf("p%d:",i);
- for(j=0;j<RN;j++)
- printf("%d ",Allocation[i][j]);
- printf("/n");
- }
- printf("各个资源需求矩阵如下:/n");
- printf(" A B C/n");
- for(i=0;i<PN;i++)
- {
- printf("p%d:",i);
- for(j=0;j<RN;j++)
- printf("%d ",Need[i][j]);
- printf("/n");
- }
- printf("可利用资源向量如下:/n");
- printf(" A B C/n");
- printf(" ");
- for(i=0;i<RN;i++)
- {
- printf("%d ",Available[i]);
- }
- printf("/n");
- }
-
-
- int Banker(int i,int p[])
- {
- int Available[RN]={3,3,2};
- int Allocation[PN][RN]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
-
- int Need[PN][RN]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
- int Requist[RN];
- for(int m=0;m<RN;m++)
- {
- Requist[m]=p[m];
- }
- int j;
- bool flag1=1;
- bool flag2=1;
- bool flag3=1;
- for(j=0;j<RN;j++)
- {
- if(Requist[j]>Need[i][j])
- {
- flag1=0;
- printf("进程%d需要的资源已超过它宣布的最大值!",i);
- break;
- }
- }
- if(flag1)
- {
- for(j=0;j<RN;j++)
- {
- if(Requist[j]>Available[j])
- {
- flag2=0;
- printf("没有足够的资源,进程%d必须等待。",i);
- break;
- }
- }
- if(flag2)
- {
- for(j=0;j<RN;j++)
- {
- Available[j]=Available[j]-Requist[j];
- Allocation[i][j]=Allocation[i][j]+Requist[j];
- Need[i][j]=Need[i][j]-Requist[j];
- }
- flag3=Security(Available,Need,Allocation);
- if(flag3)
- {
- return 1;
- }
- else
- {
-
- for(j=0;j<RN;j++)
- {
- Available[j]=Available[j]+Requist[j];
- Allocation[i][j]=Allocation[i][j]-Requist[j];
- Need[i][j]=Need[i][j]+Requist[j];
- }
- }
- }
- }
- return 0;
- }
-
-
- bool Security(int Available[],int Need[][RN],int Allocation[][RN])
- {
- int bian;
- bool flag1,flag2;
- flag1=true;
- int m,n;
- int Work[RN];
- for(m=0;m<RN;m++)
- {
- Work[m]=Available[m];
- }
- bool Finish[PN]={0,0,0,0,0};
- while(flag1)
- {
- bian=0;
- for(m=0;m<PN;m++)
- {
- flag2=true;
- if(!Finish[m])
- {
- for(n=0;n<RN;n++)
- {
- if(Need[m][n]>Work[n])
- {
- flag2=0;
- break;
- }
- }
- if(flag2)
- {
- bian=1;
- for(n=0;n<RN;n++)
- {
- Work[n]=Work[n]+Allocation[m][n];
- }
- printf("p%d/t",m);
- Finish[m]=true;
- }
- }
- }
- if(bian==0)
- {
- flag1=0;
- }
- }
- return 1;
- }
原文地址:https://www.cnblogs.com/javaadu/p/11742813.html