模拟内容
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
设计一个N(如N=5)个并发进程共享M(如M=3)种类不同资源的系统,给定各类资源的初始数目,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
设计银行家算法,实现资源分配程序,应能打印输出各进程依次要求申请的资源数和依次分配资源情况、每次申请是否为安全状态、安全状态下安全序列的情况等。
运行时,模拟出各种情况,输出各个数据结构的具体数值。
模拟思路
1、设计数据结构
为实现银行家算法,系统必须设置若干数据结构:如Available、Max、Allocation、Need、Work、Finish。这些数据结构记录了相关的信息。
2、分析银行家算法步骤
设进程Pi(i=1,…,N)提出请求Requesti,则银行家算法按如下规则进行判断。
(1)如果Requesti<=NEEDi,则转(2);否则,提示出错。
(2)如果Requesti<=Available,则转(3);否则,提示出错。
(3)系统试探分配资源,修改相关数据:
Available = Available -Requesti
Allocationi = Allocationi +Requesti
Needi = Needi -Requesti
(4)系统执行安全性检查(调用安全性算法),如是安全状态,则分配成立;否则试探性分配作废,系统恢复原状,进程Pi的此次请求不予满足。
3、安全性算法
(1)初始时,Work:=Available;Finish[i]=false;
(2)从进程集合中找到一个能满足下述条件的进程;
①Finish[i]=false;
②Needi≤Work;若找到,执行步骤(2),否则,执行步骤(3)
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work:=Work+Allocationi;
Finish[i]:=true;
go to step (2);
(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态,输出安全序列;否则,系统处于不安全状态。
实现方法
使用数组存放Available、Max、Allocation、Need、Work、Finish等信息。采用线程的sleep函数让线程在指定位置挂起一定的时间减缓数据变化的速度来一行一行的动态演示每个进程申请资源、释放资源的过程。
编程实现
初始化一些全局变量如Available、Max、Allocation、Need、Work、Finish等。
static int[] available = new int[3] {
3, 3, 2 }; //资源数
static int[,] max = new int[5, 3]{
{
7,5,3},{
3,2,2},{
9,0,2},{
2,2,2},{
4,3,3}}; //最大资源需求
static int[,] allocation = new int[5, 3]{
{
0,1,0},{
2,0,0},{
3,0,2},{
2,1,1},{
0,