实验三:预防进程死锁的银行家算法


一、  需求分析

说明程序设计的任务和目的,明确规定下述内容:

掌握进程资源的分配、死锁的检测和安全序列的生成方法

(1)    输入的形式和输入值的范围;

  输入给定进程的进程编号

  已在程序中预置好进程信息

(2)    输出的形式;

 安全序列

(3)    程序所能达到的功能;

 用银行家算法模拟资源分配

(4)    测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。

依次输入

 进程1 请求资源 1 2 3

 进程3 请求资源 1 0 0

 进程2 请求资源 3 6 9

输出安全序列或提示不安全序列

二、  概要设计

说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。

intAvailable[MaxNumber]; //最初状态的可分配资源

intSAvailable[MaxNumber];  //时时状态的可分配资源

intMax[MaxNumber][MaxNumber]; //Max

intAllocation[MaxNumber][MaxNumber]; //Allocation

intNeed[MaxNumber][MaxNumber]; //Need

int Request[MaxNumber];//Request

intSafeOrder[MaxNumber]; //存放安全序列

boolFinished[MaxNumber]; //存放各进程是否完成

三、  详细设计

实现程序模块的具体算法。

bool bank(int* availabled, intn, intm)

四、  调试分析

调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;

算法虽然在纸上很容易算出,但在编程时需要用二维数组进程操作,经过多次调试后终于成功运行

五、  用户使用说明

程序的使用说明,列出每一步的操作步骤。

运行程序--输入请求进程的编号--输入请求的资源--显示运行结果

六、  测试结果

列出测试结果,包括输入和输出。


七、  附录

带注释的源程序,注释应清楚具体;


#include "stdafx.h"
#include<iostream> 
#include<string>
#include<sstream> 
#include<fstream> 
using namespace std;

const static int MaxNumber = 100;

int Available[MaxNumber]; //最初状态的可分配资源
int SAvailable[MaxNumber];  //时时状态的可分配资源
int Max[MaxNumber][MaxNumber]; //Max 
int Allocation[MaxNumber][MaxNumber]; //Allocation 
int Need[MaxNumber][MaxNumber]; //Need 
int Request[MaxNumber]; //Request 
int SafeOrder[MaxNumber]; //存放安全序列
bool Finished[MaxNumber]; //存放各进程是否完成
void print(int n, int m);
bool compare(int* a, int* b, int n);
bool bank(int* availabled, int n, int m);
static int jd; //帮助判断数据
int _tmain(int argc, _TCHAR* argv[])
{
	cout << "----------预防进程死锁的银行家算法:\n";
	int n, m, i, j, k; //n:进程; m:资源数i,j,k循环累加变量
	//读文件
	ifstream in("test.txt");
	string s;
	for (i = 0; i<4, getline(in, s); i++)
	{
		istringstream sin(s);
		switch (i)
		{
		case 0: sin >> n >> m;
			break;
		case 1: for (j = 0; j<n; j++)
		{
					for (k = 0; k<m; k++)
						sin >> Allocation[j][k];
		}
				break;
		case 2: for (j = 0; j<n; j++)
		{
					for (k = 0; k<m; k++)
						sin >> Need[j][k];
		}
				break;
		case 3: for (j = 0; j<m; j++)
			sin >> Available[j];
			break;
		}
	}
	//初始化Max值
	for (i = 0; i<n; i++)
	{
		for (j = 0; j<m; j++)
		{
			Max[i][j] = Allocation[i][j] + Need[i][j];
		}
	}
	print(n, m); //资源未请求时,输出各资源情况
	//初始化SAvailable值
	for (i = 0; i<m; i++)
		SAvailable[i] = Available[i];
	if (bank(SAvailable, n, m))
	{
		int number;
		while (true)
		{
			cout << "请输入申请资源的进程号:";
			cin >> number;
			if (number<0)
				break;
			cout << "请输入请求的各资源数::";
			for (int j = 0; j<m; j++)
			{
				//资源请求后,改变相应影响到的SAvailable、Need、Allocation值
				cin >> Request[j];
				
				Available[j] -= Request[j];
				Need[number][j] -= Request[j];
				Allocation[number][j] += Request[j];
			}
			
			//资源请求后,输出各资源情况
			//SAllocation重新赋值
			for (i = 0; i<m; i++)
				SAvailable[i] = Available[i];
			cout << "正在处理..." << endl;
			bank(SAvailable, n, m); //n:进程; m:资源数
			if (jd == 0)
			{
				for (int j = 0; j<m; j++)
				{
					//资源请求后,改变相应影响到的SAvailable、Need、Allocation值
					Available[j] += Request[j];
					Need[number][j] += Request[j];
					Allocation[number][j] += Request[j];
				}
			}
		}
	}
}
bool bank(int* availabled, int n, int m)
{ //数组available存放可分配资源
	int L = 0, i;  //L为已完成的进程数量
	for (i = 0; i<n; i++)
		Finished[i] = false; //初始化全部进程都未完成
	for (i = 0; i<n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (Finished[j] == false && compare(availabled, Need[j], m))
			{ //进程未完成且可分配资源满足该进程需求
				for (int k = 0; k<m; k++)
					availabled[k] += Allocation[j][k];
				Finished[j] = true;
				SafeOrder[L] = j;
				L++;
				break;
			}
		}
		
	}
	if (L == n)
	{
		jd = 1;
		cout << "安全序列:";
		for (int s = 0; s<n; s++) //输出安全序列
			cout << "P" << SafeOrder[s] << " ";
		cout << endl;
		return true;
	}

	else
	{
		jd = 0;
		cout << "不安全序列!" << endl;
		return false;
	}
}
bool compare(int* a, int* b, int n)
{ //比较数组a和数组b中的各个元素的大小,
	//a都大于b,则输出true;如果a中有一个小于b,立即输出false
	for (int i = 0; i<n; i++)
	if (a[i]<b[i])
	{
		return false;
	}
	return true;
}
void print(int n, int m)
{ //打印各类值
	int i, j;
	cout << "              " << "Max" << "   " << "Allocation" << "  " << "Need" << "   " << "Available" << endl;
	for (i = 0; i<n; i++)
	{
		cout << " " << "P" << i << "        ";
		for (j = 0; j<m; j++)
		{
			cout << Max[i][j] << "  ";
		}
		cout << "  ";
		for (j = 0; j<m; j++)
		{
			cout << Allocation[i][j] << " ";
		}
		cout << "  ";
		for (j = 0; j<m; j++)
		{
			cout << Need[i][j] << "  ";
		}
		if (i == 0)
		{
			cout << " ";
			for (j = 0; j<m; j++)
				cout << Available[j] << "  ";
		}
		cout << endl;
	}
}







  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值