银行家算法
银行家算法是一种最有代表性的避免死锁的算法。
我写的代码是C++,唯一不足的就是锁定了资源种数为3种,进程数也为3个,我写这个只是为了实现这个算法而已。我写的代码非常简单,简单到根本不需要添加注释。如果各位有什么特殊要求可以在代码添加改变来满足你所需的要求。并且我已经给出一组实验数据,运行时直接粘贴即可。至少这一组数据是一点问题没有的。再怎么说这个代码糊弄老师肯定是OK的。
废话不说直接上我的代码:
#include<iostream>
using namespace std;
int main()
{
int w=0;
int h=0;
int i=1;
int j=1;
int k=1;
int a=0;
int b=0;
int c=0;
int d;
int work[4];
double All[4];
double Max[6][4];
double Allocation[6][4];
double Need[6][4];
int Available[4]={0};
int Availabletwo[4]={0}; //数组要开大一点
cout<<"输入各种资源数量的数组"<<endl;
for(k=1;k<=3;k++)
{
cin>>All[k];
}
cout<<"输入Max数组"<<endl;
for(i=1;i<=5;i++)
{
for(j=1;j<=3;j++)
{
cin>>Max[i][j];
}
}
cout<<"输入Allocation数组"<<endl;
for(i=1;i<=5;i++)
{
for(j=1;j<=3;j++)
{
cin>>Allocation[i][j];
}
}
for(i=1;i<=5;i++)
{
for(j=1;j<=3;j++)
{
Need[i][j]=Max[i][j]-Allocation[i][j];
}
}
cout<<"输出Need数组"<<endl;
for(i=1;i<=5;i++)
{
for(j=1;j<=3;j++)
{
cout<<Need[i][j]<<' ';
}
cout<<endl;
}
cout<<"输出Available数组"<<endl;
for(i=1;i<=5;i++)
{
a=a+Allocation[i][1];
}
Available[1]=All[1]-a;
Availabletwo[1]=Available[1];
cout<<Available[1]<<' ';
for(i=1;i<=5;i++)
{
b=b+Allocation[i][2];
}
Available[2]=All[2]-b;
Availabletwo[2]=Available[2];
cout<<Available[2]<<' ';
for(i=1;i<=5;i++)
{
c=c+Allocation[i][3];
}
Available[3]=All[3]-c;
Availabletwo[3]=Available[3];
cout<<Available[3]<<' ';
cout<<endl;
while(1)
{
for(i=1;i<=5;i++)
{
if(Available[1]>=Need[i][1]&&Available[2]>=Need[i][2]&&Available[3]>=Need[i][3])
{
cout<<"第"<<i<<"个进程暂时加入安全序列"<<endl;
Available[1]=Available[1]+Allocation[i][1];
Available[2]=Available[2]+Allocation[i][2];
Available[3]=Available[3]+Allocation[i][3];
Need[i][1]=100;
Need[i][2]=100;
Need[i][3]=100;
h=h+1;
break;
}
w=w+1;
}
if(h==5)
{
cout<<"上述就是安全序列"<<endl;
cout<<"请输入要请求资源的进程"<<endl;
cin>>d;
cout<<"请输入请求资源数量"<<endl;
for(int o=1;o<=3;o++)
{
cin>>work[o];
}
if(Availabletwo[1]>=work[1]&&Availabletwo[2]>=work[2]&&Availabletwo[3]>=work[3])
{
cout<<"该请求可以满足"<<endl;
}
else
cout<<"该请求不可以被满足"<<endl;
break;
}
if(w>26)
{
break;
}
}
if(h<5)
cout<<"无法得到安全序列"<<endl;
return 0;
}
实验数据:
10 5 7
7 5 3
3 2 2
9 0 2
2 2 2
4 3 3
0 1 0
2 0 0
3 0 2
2 1 1
0 0 2