银行家算法
一、实验目的
1、 对死锁避免中的银行家算法作进一步理解。
2、 加深理解死锁的概念。
3、 加深理解安全序列和安全状态的概念。
4、 通过编程,掌握银行家算法分配资源的一步步实现过程。
二、实验内容及要求
1、给出系统可用资源向量(例如:系统可用资源=(5,3,8,2,10))。
2、若干进程最大需求矩阵如下表所示:
3、采用时间片轮转法调度进程。
4、进程执行时提出资源请求(可利用随机数给出或从键盘输入)。
5、判断资源是否可以安全分配,要求进程每提出一个资源请求,都要进行安全判断并给出安全序列,否则给出提示。
实验代码:
cout<<"请输入可利用资源的名字及数目"<<endl;
for(i=0;i<m;i++)
{
cin>>name[i];
cin>>Avaiable[i];
}
cout<<"请输入Max以"<<m<<"*"<<n<<"矩阵格式输入"<<endl;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>Max[i][j];
cout<<"请输入Allocation以"<<m<<"*"<<n<<"矩阵格式输入"<<endl;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>Allocation[i][j];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
Need[i][j]=Max[i][j]-Allocation[i][j];
cout<<"请输入进程的名字"<<endl;
for(i=0;i<n;i++)
{
cin>>Job[i].Name;
Job[i].Finish=0;
size++;
}
cout<<"系统目前可用资源Avaliable"<<endl;
for(i=0;i<m;i++)
cout<<name[i]<<" ";
cout<<endl;
for(i=0;i<m;i++)
cout<<Avaiable[i]<<" ";
cout<<endl;
cout<<" Max Allocation Need "<<endl;
cout<<"进程名";
for(j=0;j<3;j++)
{
for(i=0;i<m;i++)
cout<<name[i]<<" ";
cout<<" ";
}
cout<<endl;
for(i=0;i<n;i++)
{
cout<<" "<<Job[i].Name<<" ";
for(j=0;j<m;j++)
cout<<Max[i][j]<<" ";
cout<<" ";
for(j=0;j<m;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(j=0;j<m;j++)
cout<<Need[i][j]<<" ";
cout<<" ";
cout<<endl;
}
}
//安全性算法
void safe()
{
int i,j,L;
L=0;
int f;
int q=0;
int w[100]={0};
int Q[100];
for(i=0;i<m;i++)
w[i]=Avaiable[i];
int k=0;
while(1)
{
for(i=0;i<n;i++)
{
f=1;
for(j=0;j<m;j++)
{
if(Need[i][j]>w[j])
{
f=0;
break;
}
}
if(Job[i].Finish==0&&f==1)
{
for(j=0;j<m;j++)
w[j]=w[j]+Allocation[i][j];
Job[i].Finish=1;
Q[q]=i;
q++;
k=k+1;
break;
}
}
L++;
if(L==n+2)
{
cout<<"不安全状态"<<endl;
pan=0;
break;
}
if(k==n)
{
cout<<"系统安全"<<endl;
pan=1;
for(i=0;i<n;i++)
cout<<Job[Q[i]].Name<<"";
break;
}
}
for(i=0;i<n;i++)
Job[i].Finish=0;
}
//申请资源函数
void TT()
{
int i;
int b=1,c=1;
cout<<"请选择申请资源的进程"<<endl;
cin>>a;
cout<<"请输入各项资源的数目"<<endl;
for(i=0;i<m;i++)
cin>>request[a][i];
for(i=0;i<m;i++)
{
if(request[a][i]>Need[a][i])
{
b=0;
pan=0;
break;
}
}
for(i=0;i<m;i++)
{
if(request[a][i]>Avaiable[i])
{
c=0;
pan=0;
break;
}
}
if(b==1&&c==1)
{
for(i=0;i<m;i++)
{
Avaiable[i]=Avaiable[i]-request[a][i];
Need[a][i]=Need[a][i]-request[a][i];
Allocation[a][i]=Allocation[a][i]+request[a][i];
}
}
}
//申请失败归还数据函数
void TD()
{
int i;
for(i=0;i<m;i++)
{
Avaiable[i]=Avaiable[i]+request[a][i];
Need[a][i]=Need[a][i]+request[a][i];
Allocation[a][i]=Allocation[a][i]-request[a][i];
}
}
};
int main()
{
work s;
int T;
int V=1;
s.in_put();
s.safe();
while(V!=0)
{
cout<<"请选择是否申请资源"<<":1:是 2:否"<<endl;
cin>>T;
switch(T)
{
case 1:s.TT();
if(pan==0)
{
s.TD();
cout<<"不同意申请"<<endl;
break;
}
s.safe();
if(pan==0)
{
s.TD();
cout<<"不同意申请"<<endl;
}
else
cout<<endl;
cout<<"同意申请"<<endl;
break;
case 2:V=0;
break;
}
}
return 0;
}