(全部代码在最后)
需要定义的全局变量:
int Max[10][10]; //总共需要资源
int alloc[10][10]; //已分配资源
int need[10][10]; //现需要资源
int avail[10]; //系统可用资源量
bool finish[10]; //finish向量
int work[10]; //work向量
int reque[10][10]; //需求矩阵
int a,b; //a是进程数,b是资源种类数
int tem[10]; //暂存向量
int agree; //存放完成的进程数
bool one=true; //初始work判断
vector<int> list1; //存放安全队列
需要的函数:
//声明
void init(int a,int b); //初始化
void banker(int j,int z); //银行家算法
int securityassess(int alloc1[][10],int need1[][10],int avail[10]); //安全评估
void clear1(); //评估finish
主函数:
int main(int argc, char** argv)
{
cout<<"请输入进程数和资源数:";
cin>>a>>b;
init(a,b);
banker(a,b);
return 0;
}
1、初始化(利用void init(int a,int b);函数)
1)首先在主函数中输入进程数a和资源数b。
2)然后调用init( a , b) 函数进行初始化资源总量、Max[i][j]、Available[i]、Allocation[i][j]、Need[i][j]矩阵以及让Finish[i]向量组全为False。{注:均为全局变量}
3)在 init( a , b) 函数里调用securityassess( alloc , need , avail )函数 { 注:3、中讲解该安全性函数 ;现知存在安全序列该函数返回1,不存在返回0即可} 进行安全性判断 , 若不存在安全性序列则返回 2),否则结束初始化。
void init(int a,int b) //初始化
{
int i,l;
while(1){
cout<<"依次输入每个资源的数量:";
for(i=1;i<=b;i++)
{
cin>>avail[i];
}
cout<<"依次输入"<<a<<"个进程的最大需求:" <<endl; //max矩阵
for(i=1;i<=a;i++)
{
for(l=1;l<=b;l++)
{
cin>>Max[i][l];
}
}
cout<<"依次输入"<<a<<"个进程已分配给的数量:" <<endl; //分配矩阵
for(i=1;i<=a;i++)
{
for(l=1;l<=b;l++)
{
cin>>alloc[i][l];
}
}
cout<<"需求矩阵为:" <<endl;
for(i=1;i<=a;i++)
{ //需求矩阵
for(l=1;l<=b;l++)
{
need[i][l]=Max[i][l]-alloc[i][l];
cout<<need[i][l]<<" ";
}
cout<<endl;
}
for(i=1;i<=a;i++)
{ //初始 Finish 向量
finish[i]=false;
}
//以下初始 可用资源
for(i=1;i<=b;i++) //资源数
{
for(l=1;l<=a;l++) //进程数
{
tem[i]+=alloc[l][i];
}
}
cout<<"可用资源为:"<<endl;
for(l=1;l<=b;l++)
{
avail[l]=avail[l]-tem[l];
cout<<avail[l]<<" ";
}
cout<<endl;
cout<<"----------以上为初始数据------------"<<endl;
cout<<endl;
if(!securityassess(alloc,need,avail)) //不安全则退回原值资源
{
cout<<"初始化不安全!!,请重新分配"<<endl;
list1.clear(); //清空安全队列
clear1(); //清空安全判定对finish的影响
one=true;
continue;
}
else
{
cout<<endl;
cout<<"初始化安全!!"<<endl;
list1.clear(); //清空安全队列
clear1(); //清空安全判定对finish的影响
break;
}
}
cout<<"------------下面进行请求分析-----------"<<endl;
}
2、调用void banker(int a ,int b )函数实现进程发出请求和银行家算法:
1)输入发出请求的进程p,以及该进程的请求向量Request[ p ] [ j ],
首先进行合法性判断; 若{ Request [p][j]> need[p][j] or Request [p][j]> available[j] }则重复1),否则进行下一步。
void banker(int j,int z)
{
int i,l,p,ju; //p为发出请求的进程
int T=0,n1=0,n2=0,temneed[10][10],temalloc[10][10],temavail[10];
while(1)
{
one=true;
cout<<endl;
cout<<"T"<<T<<"时刻请求进程为:";
T++;
cin>>p;
cout<<"进程"<<p<<"的请求为:";
for(i=1;i<=z;i++) //进程某时刻 请求
{
cin>>reque[p][i];
}
//请求合法判断
for(i=1;i<=z;i++)
{
if(reque[p][i]>need[p][i])
n1=1;
if(reque[p][i]>avail[i])
n2=1;
}
if(n1)
{
cout<<"出错!请求超出需求资源"<<endl;
n1=0;
n2=0;
continue;
}
if(n2)
{
cout<<"出错!请求超出可用资源:"<<endl;
cout<<"__________________________"<<endl;
cout<<"|请求资源: |"<<endl;
cout<<"|";
for(i=1;i<=z;i+