银行家算法的实现
{
for (int i=0;i<S;i++)
{
Available[i]=Available[i]-Request[i];
Allocation[flag][i]=Allocation[flag][i]+Request[i];
Need[flag][i]=Need[flag][i]-Request[i];
for (j=0;j<s;j++)
{
Need[i][j]=Max[i][j]-Allocation[i][j];
}
}
Showdata();
Judgesafe();
return 0;
}
Allocation(i)=Allocation(i)+Request(i)
Need(i)=Need(i)-Request(i)
4)调用安全状态检查算法。
设Work(m)为临时工作向量。初始时Work=Available。令N={1,2,……n}。
寻求j∈N使其满足:Need(j)<=Work,若不存在这样的j则转至3)。
{
cout<<"进程"<<flag<<"申请的资源大于可利用的资源。"<<endl;
cout<<"分配不合理,不予分配!"<<endl;
ch='N';
break;
}
}
if (ch=='Y')
{
Changedata(flag);
if (Judgesafe()==-1)
{
cout<<"进程"<<flag<<"申请资源后,系统进入死锁状态,分配失败!"<<endl;
实验四银行家算法的实现
1、实验目的
通过编写和调试银行家算法的模拟程序以加深对避免死锁方案的理解。熟悉银行家算法的分配思想。
2、实验要求
设计一个银行家方案。并编写模拟程序实现之。已知系统总共的资源数、进程名、进程已分配的资源、进程运行完毕最大最资源的需求量,以书上例题为例,分析某一时刻系统的安全状态,如果安全,输出安全序列。
3、算法描述
银行家算法中数据结构如下:
n:系统中的进程个数;
m:系统中的资源类数。
1)Available(m):现有资源向量。
Available(j)=k表示k个未分配的j类资源
2)Max(n,m):资源最大申请量矩阵。
Max(i,j)=k表示第i个进程在运行过程中对第j类资源的最大申请量为k。
3)Allocation(n,m):资源分配矩阵。
cout<<"\t";
for(j=0;j<3;j++)
{
for (i=0;i<S;i++)
{
cout<<name[i]<<" ";
}
cout<<"\t";
}
cout<<endl;
for(i=0;i<P;i++)
{
cout<<i<<"\t";
for (j=0;j<S;j++)
{
cout<<Max[i][j]<<" ";
}
cout<<"\t";
for (k=0;k<S;k++)
{
cout<<Allocation[i][k]<<" ";
}
cout<<"\t";
for (l=0;l<S;l++)
{
cout<<Need[i][l]<<" ";
}
cout<<endl;
}
cout<<"\nAvailable"<<endl;
for (i=0;i<S;i++)
Avaliable = Avaliable + Request(i)
Allocation(i)=Allocation(i)-Request(i)
Need(i)=Need(i)+ Request(i)
4、源程序代码
#include <iostream>
using namespace std;
#define False 0
int S=100,P=100;
int safequeue[100]={0};
int Request[100]={0};
//
void Showdata()
{
int i,j,k,l;
cout<<"\t资源分配情况\n"<<endl;
cout<<"\tMax"<<"\t已分配"<<"\tNeed"<<endl;
{
cout<<name[i]<<" ";
}
cout<<endl;
for (i=0;i<S;i++)
{
cout<<Available[i]<<" ";
}
cout<<endl;
}
int Judgesafe()
{
int tempwork[100][100]={0};
int i,k=0,m,apply,Finish[100]={0};
int j;
int flag=0;
for (i=0;i<S;i++)
{
Work[i]=Available[i];
}
for(i=0;i<P;i++)
{
apply=0;
for(j=0;j<S;j++)
{
if (Finish[i]==False&&Need[i][j]<=Work[j])
{
apply++;
Work=Work+Allocation(j)N=N-{j}转至1)。
如果N=空集则返回(系统安全)。如果N≠空集则返回(系统不安全)。
5)若系统处于安全状态,则将进程i申请的资源分配给进程i,返回。
6)若系统处于不安全状态,则不将进程i申请的资源分配给进程i,恢复原来的资源分配状态,让进程i等待。
for (int i=0;i<S;i++)
{
Available[i]=Available[i]+Request[i];
Allocation[flag][i]=Allocation[flag][i]-Request[i];
Need[flag][i]=Need[flag][i]+Request[i];
}
}
}
//
void Share()
{
int i,flag;
char ch='Y';
cout<<"输入请求资源的进程:"<<endl;
cin>>flag;
if (flag>=P)
{
cout<<"此进程不存在!"<<endl;
}
else
{
cout<<"输入此进程对各个资源的请求数量:"<<endl;
for (i=0;i<S;i++)
银行家算法思想如下:
若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程:
1)如果Request(i)〉Need(i),则报错返回。
2)如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。
3)假设进程进程i的申请已获批准,于是修改系统状态:
Avaliable=Avaliable-Request(i)
{
cin>>Request[i];
}
for (i=0;i<S;i++)
{
if (Request[i]>Need[flag][i])
{
cout<<"进程"<<flag<<"申请的资源大于它所需要的资源!"<<endl;
cout<<"分配不合理不予分配!"<<endl;
ch='N';
break;
}
else if (Request[i]>Available[i])
}
else
{
}
}
}
}
int main()
{
int i,j,p,s,number;
char tempstring;
cout<<endl;
cout<<"输入资源种类:"<<endl;
cin>>s;
S=s;
cout<<"输入资源的名称和数量:"<<endl;