银行家算法 c++ 简要 演示
T0时刻系统状态表:最大资源需求量
已分配资源数量
A B C
A B C
P1
5 5 9
2 1 2
P2
5 3 6
4 0 2
P3
4 0 11
4 0 5
P4
4 2 5
2 0 4
P5
4 2 4
3 1 4
资源总量:A 17 B 5 C 20
安全性检测的原则是:
1 进程申请资源可分布申请,但总量不应超过其最大需求量
2 每次申请的资源量必须小于系统可供使用的资源量
3 分配完成后,系统是安全的,即仍存在一个序列,可以运行完当前所有进程,这是关键
笔者写了一个程序可以完整演示整个测试流程,看一下运行结果即可理解银行家算法,代码在vc6下测试完美通过。
附上完整代码与注释:
[cpp]
#include<iostream>
using namespace std;
#define M 5//进程数
#define N 3//资源数
int R[N]={17,5,20};//资源总数
int Maxall[N]={0};//被占用的资源数
int V[N]={0};//可用资源总数
int Max[M][N]={{5,5,9},{5,3,6},{4,0,11},{4,2,5},{4,2,4}};//各进程最大需求量
int Alloc[M][N]={{2,1,2},{4,0,2},{4,0,5},{2,0,4},{3,1,4}};//各进程已经分配的资源量
int Need[M][N]={0};//各进程还需要的资源量
int Appli[M][N]={0};//一次为某个进程申请的资源量
int i,j,n;//程序中用
int main()
{
void init();
void show();
int applicate(int,int,int,int);
void update(int,int,int,int);
void release(int,int,int,int);
int safecheck();
init();
show();
safecheck();//这里安排显示了按安全序列执行完毕前后的系统状态
show();
return 0;
}
void init()//初始化状态
{
/* cout<<"请依次输入各进程对资源最大需求量:"<<endl;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
cout<<i<<"进程"<<j<<"资源:"<<endl;
cin>>Max[i][j];
}
cout<<"请依次输入各进程已分配资源:"<<endl;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
cout<<i<<"进程"<<j<<"资源:"<<endl;
cin>>Alloc[i][j];
}
cout<<"请依次输入各资源总数:"<<endl;
for(j=0;j<N;j++)
{
cout<<j<<"资源:"<<endl;
cin>>R[j];
}
*/
//本可以自行输入的,此处为避免大量输入,在程序中初始化
for(i=0;i<M;i++)
for(j=0;j<N;j++)
Need[i][j]=Max[i][j]-Alloc[i][j];
for(j=0;j<N;j++)
for(i=0;i<M;i++)
Maxall[j]+=Alloc[i][j];
for(j=0;j<N;j++)
V[j]=R[j]-Maxall[j];
}
void show()//显示系统状态
{
cout<<"Max:"<<endl;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
cout<<Max[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"Alloc:"<<endl;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
cout<<Alloc[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"Need:"<<endl;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"系统总资源:"<<endl;
for(n=0;n<N;n++)
cout<<R[n]<<" ";
cout<<endl;
cout<<"系统剩下的资源"<<endl;
for(j=0;j<N;j++)
{
cout<<V[j]<<" ";
}
cout<<endl;
}
int applicate(int i,int r1,int r2,int r3)//资源申请
{
Appli[i][0]=r1;
Appli[i][1]=r2;
Appli[i][2]=r3;
if((Appli[i][0]<=Need[i][0] && Appli[i][1]<=Need[i][1] && Appli[i][2]<=Need[i][2]) && (Appli[i][0]<=V[0] && Appli[i][1]<=V[1] && Appli[i][2]<=V[2]))
{
// cout<<"申请成功,但还未进行安全性检测..."<<endl;
return 1;
}
else
{
// cout<<"申请失败..."<<endl;
return 0;
}
}
void update(int i,int r1,int r2,int r3)//
补充:软件开发 , C++ ,