操作系统是大二时学的,当时实验课上要求编银行家算法,我就从网上找一个代码但看者总觉得有些地方想不通,因此,一直对这个算法不理解,现在要作操作系统课程设计,我还选银行家算法,我没去看别人怎么做,完全是根据书上的算法,按照自己的理解搞出来的一端代码,还是比较满意的.
我和网上其他代码比较过,算法都是一样的,但有些地方思路不同,比如检测系统状态算法check(),这个地方正是我不明白的地方,经过思考我坚持自己的算法.程序的进程数,资源数,最大资源需求数,已分配资源数等都是可以动态分配的,这也是与其他代码不同的地方,也因此我的代码量比较大一些.
#include<iostream>
using namespace std;
int M,N;
int temp=0;
int **maximum;
int *available;
int **allocate;
int **need;
bool *finish;
int *work;
int *process;
int *request;
void restore(int p);
void print();
void check(int p){
bool flag=false;
for(int i=0;i<N;i++){ //检查是否有进程finish[i]=false&need[i]<work
if(finish[i]==false){
int j=0;
for(;j<M;j++){
if(need[i][j]>work[j])
break;
}
if(j==M){ //如果有这样的进程设置finish=true
for(int k=0;k<M;k++)
work[k]+=allocate[i][k];
process[temp++]=i+1;
finish[i]=true;
flag=true;
}
}
}
if(flag==false){ //如果所有进程都不符合条件,判断是否所有finish[i]=true,
int k=0; //如果是,则系统处于安全状态,否则系统处于不安全状态
for(;k<N;k++){
if(finish[k]==false){ cout<<"系统处于不安全状态!资源分配失败!"<<endl;
restore(p);
break;}
}
if(k==N){
cout<<"系统处于安全状态!"<<endl;
printf("安全序列为:/n");
for(int i=0;i<N-1;i++)
printf("进程%d->",process[i]);
printf("进程%d/n",process[N-1]);
restore(p);
}
}
else check(p);
};
void print(){
printf("/n现有资源数:/n");
for(int i=0;i<M;i++) cout<<"资源"<<i+1<<"/t";
cout<<endl;
for(int i=0;i<M;i++) cout<<available[i]<<"/t";
cout<<endl;
cout<<"最大需求资源数:"<<endl;
for(int i=0;i<N;i++){
cout<<"进程"<<i+1<<"/t";
for(int j=0;j<M;j++)
cout<<maximum[i][j]<<"/t";
cout<<endl;
}
cout<<"已分配资源数:"<<endl;
for(int i=0;i<N;i++){
cout<<"进程"<<i+1<<"/t";
for(int j=0;j<M;j++)
cout<<allocate[i][j]<<"/t";
cout<<endl;
}
cout<<"还需要资源数:"<<endl;
for(int i=0;i<N;i++){
cout<<"进程"<<i+1<<"/t";
for(int j=0;j<M;j++)
cout<<need[i][j]<<"/t";
cout<<endl;
}
};
void init()
{
cout<<endl;
cout<<"请输入资源种类数:";
cin>>M;
cout<<endl;
cout<<"请输入进程个数:";
cin>>N;
maximum=new int*[N];
available=new int[M];
allocate=new int*[N];
need=new int*[N];
finish=new bool[N];
work=new int[M];
process=new int[N];
request=new int[M];
for(int i=0;i<N;i++){
maximum[i]=new int[M];
allocate[i]=new int[M];
need[i]=new int[M];
}
cout<<endl;
cout<<"请输入每个资源的现有数量:(输入用回车结束)"<<endl;
for(int i=0;i<M;i++){
cout<<"进程"<<i+1<<":";
cin>>available[i];
}
cout<<endl;
cout<<"请输入每个进程的最大资源需求数:"<<endl;
cout<<"资源数量之间用空格隔开"<<endl;
for(int i=0;i<N;i++){
cout<<"第"<<i+1<<"个进程:";
for(int j=0;j<M;j++)
cin>>maximum[i][j];
}
cout<<endl;
cout<<"请输入每个进程已分配的资源数:"<<endl;
for(int i=0;i<N;i++){
cout<<"第"<<i+1<<"个进程:";
for(int j=0;j<M;j++)
cin>>allocate[i][j];
for(int k=0;k<M;k++)
if(allocate[i][k]>maximum[i][k]){
cout<<"第"<<k+1<<"个已分配资源超过最大资源需求数!请重新分配"<<endl;
i--;
break;
}
}
for(int i=0;i<N;i++) //need[][]初始化
for(int j=0;j<M;j++)
need[i][j]=maximum[i][j]-allocate[i][j];
};
void input(){ //输入每个进程的需求数
print();
cout<<"请输入请求资源的进程号(从1到"<<N<<"):"; //输入请求资源数
int p=-1;
cin>>p;
while(p<=0||p>N){
cout<<"进程号不存在,请重新输入:";
cin>>p;
}
cout<<endl;
cout<<"请输入每个资源的请求数量:"<<endl;
for(int i=0;i<M;i++){
cout<<"资源"<<i+1<<":";
cin>>request[i];
if(request[i]>need[p-1][i]){
cout<<"请求的资源数大于还需要的资源数,请重新请求。"<<endl;
i--;
}
else if(request[i]>available[i]){
cout<<"请求的资源数大于现有的资源数,请重新请求。"<<endl;
i--;
}
}
for(int i=0;i<M;i++){ //预分配
allocate[p-1][i]+=request[i];
need[p-1][i]-=request[i];
available[i]-=request[i];
}
for(int k=0;k<M;k++) //work初始化
work[k]=available[k];
for(int i=0;i<N;i++) //finish初始化
finish[i]=false;
print();
check(p);
};
void restore(int p){
for(int i=0;i<M;i++){
allocate[p-1][i]-=request[i];
need[p-1][i]+=request[i];
available[i]+=request[i];
}
};
void destory(){
for(int i=0;i<N;i++){
delete[] maximum[i];
delete[] allocate[i];
delete[] need[i];
}
delete[] maximum;
delete[] allocate;
delete[] need;
delete[] available;
delete[] finish;
delete[] work;
delete[] process;
delete[] request;
};
void main(){
char f='y';
init();
while(f=='y'||f=='Y'){
input();
cout<<endl;
cout<<"是否继续银行家算法演示?(是则输入Y或y,否则输入n或N):";
cin>>f;
}
destory();
}