主题:有点问题 的银行家算法
#include<iostream.h>
#include <stdlib.h>
#include<iomanip.h>
#include<conio.h>
const int N=5; //行数 0,1,2,3,4
const int M=3; //列数 0,1,2
void Print(int Available[M],int Need[N][M],int Allocation[N][M]) //打印输出看一下结果
{
int i;
cout<<"A,B,C现在已经分配如下: \n\n";
cout<<"进程名\t"<<" Allocation\t\t"<<"Need\t\t"<<"Available"<<endl;
cout<<"\t A B C"<<"\t A B C"<<"\t\tA B C\n";
cout<<"---------------------------------------------------------\n";
for(i=0;i<N;i++)
{
cout<<setw(4)<<i<<setw(9);
cout<<Allocation[i][0]<<setw(4)<<Allocation[i][1]<<setw(4)<<Allocation[i][2]<<setw(9);
cout<<Need[i][0]<<setw(4)<<Need[i][1]<<setw(4)<<Need[i][2]<<setw(11);
if(i==0)
cout<<Available[0]<<setw(4)<<Available[1]<<setw(4)<<Available[2]<<endl;
else
cout<<endl;
}
}
bool issafe(int Available[M],int Need[N][M],int Allocation[N][M]) //用银行家方法试着分配了后,现在来看系统是否处于安全状态
{
int work[M];
int i,j,num=0,flag=N;
bool finish[N]={false,false,false,false,false};
for(i=0;i<M;i++) //i表示第i列
work[i]=Available[i]; //在执行安全性算法开始时
while(--flag>=0) //对所有的进程扫描N次
{
for(i=0;i<N;i++)
{
if(finish[i]==false)
{
if(Need[i][0]<=work[0] && Need[i][1]<=work[1] && Need[i][2]<=work[2])
{
if(Need[i][0]!=0 || Need[i][1]!=0 || Need[i][2]!=0)
for (j=0;j<M;j++)
work[j]=work[j]+Allocation[i][j];
finish[i]=true;
num++;
if(num==N)
return true; //如果num==N的话就可以提前结束此子程序
}
}
}
} //用while 循环从头再来
cout<<"###########"<<num<<endl;
return false; //跳出循环说明不是所有的finish[i]=ture
}
void Bank(int n,int Available[M],int Need[N][M],int Allocation[N][M],int Request[M]) //银行家算法
{
char ch;
for(int j=0;j<M;j++) //n表示第n行
{
if (Request[j]>Need[n][j])
{
ch=j+'A'; //为了更清楚是哪个资源请求过多
cout<<"由于请求的 "<<ch<<" 资源大于需要的,所以不能分配\n";
Print(Available,Need,Allocation);
return; //结束
}
else if (Request[j]>Available[j])
{
ch=j+'A';
cout<<"由于请求的 "<<ch<<" 资源大于可分配的的,所以不能分配\n";
Print(Available,Need,Allocation);
return; //结束
}
}
for(j=0;j<M;j++) //上面两个条件都满足,就修改
{
Allocation[n][j]+=Request[j];
Available[j]-=Request[j];
Need[n][j]-=Request[j];
if( (Need[n][0]==0) && (Need[n][1]==0) && (Need[n][2]==0) ) //若进程执行完了就收回资源
{
for(int i=0;i<M;i++)
Available[i]=Allocation[n][i]+Available[i];
}
}
if(issafe(Available,Need,Allocation)) //调用安全性算法检测
{
cout<<"分配后系统处于安全状态,可以分配,如下:\n\n";
Print(Available,Need,Allocation);
}
else // 分配后系统处于不安全状态,要撤消修改
{
cout<<"分配后系统处于不安全状态,不可以分配\n";
for(j=0;j<M;j++)
{
Allocation[n][j]-=Request[j];
Available[j]+=Request[j];
Need[n][j]+=Request[j];
}
Print(Available,Need,Allocation);
}
}
void main()
{
int A,B,C;
int choice;
int Available[M]={3,3,2};
int Need[N][M]= { {7,4,3},
{1,2,2},
{6,0,0},
{0,1,1},
{4,3,1}
};
int Allocation[N][M]={ {0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}
};
int Request[N];
A=Available[0];
B=Available[1];
C=Available[2];
for(int j=0;j<N;j++)
{
A=A+Allocation[j][0];
B=B+Allocation[j][1];
C=C+Allocation[j][2];
}
cout<<"系统中共有资源A="<<A<<endl;
cout<<"系统中共有资源B="<<B<<endl;
cout<<"系统中共有资源C="<<C<<endl;
Print(Available,Need,Allocation);
if(issafe(Available,Need,Allocation)) //调用安全性算法
cout<<"此时系统处于安全状态\n";
else
return; //一开始系统处于安全状态,程序结束
do
{
cout<<"\n1.使用银行家算法 2.不使用银行家算法\n";
cout<<"请选择: ";
cin>>choice;
int n;
cout<<"输入请求进程号(0---"<<N-1<<"): ";
cin>>n;
cout<<"输入 A 的请求资源: ";
cin>>Request[0];
cout<<"输入 B 的请求资源: ";
cin>>Request[1];
cout<<"输入 C 的请求资源: ";
cin>>Request[2];
//system("cls");
if(choice==1)
Bank(n, Available,Need,Allocation,Request) ; //调用银行家算法
//else
//{
//}
}while( (A!=Available[0]) || (B!=Available[1]) || (C!=Available[2]) ); //这三个条件只要有一个满足,循环还是要做,所以不是&&
cout<<"\n所以的进程都执行完了!\n";
}
#include <stdlib.h>
#include<iomanip.h>
#include<conio.h>
const int N=5; //行数 0,1,2,3,4
const int M=3; //列数 0,1,2
void Print(int Available[M],int Need[N][M],int Allocation[N][M]) //打印输出看一下结果
{
int i;
cout<<"A,B,C现在已经分配如下: \n\n";
cout<<"进程名\t"<<" Allocation\t\t"<<"Need\t\t"<<"Available"<<endl;
cout<<"\t A B C"<<"\t A B C"<<"\t\tA B C\n";
cout<<"---------------------------------------------------------\n";
for(i=0;i<N;i++)
{
cout<<setw(4)<<i<<setw(9);
cout<<Allocation[i][0]<<setw(4)<<Allocation[i][1]<<setw(4)<<Allocation[i][2]<<setw(9);
cout<<Need[i][0]<<setw(4)<<Need[i][1]<<setw(4)<<Need[i][2]<<setw(11);
if(i==0)
cout<<Available[0]<<setw(4)<<Available[1]<<setw(4)<<Available[2]<<endl;
else
cout<<endl;
}
}
bool issafe(int Available[M],int Need[N][M],int Allocation[N][M]) //用银行家方法试着分配了后,现在来看系统是否处于安全状态
{
int work[M];
int i,j,num=0,flag=N;
bool finish[N]={false,false,false,false,false};
for(i=0;i<M;i++) //i表示第i列
work[i]=Available[i]; //在执行安全性算法开始时
while(--flag>=0) //对所有的进程扫描N次
{
for(i=0;i<N;i++)
{
if(finish[i]==false)
{
if(Need[i][0]<=work[0] && Need[i][1]<=work[1] && Need[i][2]<=work[2])
{
if(Need[i][0]!=0 || Need[i][1]!=0 || Need[i][2]!=0)
for (j=0;j<M;j++)
work[j]=work[j]+Allocation[i][j];
finish[i]=true;
num++;
if(num==N)
return true; //如果num==N的话就可以提前结束此子程序
}
}
}
} //用while 循环从头再来
cout<<"###########"<<num<<endl;
return false; //跳出循环说明不是所有的finish[i]=ture
}
void Bank(int n,int Available[M],int Need[N][M],int Allocation[N][M],int Request[M]) //银行家算法
{
char ch;
for(int j=0;j<M;j++) //n表示第n行
{
if (Request[j]>Need[n][j])
{
ch=j+'A'; //为了更清楚是哪个资源请求过多
cout<<"由于请求的 "<<ch<<" 资源大于需要的,所以不能分配\n";
Print(Available,Need,Allocation);
return; //结束
}
else if (Request[j]>Available[j])
{
ch=j+'A';
cout<<"由于请求的 "<<ch<<" 资源大于可分配的的,所以不能分配\n";
Print(Available,Need,Allocation);
return; //结束
}
}
for(j=0;j<M;j++) //上面两个条件都满足,就修改
{
Allocation[n][j]+=Request[j];
Available[j]-=Request[j];
Need[n][j]-=Request[j];
if( (Need[n][0]==0) && (Need[n][1]==0) && (Need[n][2]==0) ) //若进程执行完了就收回资源
{
for(int i=0;i<M;i++)
Available[i]=Allocation[n][i]+Available[i];
}
}
if(issafe(Available,Need,Allocation)) //调用安全性算法检测
{
cout<<"分配后系统处于安全状态,可以分配,如下:\n\n";
Print(Available,Need,Allocation);
}
else // 分配后系统处于不安全状态,要撤消修改
{
cout<<"分配后系统处于不安全状态,不可以分配\n";
for(j=0;j<M;j++)
{
Allocation[n][j]-=Request[j];
Available[j]+=Request[j];
Need[n][j]+=Request[j];
}
Print(Available,Need,Allocation);
}
}
void main()
{
int A,B,C;
int choice;
int Available[M]={3,3,2};
int Need[N][M]= { {7,4,3},
{1,2,2},
{6,0,0},
{0,1,1},
{4,3,1}
};
int Allocation[N][M]={ {0,1,0},
{2,0,0},
{3,0,2},
{2,1,1},
{0,0,2}
};
int Request[N];
A=Available[0];
B=Available[1];
C=Available[2];
for(int j=0;j<N;j++)
{
A=A+Allocation[j][0];
B=B+Allocation[j][1];
C=C+Allocation[j][2];
}
cout<<"系统中共有资源A="<<A<<endl;
cout<<"系统中共有资源B="<<B<<endl;
cout<<"系统中共有资源C="<<C<<endl;
Print(Available,Need,Allocation);
if(issafe(Available,Need,Allocation)) //调用安全性算法
cout<<"此时系统处于安全状态\n";
else
return; //一开始系统处于安全状态,程序结束
do
{
cout<<"\n1.使用银行家算法 2.不使用银行家算法\n";
cout<<"请选择: ";
cin>>choice;
int n;
cout<<"输入请求进程号(0---"<<N-1<<"): ";
cin>>n;
cout<<"输入 A 的请求资源: ";
cin>>Request[0];
cout<<"输入 B 的请求资源: ";
cin>>Request[1];
cout<<"输入 C 的请求资源: ";
cin>>Request[2];
//system("cls");
if(choice==1)
Bank(n, Available,Need,Allocation,Request) ; //调用银行家算法
//else
//{
//}
}while( (A!=Available[0]) || (B!=Available[1]) || (C!=Available[2]) ); //这三个条件只要有一个满足,循环还是要做,所以不是&&
cout<<"\n所以的进程都执行完了!\n";
}