- 4
- 0
- 约4.76千字
- 约 12页
- 2022-10-17 发布于浙江
- 举报
银行家算法分析与实现
银行家算法
一、初始化
由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED
赋值。
二、银行家算法伪代码
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。
设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。
(1)如果REQUEST [cusneed] [i]= NEED[cusneed][i],则转(2);否则,出错。 (2)如果REQUEST [cusneed] [i]= AVAILABLE[cusneed][i],则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[cusneed][i];
ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];
NEED[cusneed][i]-=REQUEST[cusneed][i]; (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待 三、安全性检查算法伪代码
(1)设置两个工作向量Work=AVAILABLE;FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
GOTO 2
(4)如所有的进程Finish= true,则表示安全;否则系统不安全。
四、各算法的流程图
初始化函数
Init()开始
输入进程的数目m
输入资源的种类n
输入每个进程最大所需的
各资源数
输出提示:输入有输入每个进程已分配的各资源数误,重新输入
true
输入各个资源现有的数目
初始化函数
Init()结束
4.1初始化算法流程图
银行家算法
开始
初始化Init()
提出请求REQUEST[I]
false
REQUEST[i]=NEED[i]Error
true
falseREQUEST[i]=AVAILABLE[i]ErrorAVAILABLE[i] -=REQUEST[i]ALLOCATION[i]+=REQUEST[i]NEED[i]-=REQUEST[i]
false
输出提示:你的Safe()请求被拒
true
AVAILABLE[i] -=REQUEST[i]输出提示:同意分配ALLOCATION[i]+=REQUEST[i]请求NEED[i]-=REQUEST[i]
true
是否再次请求分配
false
结束
4.2银行家算法流程图
安全性算法
safe()开始
Work =AVAILABLE;
FINISH = false;
false
NEED[i]=Work FINISH[i]==false
true
Work =ALLOCATION[i];
FINISH[i] = true;
false输出提示:系
所有进程的FINISH= true;统不安全
true
安全的输出序列
RETURN true
安全性算法
safe()结束
4.3 安全性算法流程图
五、源代码
#include iostream
using namespace std;
#define MAXPROCESS 50 /*最大进程数*/
#define MAXRESOURCE 100 /*最大资源数*/ int AVAILABLE[MAXRESOURCE]; /* 可用资源数组 */ int MAX[MAXPROCESS][MAXRESOURCE]; /* 最大需求矩阵 */ int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /* 分配矩阵 */ int NEED[MAXPROCESS][MAXRESOURCE]; /* 需求矩阵 */ int REQUEST[MAXPROCESS][MAXRESOURCE]; /* 进程需要资源数 */ bool FINISH[MAXPROCESS]; /* 系统是否有足够的资源分配 */ int p[MAXPROCESS]; /* 记录序列 */ int m,n; /* m个进程,n个资源 */
void Init();
bool Safe();
void Bank();
int main()
{
Init();
Safe();
Bank();
getchar();
}
// 给出系统拥有的每种资源数,已经分配给每个进程的资源数
原创力文档

文档评论(0)