📄 银行家算法.cpp
字号:
////////////////////////////////////////////////////////////////////////////
// 文件名 : 银行家算法.cpp
// 目的及主要功: 银行家算法实现
// 创建日期 :2007/11/10
// 修改日期 :
// 作者 : 陈宁
// 修改者 :
////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
#define M 5 //进程数
#define N 5 //资源数
int s[M][N],f[M][N],a[N],r[N]; //尚需、已分、可用、请求
int flag[M]; //完成标记
int use[N];
int k=-1;
//----------------------------------------------------------------
int IsSafe(int m,int n)
{
int what=0;
for(int i=0;i<m;i++) //外循环
{
for(int v=0;v<m;v++) //内循环
{
if(flag[v]==0) //进程没完成
{
int j;
for( j=0;j<n;j++)
{
//a[j]表示系统可用资源,如果资源不够,换下一个进程
if(s[v][j]>a[j]) break;
}
if(j==n)//该进程可以完成
{
for(int w=0; w<n; w++)
use[w]=a[w];
for(int ee=0; ee<n; ee++)
a[ee]=f[v][ee]+a[ee]; //更新系统可用
flag[v]=1; //置标志
what=1;
cout<<"系统可用资源";
for(int aa=0;aa<n;aa++)
cout<<a[aa]<<" ";
cout<<endl;
}
}
}
if(what==0) return 0;
}
return 1;
}
void BankManage(int m,int n)
{
for(int j=0;j<n;j++)
{
if(s[k][j] < r[j])
{
cout<<"申请出错!"; //请求大于尚需
return;
}
}
for(int j0=0;j0<n;j0++)
{
if(a[j0] < r[j0])
{
cout<<"申请出错!"; //请求大于系统可用
return;
}
}
for(int jj=0;jj<n;jj++) //试分配
{
a[jj]=a[jj]-r[jj]; //系统可用资源a[jj]
use[jj]=a[jj];
f[k][jj]=f[k][jj]+r[jj]; //已分
s[k][jj]=s[k][jj]-r[jj]; //尚需
}
cout<<"试分后系统可用资源:";
for(int zz=0;zz<n;zz++)
cout<<a[zz]<<" ";
cout<<endl<<endl;
int pk;
for(pk=0;pk<n;pk++)
{
if(s[k][pk]!=0)
break;
}
if (pk==n)
{
flag[k]=1;
for(int eo=0;eo<n;eo++)
a[eo]=f[k][eo]+a[eo]; //更新系统可用资源
cout<<"系统可用资源:";
for(int oo=0;oo<n;oo++)
cout<<a[oo]<<" ";
cout<<endl;
}
if(!IsSafe(m,n))//不安全,恢复各个矩阵
{
cout<<"\n\t不安全!\n";
for(int uu=0;uu<n;uu++)
{
a[uu]=a[uu]+r[uu];
f[k][uu]=f[k][uu]-r[uu];
s[k][uu]=s[k][uu]+r[uu];
}
}
else
cout<<"\n\t安全!\n";
}
void main()
{
int m,n;
string PName; //请求进程名字
string name[M]; //M个进程名
cout<<"\n\t请输入进程数,资源种类<注意:均小于5>:\n";
cin>>m>>n;
if(m >= 5 || n >=5)
cout<<"\n出错!重新输入进程数,资源种类<注意:均小于5>!\n";
else
{
for(int i=0; i<m; i++)
{
cout<<"\n请输入第"<<i+1<<"个进程的名字:";
cin>>name[i];
flag[i] = 0;
}
for(int i1=0; i1<m; i1++)
{
cout<<"\n请输入第"<<i1+1<<"个进程的已分资源:";
for(int j=0; j<n; j++)
cin>>f[i1][j];
cout<<"\n请输入第"<<i1+1<<"个进程的尚需资源:";
for(int j1=0; j1<n; j1++)
cin>>s[i1][j1];
}
cout<<"\n输入系统当前可用资源:";
for(int i2=0; i2<n; i2++)
{
cin>>a[i2];
}
cout<<"\n请输入发出资源请求向量进程的名称:";
cin>>PName;
cout<<"\n请输入其请求资源情况:";
for(int j=0;j<n;j++)
cin>>r[j];
for(int i3=0; i3<m; i3++)
{
if(name[i3]==PName)
k=i3;
}
if(k==-1) //k 是全局变量,初始值为 -1
cout<<"\n输入进程名有误!";
else
BankManage(m,n);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -