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

算法介绍:

程序实现:

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

			程序:银行家算法实现
			作者:小单
			时间: 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;

}

程序测试结果如下:

时间: 2024-08-11 01:20:42

操作系统:银行家算法(避免死锁)的相关文章

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

银行家算法避免死锁 要求: 完成程序数据结构的设计,数据的录入. 完成进程需求矩阵的输出,包括最大需求矩阵,尚需资源矩阵,可获得资源显示. 完成某进程请求资源试分配. 完成安全性检查. 1.         试探分配 当进程pi提出资源申请时,系统执行下列步骤: (1)若Request[i][j]≤Need[i][j],转(2): 否则错误返回 (2)若Request[i][j]≤Available[j], 转(3):否则进程等待 (3)试探着把资源分配给进程Pi,则有: Available[j

银行家算法避免死锁

系统安全状态的定义 1.安全状态 在避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性.若此次分配不会导致系统进入不安全状态,则将资源分配给进程:否则,令进程等待. 虽然并非所有的不安全状态都必然会转为死锁状态,但当系统进入不安全状态后,便有可能进而进入死锁状态:反之,只要系统处于安全状态,系统便可避免进入死锁状态. 因此,避免死锁的实质在于:系统在进行资源分配时,如何使系统不进入不安全状态. 利用银行家算法避免死锁 1.银行家算法中的数据结构 (1

操作系统: 银行家算法的分析和代码实现(c++语言)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行. 在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待.为实现银行家算法,系统必须设置若干数据结构. 1)各种资源总数向量resource 是一个含有m个元素的数组,其中

利用银行家算法避免死锁的介绍与举例

一.数据结构 1.多个进程: { P0,P1,P2,P4 } 代表1,2,3,4四个需要临界资源的进程 2.几种资源:{ A, B ,C } 代表A,B,C三种临界资源 3.Max:最大需求矩阵(进程完成执行需要的各资源总量)   Allocation:分配矩阵(某个进程现在已经拥有的各资源量)   Need:需求矩阵(某个进程仍需要的各资源量)   Available:可利用资源向量 (系统保有的供分配的资源量)   其中:Need = Max - Allocation ,很容易理解嘛,仍然需

操作系统—银行家算法

参考http://blog.csdn.net/yaopeng_2005/article/details/6935235 对小鹏_加油的代码进行了部分修改,并加入了自己的文档注释 定义全局变量,以及主函数main 1 #include <iostream> 2 using namespace std; 3 #define MAXPROCESS 50 //最大进程数 4 #define MAXRESOURCE 100 //最大资源数 5 int AVAILABLE[MAXRESOURCE]; //

C语言实现 操作系统 银行家算法

嘿嘿,今晚心血来潮,在宿舍把银行家算法实现了. /************************************************** 银行家算法: 主要的思想是 舍大取小,先满足小的,最后才满足大的. author: lyb date: 2014/10/15 ***************************************************/ #include <stdio.h> #include <stdlib.h> #include <

c/c++多线程模拟系统资源分配(并通过银行家算法避免死锁产生)

#include<iostream> #include<cstdio> #include<vector> #include<ctime> #include<cstring> #include<unistd.h> #include<cstdlib> #define RESTYPE 100 //资源的种类数 #define NTHREAD 50 //线程的数目 using namespace std; pthread_mute

银行家算法实例(转)

在网上找了一篇不可多的的讲银行家算法的例题的博文,mark下来.作者写的还是不错,简单易懂,比单纯讲含义要实用的多. 转自: 木轩琰的博客 最近开始备考计算机四级,基本没有遇到什么问题,感觉计算机四级就是考理解型记忆力,银行家算法的题算是在计算机四级里少有的计算题. 例1.设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量为19.在T0时刻系统的状态如下表:   最大资源需求量 已分配资源量   A,B,C A,B

银行家算法学习笔记

     上周操作系统的实验,就是模拟实现银行家算法,首先我们还是应该对银行家算法熟悉一下. 银行家算法是最具代表性的避免死锁的算法.因为该算法原本是为银行系统设计的,以确保银行在发放现金贷款时,不会发生不满足所有客户需求的情况.在OS中也可它来实现避免死锁. 算法概述: 为实现银行家算法,每一个进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量,当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该进程.若有,再进一步计算在

《操作系统、预防进程死锁的银行家算法》

预防进程死锁的银行家算法 原文:https://blog.csdn.net/houchaoqun_xmu/article/details/55540792 一.概念介绍和案例解析 银行家算法中的数据结构 可利用资源向量Available:   这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变.如果Available[j]=K,则表示系统中现有Rj类资源K个. 最大需求矩阵Max: