1.实验目的:
银行家算法是由Dijkstra设计的最具有代表性的避免死锁的算法。本实验通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法。
先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
若请求合法,则进行试分配。最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
4.主要数据结构1. 银行家算法bank()函数
Requesti:进程Pi的请求向量。 0<=j<=m-1
(1)若Requesti[j] ≤Need[i,j],转向(2),否则出错。(2)若 Requesti[j] ≤Available[j],转向(3),否则等待。
(3)系统试探着把资源分配给进程Pi,修改下面内容:Available[j]= Available[j] – Requesti[j];
Allocation[i,j]= Allocation[i,j]+ Requesti[j];
Need[i,j]= Need[i,j]–Requesti[j];
(4)试分配后,执行安全性算法,检查此次分配后系统是否处于安全状态。若安全,才正式分配;否则,此次试探性分配作废,进程Pi等待。2. 安全性算法safe()函数
(1)初始化:设置两个向量Work(1×m)和Finish(1×n)
Work– 系统可提供给进程继续运行所需各类资源数,初态赋值AvailableFinish– 系统是否有足够资源分配给进程,初值false.
(2)从进程集合中满足下面条件进程:
Finish[i]= false; Need[i,j]≤Work[j];
若找到,执行(3),否则,执行(4)。
(3)进程Pi获得资源,可顺利执行,完成释放所分配的资源。
Work[j]= Work[j]+Allocation[i,j]; Finish[i] = true; go to (2).
(4)若所有进程Finish[i]= true,表示系统处于安全状态,否则处于不安全状态。
6.程序结构程序共有以下五个部分:
程序:
#include<iostream>
#include<cstring>
#define False 0
#define True 1
using namespace std;
/********
主要数据结构
********/
int N=50;//进程的最大数
int M=100;//资源的最大数
char NAME[100]={0};//资源的名称
int Avaliable[100]={0};//可用资源矩阵
int Max[50][100]={0};//最大需求矩阵
intAllocation[50][100]={0};//系统已分配矩阵
int Need[50][100]={0};//还需要资源矩阵
int Request[100]={0};//请求资源向量
int Security[50]={0};//存放安全序列
int Work[100]={0};//存放系统可提供资源
int Finish[50]={0};
/********
初始化数据:输入进程数量、资源种类、
各种资源可利用数量、
各进程的资源已分配数量、
各进程对资源最大需求量等。