银行家算法的一个简单实例

/*因为是早期写的程序,代码风格都不好,比如main函数应该保持短小精悍。那么那时爱X就没做到,呵呵。*/ 
/*银行家算法 */
#include<iostream.h>
#define FALSE 0
#define TRUE 1
#define n 3             //n个进程
#define m 3              //m类资源

typedef struct 
{
	int Available[m];      //可利用资源向量Available
	int Max[n][m];         //最大需求矩阵Max
	int Allocation[n][m];  //进程i当前已分得Rj类资源的数目
	int Need[n][m];        //需求矩阵Need,进程尚需的各类资源数
	int Request[n][m];     //进程的请求向量
}Process;
typedef struct 
{
	int Work[m];          //系统可提供给进程继续运行所需的各类资源数
	int Finish[n];       //进程完成标志
}Safe;
bool SafeAlgorithm(Safe newSafe,Process newProcess);     //安全性算法
bool SafeAlgorithm(Safe newSafe,Process newProcess)
{
	int successfulNumber=0;            //用来记录成功的进程总数
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
		{
            if(newSafe.Finish[i]==FALSE && newProcess.Need[i][j]<=newSafe.Work[j])
			{
				newSafe.Work[j]=newSafe.Work[j]+newProcess.Allocation[i][j];
				newSafe.Finish[i]=TRUE;
			}

		}

	for(int k=0;k<n;k++)
	{
		if(newSafe.Finish[k]==TRUE)
			successfulNumber++;
	}
	if(successfulNumber==n)
	{
		cout<<"系统安全!"<<endl<<endl;
		return TRUE;                     //系统安全
	}
	else 
	{
		cout<<"系统不安全!"<<endl<<endl;
		return FALSE;                    //系统不安全
	}
	//return TRUE;
}
int main()
{

	Process newProcess;
	Safe newSafe;
	//下面是一系列的初始化,首先对进程阶段初始化
    int i,j;
    for(i=0;i<m;i++)
	{
		cout<<"请输入第"<<i+1<<"类资源数。"<<endl;
		cin>>newProcess.Available[i];
	}
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		{
			cout<<"请输入第"<<i+1<<"个进程"<<"需要"<<j+1<<"类资源的最大数。"<<endl;
			cin>>newProcess.Max[i][j];   
			//cout<<"第"<<i+1<<"个进程对第"<<j+1<<"类资源需求数输入成功"<<endl;
			cout<<endl;
			newProcess.Allocation[i][j]=0;                   //初始情况下,当前进程i分得资源j的资源数全为0
			newProcess.Need[i][j]=newProcess.Max[i][j];          //初始情况下,当前进程i还需要的资源j的数目为输入的值
			cout<<"请输入第"<<i+1<<"个进程"<<"申请第"<<j+1<<"类资源的数量"<<endl;
			cin>>newProcess.Request[i][j];
		}
    //下面进行Safe的初始化工作
	for(i=0;i<m;i++)
	{
		newSafe.Work[i]=newProcess.Available[i];
		newSafe.Finish[i]=FALSE;
	}

    //====================此时,初始化工作全部结束。=========================
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
            if(newProcess.Request[i][j]<=newProcess.Need[i][j])
			{
				if(newProcess.Request[i][j]<=newProcess.Available[j])
				{
                    newProcess.Available[j]=newProcess.Available[j]-newProcess.Request[i][j];
                    newProcess.Allocation[i][j]=newProcess.Allocation[i][j]+newProcess.Request[i][j];
					newProcess.Need[i][j]=newProcess.Need[i][j]-newProcess.Request[i][j];
					bool result=SafeAlgorithm(newSafe,newProcess);         //系统执行安全性算法
					if(result=TRUE)
					{
						cout<<"进程P"<<i+1<<"分配第"<<j+1<<"种资源成功!"<<endl<<endl;
						
					}
					else
					{
						cout<<"由于系统不安全,分配失败!"<<endl<<endl;	
					}
					//恢复原先的资源分配状态
                    newProcess.Available[j]=newProcess.Available[j]+newProcess.Request[i][j];
                    newProcess.Allocation[i][j]=newProcess.Allocation[i][j]-newProcess.Request[i][j];
					newProcess.Need[i][j]=newProcess.Need[i][j]+newProcess.Request[i][j];
				}
				else 
				{
					cout<<"尚无足够资源,进程P"<<i+1<<"需要等待"<<endl;
					break;                        //该进程等待,下一个进程运行
				}
			}
			else 
			{
				cout<<"进程P"<<i+1<<"申请第"<<j+1<<"种资源过多,出错!"<<endl<<endl;
				break;                            //一旦资源分配失败,该进程等待,下一个进程运行
			}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值