操作系统:银行家算法(避免死锁)

算法介绍:

技术分享技术分享技术分享

程序实现:

/*****************************************************

			程序:银行家算法实现
			作者:小单
			时间: 2013年11月5日

******************************************************/
#include <iostream>
#include <string>
using namespace std;

#define MAXPROCESS  50  //所能执行的进程最大数
#define MAXRESOURCE 50  //资源最大数

//银行家算法中的数据结构
int Available[MAXRESOURCE];  //可用资源向量
int Max[MAXPROCESS][MAXRESOURCE];   //最大需求矩阵
int Allocation[MAXPROCESS][MAXRESOURCE];  //分配矩阵
int Need[MAXPROCESS][MAXRESOURCE];   //需求矩阵
int Request[MAXPROCESS][MAXRESOURCE];  //请求向量

//安全性算法中的数据结构
int Work[MAXRESOURCE];    //工作向量
bool Finish[MAXPROCESS];    //表示是否有足够的资源分配给进程
int SafeSeries[MAXPROCESS];  //安全序列

////////////////////////////////////////////////////
int n;  //当前系统中的进程数
int m;   //当前系统中的资源数



//////////////////////////////////////////////////////////
//算法初始化
void InitAlgorithm()
{
	cout << "请输入系统所要运行的进程总数:";
	cin >> n;
	cout << "请输入系统中分配的资源种类数:";
	cin >> m;
	int i,j;

	//可利用资源向量的初始化
	cout << "请分别输入" << m << "类资源的当前可利用资源数目:";
	for( i = 0; i < m; ++i )
	{
		cin >> Available[i];
	}

	//最大需求矩阵的初始化
	cout << "请输入各进程对各资源的最大需求矩阵(按"
		<< n << "*" << m << "矩阵格式输入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Max[i][j];
		}
	}

	//分配矩阵的初始化
	cout << "请输入分配矩阵(按"
		<< n << "*" << m << "矩阵格式输入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Allocation[i][j];
		}
	}

	//需求矩阵的初始化
	cout << "请输入此刻的需求矩阵(按"
	<< n << "*" << m << "矩阵格式输入):" << endl;
	for( i = 0; i < n; ++i )
	{
		for( j = 0; j < m; ++j )
		{
			cin >> Need[i][j];
		}
	}

}

//输出资源分配情况
void PrintSrcAlloc()
{
	int i,j;
	for( i = 0; i < n; ++i )
	{
		cout << "进程P" << i << "的总体分配情况:" << endl;
		cout << "\tMax: ";
		for( j = 0; j < m; ++j )
		{
			cout << Max[i][j] << " ";
		}
		cout << endl;

		cout << "\tAllocation:";
		for( j = 0; j < m; ++j )
		{
			cout << Allocation[i][j] << " ";
		}
		cout << endl;

		cout << "\tNeed:";
		for( j = 0; j < m; ++j )
		{
			cout << Need[i][j] << " ";
		}
		cout << endl;
		cout << endl;
	}

	cout << "可利用资源情况:";
	for( i = 0; i < m; ++i )
	{
		cout << Available[i] << " ";
	}
	cout << endl;
	cout << endl;

}

//输出此时进程iProcess利用安全性算法的分析情况
void PrintSafeSeries( int iProcess )
{
	int j;
	cout << "进程P" << iProcess << "的安全性分析情况:" << endl;
	cout << "\tWork: ";
	for( j = 0; j < m; ++j )
	{
		cout << Work[j] << " ";
	}
	cout << endl;
	
	cout << "\tNeed:";
	for( j = 0; j < m; ++j )
	{
		cout << Need[iProcess][j] << " ";
	}
	cout << endl;
	
	cout << "\tAllocation:";
	for( j = 0; j < m; ++j )
	{
		cout << Allocation[iProcess][j] << " ";
	}
	cout << endl;
	
	cout << "\tWork + Allocation:";
	for( j = 0; j < m; ++j )
	{
		cout << Work[j] + Allocation[iProcess][j] << " ";
	}
	cout << endl;

	cout << "Finish[" << iProcess << "] = " << Finish[iProcess] << endl;
	cout << endl;


}

//判断是否存在安全序列
bool IsSafe()
{
	int i;
	for( i = 0; i < n; ++i )
	{
		if( !Finish[i] )
			return false;  //不存在安全序列
	}
	return true;//存在安全序列
}

//界面
void Menu()
{
	cout << "\t\t ==========================================="  << endl;
	cout << "\t\t|                                           |" << endl;
	cout << "\t\t|         程序:银行家算法的模拟实现        |" << endl;
	cout << "\t\t|         作者:小单                        |" << endl;
	cout << "\t\t|         时间:2013.11.5                   |" << endl;
	cout << "\t\t|                                           |" << endl;
	cout << "\t\t ==========================================="  << endl;
}


//选出满足条件的进程
//函数返回进程编号
//若不存在满足条件的,则返回false,否则返回true
bool SelectProcess( int &iProcNum )
{
	iProcNum = -1;
	int i, j;
	for( i = 0; i < n; ++i )
	{
  		if ( Finish[i] )  //Finish[i] != false
		{
			continue;
		}
		for ( j = 0; j < m; ++j )
		{
			if ( Need[i][j] > Work[j] )
			{
				break;
			}
		}
		if ( j == m )  //满足条件
		{
			iProcNum = i;
			return true;  
		}
	}
	return false;
}

//安全性算法
bool SafeAlgorithm()
{
	int i,j;

	//初始化Finish向量
	for( i = 0; i < n; ++i )
	{
		Finish[i] = false;
	}

	//初始化工作向量
	for ( j = 0; j < m; ++j )
	{
		Work[j] = Available[j];
	}

	int iProcNum;
	//选择满足条件的进程
	i = 0;
	while( SelectProcess( iProcNum) )
	{
		Finish[iProcNum] = true;
		PrintSafeSeries( iProcNum );  //输出此时利用安全性算法的分析情况
		int k;
		for ( k = 0; k < m; ++k )
		{
			Work[k] += Allocation[iProcNum][k];
		}
		SafeSeries[i++] = iProcNum;  //进程号加入安全序列数组

		
	}

	if( IsSafe() )
	{
		return true;  //存在一个安全序列
	}

	return false;  //不存在一个安全序列

}


//银行家算法
void BankAlgorithm()
{
	int i,j;
	cout << "请输入请求分配的进程号(0 - " << n-1 << "): ";
	cin >> i;
	cout << "请依次输入进程P" << i << "对" << m << "类资源的请求分配量: ";
	for( j = 0; j < m; ++j )
	{
		cin >> Request[i][j];
	}

	//步骤一
	for( j = 0; j < m; ++j )
	{
		if( Request[i][j] > Need[i][j] )
		{
			cout << "请求的资源已超过该资源宣布的最大值,请求资源失败!!" << endl;
			return;
		}
	}

	//步骤二
	for( j = 0; j < m; ++j )
	{
		if( Request[i][j] > Available[j] )
		{
			cout << "没有足够的资源,请求资源失败!!" << endl;
			return;
		}
	}

	//步骤三
	//系统试探着把资源分配给进程Pi,并修改相应的数值
	for ( j = 0; j < m; ++j )
	{
		Available[j] -= Request[i][j];
		Allocation[i][j] += Request[i][j];
		Need[i][j] -= Request[i][j];
	}

	//步骤四
	//系统执行安全性算法
	if ( !SafeAlgorithm() ) //检测到不安全,则恢复原来的状态
	{
		for ( j = 0; j < m; ++j )
		{
			Available[j] += Request[i][j];
			Allocation[i][j] -= Request[i][j];
			Need[i][j] += Request[i][j];
		}	
	}

}



int main()
{
	Menu();
	InitAlgorithm();
	PrintSrcAlloc();  //打印当前资源情况
	system("pause");
	SafeAlgorithm();
	while(1)
	{
		string flag;
		if( IsSafe() )
		{
			//存在安全序列
			cout << "恭喜!!资源分配成功!!" << endl;
			int i;
			cout << "此时刻存在的一个安全序列为:";
			for ( i = 0; i < n - 1; ++i )
			{
				cout << "P" << SafeSeries[i] << "-->";
			}
			cout << "P" << SafeSeries[i] << endl;
			cout << "继续操作吗?[Y/N]:";
			cin >> flag;
		}
		else
		{
			cout << "资源分配失败!!" << endl;
			cout << "继续操作吗?[Y/N]:";
			cin >> flag;
		}

		if ( flag == "Y" || flag == "y" )
		{
			;
		}
		else
		{
			break;
		}
		BankAlgorithm(); //执行银行家算法

	}


	return 0;

}

程序测试结果如下:

技术分享技术分享技术分享技术分享技术分享技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。