📄 银行家.cpp
字号:
#include<iostream.h>
#include<math.h>
#define M 3
#define N 5
#define A 15
int Available[M]={10,5,7};//可利用的资源向量
int Need[N][M]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3};//n个进程对m类资源最大需求量
int Allocation[N][M];//当前每类资源已分配给每个进程的资源数
/*********************初始化进程需求向量*******************/
int Request[M];
void InitiRequest()
{
for( int i=0;i<M;i++){ cout<<"资源"<<i+1<<":";cin>>Request[i];}
}
/***************一维显示****************************/
void Show1(int m,int p[A])
{
for( int i=0;i<m;i++)
{
cout<<"资源"<<i+1<<":";
cout<<p[i]<<" ";
}
cout<<endl;
}
/***************二维显示****************************/
void Show2(int p[N][M])
{
cout<<" ";
for( int j=0;j<M;j++)cout<<" 资源"<<j+1;
cout<<endl;
for( int i=0;i<N;i++)
{
cout<<"进程P"<<i<<": ";
for( int j=0;j<M;j++)cout<<p[i][j]<<" ";
cout<<endl;
}
}
/********************数组复制函数***************/
int *Copy(int *p,int *t)
{
while( *p++=*t++);
return(p-1);
}
/****************两数组加减法运算****************/
void AddOrSub(int m,int p[A],bool k,int t[A])
{
if(k)
for(int i=0;i<m;i++)p[i]-=t[i];//K=1表示减法
else for(int i=0;i<m;i++)p[i]+=t[i];//k=0表示加
}
/*************两数组比较*******************/
int Compare(int m,int p[A],int t[A])
{ int k=0;
for(int i=0;i<m;i++)
{
if(p[i]<=t[i])k--;
else k++;
}
if (abs(k)==m) return k/m;
else return 0;
}
bool Cmp(bool p[N])
{
for( int i=0;i<N;i++)if(p[i]==0)return 0;
return 1;
}
/*************安全性检测程序******************/
bool SaveCheck(int k)
{
int c=0,Work,t[N]; bool Finish[N]={0,0,0,0,0};
for(int j=0;j<M;j++)
{
Work=Available[j];
int i=k;
while(i<N)
{
if ( Finish[i]==0&&Need[i][j]<=Work)
{
Work+=Allocation[i][j];
Finish[i]=1;
t[c]=i;
c++;
i=0;
}
else i++;
}
}
if(Cmp(Finish))
{
cout<<"恭喜!:系统处于安全状态."<<endl;
cout<<"本次安全序列:";
for(j=0;j<N;j++)cout<<"进程"<<t[j]<<"->";
cout<<endl<<endl;;
return 1;
}
cout<<"警告!:系统处于不安全状态."<<endl;
return 0;
}
/***************数据的改变试分配*****************/
void Changedata(int k)
{
AddOrSub(M,Available,1,Request);
AddOrSub(M,Allocation[k],0,Request);
AddOrSub(M,Need[k],1,Request);
}
/******************数据的恢复******************/
void Recoverdata(int k)
{
AddOrSub(M,Available,0,Request);
AddOrSub(M,Allocation[k],1,Request);
AddOrSub(M,Need[k],0,Request);
}
/***************银行家算法*****************/
void Banker(int k)
{
if( Compare(M,Request,Need[k])==-1)
{
if(Compare(M,Request,Available)==-1)
{
Changedata(k);
if(SaveCheck(k))cout<<"正式将资源分配给进程"<<k<<endl;
else
{
Recoverdata(k);
cout<<"SORRY! 本次资源申请不成功!"<<endl;
cout<<"让进程"<<k<<"等待!"<<endl;
}
}
else
{
cout<<"SORRY! 本次资源申请不成功!"<<endl;
cout<<"让进程"<<k<<"等待!"<<endl;
}
}
else cout<<" 错误,资源需求已过其宣布的最大值!"<<endl;
}
/***********显示数据的函数*********************/
void Showdata()
{
cout<<"________________________________________________"<<endl;
cout<<N<<"个进程对"<<M<<"类资源需求情况:"<<endl;
Show2(Need);
cout<<"________________________________________________"<<endl;
cout<<"可利用的资源情况:"<<endl;
Show1(M,Available);
cout<<"________________________________________________"<<endl;
cout<<"当前"<<M<<"类资源已分配给"<<N<<"个进程的资源数:"<<endl;
Show2( Allocation);
cout<<"________________________________________________"<<endl;
}
/*******************主函数演示****************/
int main()
{
int k;
char s;
cout<<endl<<endl<<" 银行家算法演示程序 "<<endl;
do{
Showdata();
cout<<"要中止请输入N或n;继续则输入Y或y:";
cin>>s;
if(s=='N'||s=='n')break;
cout<<"请输入进程号0--4:";
cin>>k;
cout<<"此进程需求对"<<M<<"类资源需求情况:"<<endl;
InitiRequest();
Banker(k);
}while(1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -