📄 银行家算法.cpp
字号:
#include<iostream.h>
/***********************************************************************
数据定义与函数原型说明
***********************************************************************/
#define m 5 //总进程数
#define n 4 //总资源数
struct bank //定义结构体
{
int Available[n]; //可利用资源向量
int Max[m][n]; //最大需求矩阵
int Allocation[m][n]; //分配矩阵
int Need[m][n]; //需求矩阵
};
void Initilize(bank &); //初始化
int Safe_test(bank); //检查安全性
void Resoure_allocate(bank &); //系统对进程资源申请的处理
/***********************************************************************
主函数
***********************************************************************/
void main(void)
{
bank current; //定义变量
Initilize(current); //初始化
Safe_test(current); //检查安全性
while(1) //循环执行进程申请资源和系统对申请的处理
{
Resoure_allocate(current);
}
}
/***********************************************************************
初始化
***********************************************************************/
void Initilize(bank &x)
{
int i,j;
cout<<"初始化过程,输入相关数据:\n";
cout<<"输入最大需求矩阵Max:"<<'\n';
for(i=0;i<m;i++) //设置最大需求矩阵
{
for(j=0;j<n;j++)
{
cin>>x.Max[i][j];
}
}
cout<<"输入分配矩阵Allocation:"<<'\n';
for(i=0;i<m;i++) //设置分配矩阵
{
for(j=0;j<n;j++)
{
cin>>x.Allocation[i][j];
}
}
for(i=0;i<m;i++) //设置需求矩阵
{
for(j=0;j<n;j++)
{
x.Need[i][j]=x.Max[i][j]-x.Allocation[i][j];
}
}
cout<<"输入可利用资源向量:"<<'\n';
for(i=0;i<n;i++) //设置可利用资源向量
{
cin>>x.Available[i];
}
}
/***********************************************************************
检查安全性
***********************************************************************/
int Safe_test(bank x)
{
int i,j;
int safeprocess[m]; //安全序列向量
int work[n]; //空闲资源矩阵
int Finish[m]; //进程完成标志矩阵
for(i=0;i<n;i++) //开始时可利用资源向量就是空闲资源矩阵
work[i]=x.Available[i];
for(i=0;i<m;i++) //初始化标志矩阵为false
Finish[i]=false;
int k=0; //安全序列排列号
for(i=0;i<m;i++) //每次都从第一个进程开始做循环
{
if(Finish[i]==false)
{
for(j=0;j<n;j++)
{
if(x.Need[i][j]>work[j]) //判断当前进程需求矩阵能否得到满足
break; //不满足则跳出
}
if(j==n) //第i个进程满足执行条件
{
safeprocess[k++]=i; //将进程号存入安全序列向量
for(int q=0;q<n;q++) //修改空闲资源矩阵
work[q]+=x.Allocation[i][q];
Finish[i]=true; //标志该进程可完成
i=-1; //下次检查从第一个进程重新查起
}
}
}
for(i=0;i<m;i++) //检查标志数组,若有一个为false则找不到安全序列
if(!Finish[i])
{
cout<<"找不到安全序列,系统处于不安全状态!\n";
return 0;
}
cout<<"找到安全序列:"; //找到安全序列并显示该序列
for(i=0;i<m;i++)cout<<"进程"<<safeprocess[i]+1<<" ";
cout<<"\n系统处于安全状态.\n";
return 1;
}
/***********************************************************************
系统对进程资源申请的处理
***********************************************************************/
void Resoure_allocate(bank &x)
{
bank temp=x; //临时变量存储x的初值
int Request[n]; //请求向量
int number; //进程号
int i;
cout<<"请输入要申请资源的进程序号:\n";
cin>>number;
cout<<"请输入请求向量:\n";
for(i=0;i<n;i++) cin>>Request[i]; //输入请求向量
for(i=0;i<n;i++)
{
if(Request[i]>x.Need[number-1][i]) //所需资源数大于需求量
{
cout<<"进程所需要的资源数已超过它所宣布的最大值,系统不予分配资源!\n";
return ;
}
if(Request[i]>x.Available[i]) //所需资源数大于可利用资源
{
cout<<"系统中无足够的资源满足进程的申请,系统不予分配资源!\n";
return ;
}
}
for(i=0;i<n;i++) //假设系统将申请资源数分配给该进程,对数据进行相关修改
{
x.Available[i] -= Request[i];
x.Need[number-1][i] -= Request[i];
x.Allocation[number-1][i] += Request[i];
}
if(Safe_test(x)) //安全性检查结果为安全
{
cout<<"系统可以为该进程分配资源.\n";
return ;
}
else //安全性检查结果为不安全
{
cout<<"系统不为该进程分配资源\n";
x=temp; //将相关矩阵修改过来,表示资源不分配资源
return ;
}
}
/***********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -