还是银行家~!
上次写的哪个银行家算法,给老师看了以后,他说不行,不符合他的要求,于是问清楚以后,又写了一个~!大家看看,功能有增强~!其实写完以后体会最深的不再是银行家算法的实现了,而是指针的用法了,感受颇深!
#include <iostream>
using namespace std;
int P_num; //进程总数
int Soure_num; //资源类数
int **P_soure; //进程已分配的资源数量
int **P_max; //系统的最大需求资源数量
int **P_need; //进程需要的资源数量
int *Sys_resoure; //系统拥有资源数量
int *P_application; //某个进程申请的资源数量
int P_app_num; // 第几个进程申请资源
int *Finish; //已经完成序列
int *Working; //进程工作序列
void P_input(); //初始化函数
bool comp(); //测试函数
bool safe_check(); //安全检测
void assign(); //资源分配函数
bool p_comp(int i); //判断系统资源是否不足 s
void recover(int i); //回收函数
int main()
{
P_input();
if(comp())
{
assign();
if(safe_check())
{
for(int i=0;i<P_num;i++)
cout<<"P"<<Working[i]<<",";
}
else
cout<<'\a'<<"产生死琐!!";
}
system("pause");
return 0;
}
void P_input() //初始化大小
{
cout<<"请输入有多少个进程:";
cin>>P_num; //初始化进程数
cout<<"系统有多少类资源:";
cin>>Soure_num; //初始化资源种类
Sys_resoure=new int [Soure_num];
cout<<"系统拥有的每类资源的数量:";
for(int i=0;i<Soure_num;i++)
cin>>Sys_resoure[i];
system("cls");
//初始化完成序列
Finish=new int [P_num];
for(int i=0;i<P_num;i++)
Finish[i]=0;
//初始化工作序列
Working=new int [P_num];
for(int i=0;i<P_num;i++)
Working[i]=0;
//初始化进程需要的最大资源数量 )
P_max=new int * [P_num];
for(int i=0;i<P_num;i++) //初始化大小
P_max[i]=new int [Soure_num];
for(int i=0;i<P_num;i++)
{
cout<<"*********进程需要的最大资源数量*************"<<endl;
for(int j=0;j<Soure_num;j++)
{
cout<<"请输入 "<<i+1<<"号进程需要的第 "<<j+1<<" 类资源的最大数量:";
cin>>P_max[i][j];
}
system("cls");
}
//初始化进程已分配的资源数量
P_soure=new int * [P_num];
for(int i=0;i<P_num;i++) //初始化大小
P_soure[i]=new int [Soure_num];
for(int i=0;i<P_num;i++)
{
cout<<"*********进程已分配的资源数量*************"<<endl;
for(int j=0;j<Soure_num;j++)
{
cout<<"请输入 "<<i+1<<"号进程已分配的第 "<<j+1<<" 类资源数量:";
cin>>P_soure[i][j];
}
system("cls");
}
//初始化进程的需求资源
P_need= new int * [P_num];
for(int i=0;i<P_num;i++) //初始化大小
P_need[i]=new int [Soure_num];
for(int i=0;i<P_num;i++)
for(int j=0;j<Soure_num;j++)
P_need[i][j]=P_max[i][j]-P_soure[i][j];
for(int i=0;i<P_num;i++)
{cout<<"第"<<i<<"个进程的需求是:";
for(int j=0;j<Soure_num;j++)
cout<<P_need[i][j]<<",";
cout<<endl;
}
//初始化第几个进程申请寺院
cout<<"输入需要申请资源的编号:";
cin>>P_app_num;
P_app_num-=1;
//初始化进程申请的资源数量
P_application= new int [Soure_num];
for(int i=0;i<Soure_num;i++)
{
cout<<"申请的第 "<<i+1<<" 类资源的数量为:";
cin>>P_application[i];
}
}
bool comp() //比较进程申请的资源是否大于系统资源和该进程所需求的资源
{
for(int i=0;i<Soure_num;i++)
{
if(P_application[i]>Sys_resoure[i]||P_application[i]>P_need[P_app_num][i])
{
cout<<"系统资源不足!!";
return 0;
}
return 1;
}
}
void assign() //分配函数
{
for(int i=0;i<Soure_num;i++)
{
P_need[P_app_num][i]-=P_application[i];
Sys_resoure[i]-=P_application[i];
P_soure[P_app_num][i]+=P_application[i];
}
}
bool p_comp(int i) //判断系统资源是否不足
{
for(int j=0;j<Soure_num;j++)
{
if(P_need[i][j]>Sys_resoure[j])
return 0;
}
return 1;
}
bool safe_check() //安全检测
{
int i;
int n=0;
while(1)
{
for(i=0;i<P_num;i++)
{
if(p_comp(i)&&Finish[i]==0)
break;
}
if(i<P_num) //第i个进程可以执行
{
recover(i);
Finish[i]=1;
Working[n]=i+1;
n++;
}
if(i>=P_num)
{
for(int j=0;j<P_num;j++)
{
if(Finish[j]!=1)
return 0;
}
return 1;
}
}
}
void recover(int i) //回收函数
{
for(int j=0;j<Soure_num;j++)
Sys_resoure[j]+=P_soure[i][j];
}