欢迎光临散文网 会员登陆 & 注册

银行家算法

2020-05-04 14:02 作者:乔知洛  | 我要投稿

一、实验目的

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;
}


银行家算法的评论 (共 条)

分享到微博请遵守国家法律