终于实现了银行家算法~!
想看一下自己对c++理解的怎么样,所以就想写一个银行家的算法,呵呵~!用了四个晚上终于实现了!各位看看哈~!帮小弟看看还有那些地方需要修改的,另外我写的这个只能输出一中序列,而是实际情况中可以有不同的组合序列,这个算法一直不知道该如何实现~!希望有高手能指点一下哈~!#include <iostream>
using namespace std;
bool test_Request(int *,int *); //测试函数
void assign(); //分配函数
bool safe_check(); //安全检测函数
void recover(int); //回收函数
bool check_finish(); //检测finish函数
int P_finish[5]={0,0,0,0,0}; //已完成的进程序列
int P_work[5]; //进程工作序列
int P_max[][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //进程最大需求
int P_Alloctioan[][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //进程已得到的
int P_need[][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; //进程还需分配的
int Sys_resource[3]={3,3,2}; //系统拥有的资源
int n; //告诉系统第几个进程需要申请
int Request[3]; //告诉系统申请每类资源的数量
int main()
{
cout<<"请输入要申请资源的进程(1-5): ";
cin>>n;
while(n<0||n>5) //输入正确的进程序号
{
cout<<"输入错误,请重新输入进程序号:";
cin>>n;
}
n=n-1;
cout<<"输入该进程所要申请的各资源数(A B C): "<<endl;
for(int j=0;j<3;j++) //输入申请资源的数量
cin>>Request[j];
if(test_Request(Request,Sys_resource))
{
assign();
if(safe_check())
{cout<<"不会产生死锁,安全进程队列为:"<<endl;
for(int a=0;a<5;a++)
cout<<"P"<<P_work[a]<<'\t';
}
else
cout<<'\a'<<"产生死锁!!";
}
else cout<<"系统资源不足!";
system("pause");
}
bool test_Request(int *p,int *q)
{
for(int m=0;m<3;m++)
{
if(*(p+m)>*(q+m))
return 0;
if(*(p+m)<=*(q+m)&&m==2)
return 1;
}
}
void assign()
{
for(int m=0;m<3;m++)
{
P_need[n][m]-=Request[m];
Sys_resource[m]-=Request[m];
P_Alloctioan[n][m]+=Request[m];;
}
}
bool safe_check()
{
int i,j=0;
while(1)
{
for(i=0;i<5;i++)
if(test_Request(P_need[i],Sys_resource)&&P_finish[i]==0)
break;
if(i<5)
{
recover(i);
P_finish[i]=1;
P_work[j]=i+1;
j++;
}
if(i>=5)
{
if(check_finish())
return true;
else
return false;
}
}
}
void recover(int i)
{
for(int m=0;m<3;m++)
Sys_resource[m]+=P_Alloctioan[i][m];
}
bool check_finish()
{
for(int i=0;i<5;i++)
{
if(P_finish[i]==0)
return false;
else
if(P_finish[i]!=0&&i==4)
return true;
}
}