操作系统实验 银行家算法 避免死锁

银行家算法(避免死锁算法)

1.算法描述

银行家算法中数据结构如下:
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):资源分配矩阵。

Allocation(i,j)=k表示进程i已占有k个j类资源。

  • 4)Need(n,m):进程以后还需要的资源矩阵。

Need(i,j)=k表示进程i以后还需要k个第j类资源。
显然有Need[i,j]=Max[i,j]-Allocation[i,j]。

  • 5)Request(n,m):进程申请资源矩阵。

Request(i,j)=k表示进程i申请k个第j类资源。

2.银行家算法思想如下:

若进程i申请资源,申请资源向量为Request(i),则有如下资源分配过程:

1)	如果Request(i)〉Need(i),则报错返回。
2)	如果Request(i)〉Avaliable,则进程i进入等待资源状态,返回。
3)	假设进程进程i的申请已获批准,于是尝试修改系统状态:
Avaliable=Avaliable-Request(i)
Allocation(i)=Allocation(i)+Request(i)
Need(i)=Need(i)-Request(i)
4)	调用安全状态检查算法。
设Work(m)为临时工作向量。初始时Work=Available。令N={1,2,……n}(N即表示进程未执行完的个数)。
A)	寻求j∈N 使其满足:Need(j)<=Work,若不存在这样的j则转至3)步。
B)	程序执行后释放资源:work=Work+Allocation(j)  N=N-{j},转至1)步,循环该进程集合)。
C)	如果N=空集 则返回(系统安全,即书本上的所有进程的Finish[i] = true都满足)。
如果N≠空集 则返回(系统不安全)。
5)	若系统处于安全状态,则将进程i申请的资源分配给进程i,返回。
6)	若系统处于不安全状态,则不将进程i申请的资源分配给进程i,恢复原来的资源分配状态,让进程i等待。
Avaliable = Avaliable + Request(i)
Allocation(i)=Allocation(i)-Request(i)
Need(i)=Need(i)+ Request(i)
程序源代码
#include <iostream>
using namespace std;
#define False 0
#define True 1

int Max[100][100]={0};
int Allocation[100][100]={0};
int Need[100][100]={0};
int Available[100]={0};
int Work[100]={0};
char name[100]={0};
int temp[100]={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<<"\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++)
	{
		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++;
				if(apply==S)
				{
					for(m=0;m<S;m++)
					{
						tempwork[i][m]=Work[m];
						Work[m]=Work[m]+Allocation[i][m];
					}
					Finish[i]=True;
					temp[k]=i;
					i=-1; 
					k++;
					flag++;
				}
			}
		}
	}
	for(i=0;i<P;i++)
	{
		if(Finish[i]==False)
		{
			cout<<"系统不安全"<<endl;
			return -1;
		}
	}
    cout<<"系统是安全的"<<endl;
    cout<<"分配的序列:";
	for(i=0;i<P;i++)
	{
		cout<<temp[i];
		if(i<P-1) cout<<"->";
	}
	cout<<endl;
    return 0;
}

void Changedata(int flag)
{
	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++)
		{
			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])
			{
				cout<<"进程"<<flag<<"申请的资源大于可利用的资源。"<<endl;
				cout<<"分配不合理,不予分配!"<<endl;
				ch='N';
				break;
			}
		}
		if (ch=='Y')
		{
			Changedata(flag);
			if (Judgesafe()==-1)
			{
				cout<<"进程"<<flag<<"申请资源后,系统进入死锁状态,分配失败!"<<endl;
				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];
				}
			}
			//o
		}
	}
}

int main()
{
	int i,j,p,s,number;
	char tempstring;
    cout<<endl;
    cout<<"输入资源种类:"<<endl;
	cin>>s;
	S=s;
	cout<<"输入资源的名称和数量:"<<endl;
	for(i=0;i<s;i++)
	{
		cin>>tempstring>>number;
		name[i]=tempstring;
		Available[i]=number;
	}
	cout<<"输入进程的数量:"<<endl;
	cin>>p;
	P=p;
	cout<<"输入各进程资源最大需求量:"<<endl;
	for (i=0;i<p;i++)
	{
		for (j=0;j<s;j++)
		{
			cin>>Max[i][j];
		}
	}
	cout<<"输入各进程资源已分配量:"<<endl;
	for (i=0;i<p;i++)
	{
		for (j=0;j<s;j++)
		{
			cin>>Allocation[i][j];
			Available[j]=Available[j]-Allocation[i][j];
		}
	}
	for (i=0;i<p;i++)
	{
		for (j=0;j<s;j++)
		{
			Need[i][j]=Max[i][j]-Allocation[i][j];
		}
	}
	Share();
	Showdata();
	Judgesafe();	
	return 0;
}


运行截图:
操作系统实验四

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值