银行家算法的原理及代码实现

本文深入解析银行家算法,介绍其数据结构包括可利用资源向量、最大需求矩阵、分配矩阵和需求矩阵。阐述了银行家算法的资源分配与安全性检查过程,以及安全性算法的执行步骤。通过算法流程图和源代码帮助理解,同时展示了程序运行的初值和结果。
摘要由CSDN通过智能技术生成

银行家算法原理

银行家算法中的数据结构

1)可利用资源向量 Available
是个含有 m 个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果 Available[j]= K,则表示系统中现有 Rj 类资源 K个
2)最大需求矩阵 Max
这是一个 n×m 的矩阵,它定义了系统中 n 个进程中的每一个进程对m类资源的最大需求。如果 Max[i,j]= K,则表示进程i需要Rj类资源的最大数目为 K
3)分配矩阵 Allocation
这也是一个 n × m 的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果 Allocation[i,j]= K,则表示进程i当前已分得Rj类资源的数目为 K
4)需求矩阵 Need
这也是一个 n × m 的矩阵,用以表示每一个进程尚需的各类资源数。如果 Need[i,j]= K,则表示进程 i 还需要 Rj 类资源 K 个,方能完成其任务。
Need[i,j]= Max[i,j]- Allocation[i,j]

银行家算法

设Requesti是进程Pi的请求向量,如果 Requesti[j]= K,表示进程Pi需要 K 个 Rj 类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
(1)如果 Requesti[j]≤ Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布最大值。
(2)如果 Requesti[j]≤ Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi 须等待。
(3)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]= Available[j]- Requesti[j];
Allocation[i,j]= Allocation[i,j]+ Requesti[j];
Need[i,j]= Need[i,j]- Requesti[j];
系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程 Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程 Pi 等待。

安全性算法

1)设置两个向量:
工作向量 Work: 它表示系统可提供给进程继续运行所需的各类资源数目,它含有 m 个元素,在执行安全算法开始时,Work = Available;

工作向量 Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做 Finish[i]= false; 当有足够资源分配给进程时, 再令 Finish[i]= true。

2)从进程集合中找到一个能满足下述条件的进程:
Finish[i]= false;
Need[i,j]≤ Work[j];若找到,执行 (3),否则,执行 (4)

3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]= Work[i]+ Allocation[i,j];
Finish[i]= true;
go to step 2;

4)如果所有进程的Finish[i]= true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态

算法流程图

在这里插入图片描述

源程序及注释

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

#define MAX_I 100//设置最大进程数
#define MAX_J 100//设置最大资源种数

int i;//进程数
int j;//资源种数
//定义结构体:资源和进程
struct Available
{
   
	int j_num;//剩余资源数
	int Work;//系统可提供给进程继续运行所需的各类资源数目
}Ava[MAX_J];

struct IProcess
{
   
	int Max[MAX_J];//最大需求
	int Allocation[MAX_J];//已经分配
	int Need[MAX_J];//剩余需求
	int Requesti[MAX_J];//发出请求
	bool Count;//中间参数,判断命令是否执行
	bool Finish[MAX_J];//判断安全状态
}IPro[MAX_I];

//使结构体参数初始为0或false
void Init1()
{
   
	for (int a = 0; a < MAX_J; a++)
	{
   
		Ava[MAX_J].j_num = Ava[MAX_J].Work = 0;
	}
	for (int a = 0; a < MAX_I; a++)
	{
   
		for (int b = 0; b < MAX_J; b++)
		{
   
			IPro[i].Max[j] = 0;
			IPro[i].Allocation[j] = 0;
			IPro[i].Need[j] = 0;
			IPro[i].Requesti[j] = 0;
			IPro[i].Count = false;
			IPro[i].Finish[j] = false;
		}
	}
}

//从键盘键入数据获得基本矩阵信息
void Init2(int i, int j)
{
   
	cout << "资源种类数为:" << j << endl;
	for (int a = 0; a 
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
银行家算法是避免死锁的一种重要方法,本程序用java编程语言对其进行了实现。 当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。 若是,就可以分出这些资源;否则,该申请暂不予满足。 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值