参考文献:http://www.docin.com/p-1491046367.html
银行家算法安全性序列分析
摘要:在操作系统的处理机调度的过程中,由于竞争资源或者进程间推进顺序非法,都会导致死锁的发生。本文主要研究如何利用银行家算法可以避免死锁,并分析银行家算法安全性序列。
关键词:银行家算法;安全性序列;避免死锁
引言
处理死锁的方法主要包括预防死锁、避免死锁、检测死锁和解除死锁。而利用银行家算法可以避免死锁,在这一避免死锁的过程中,银行家算法安全性序列分析是尤为重要的。
1. 银行家算法中的数据结构
假定系统中有n个进程(P1,P2,P3,…Pn),m类资源(R1,R2,…Rm),
(1) 空闲资源向量Available。这是包括m个元素的一维数组,如果Available[j]=K,表示第j类资源的现有空闲数量为K。随该类资源的分配和回收,其数值发生动态地改变。
(2) 最大需求矩阵Max。Max矩阵是n×m维的,Max[i][j]的值表示第i个进程对第j类资源的最大需求。
(3) 分配矩阵Allocation。Allocation矩阵是n×m维的,该矩阵定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i][j]=K,表示,第i个进程当前拥有的第j类资源个数为K。
(4) 需求矩阵Need。Need矩阵是n×m维的,该矩阵定义了所有进程仍然需求的各类资源数。如果Need[i][j]=K,那么,为了能够完成其任务,进程i还需要Rj类资源K个。Need[i]表示矩阵的第i行,是进程i的需求资源向量。
Need[i][j]=Max[i][j]-Allocation[i][j]
2. 银行家算法的描述如下
设Requesti向量,Requesti表示第i个进程向系统提出一次申请,申请的各类资源的数量就应该是该向量的各个分量。
当进程Pi发出资源请求后,系统按下述步骤进行检查:
注意:向量比较大小,是向量所有分量与对应的位置比较大小,加减法同理。
(1) 如果Requesti≤Need[i],便转向步骤2;否则认为出错,因为进程Pi申请的资源数不应该大于它的需求数。(检查是否申请过多)
(2) 如果Requesti≤Available,便转向步骤(3);否则, 表示尚无足够资源,Pi须等待。(检查是否足够给资源申请者)
(3)对Pi进程所请求的资源进行预分配,修改一下向量:
Available=Available-Requesti;
Allocation[i]=Allocation[i]+Requesti;
Need[i]=Need[i]-Requesti;
(4) 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。如果安全,就正式将资源分配给进程Pi,从而实现本次分配;反之,取消这次的试探分配,保持上一次的资源分配状态,让进程Pi等待。
3. 安全性算法
(1) 设置两个向量:① 长度为m的一维工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数量的多少,在执行安全算法开始时,Work=Available;②长度为n的一维数组Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]∶=false;当有足够资源分配给进程时, 再令Finish[i]∶=true。
(2) 从进程集合中找到一个能满足下述条件的进程:
① Finish[i]=false;
② Need[i]≤Work; (可分配资源,每类资源都能满足当前进程的最大需求)
如果找到,那么,执行步骤(3), 否则,执行步骤(4)。(不能满足要求则看现有的资源能不能满足其他进行的需求)
(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation[i];
Finish[i]=true;
go to step 2;
(4) 如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。
4. 银行家算法安全性序列分析之例
假定系统中有4个进程{P1, P2, P3, P4}和三类资源{A, B, C},各种资源的数量分别为9、3、6,在T0时刻的资源分配情况如表1 所示。
表1 T0时刻的资源分配表
资源情况 进程 | Max | Allocation | Need | Available |
A B C | A B C | A B C | A B C | |
P1 | 3 2 2 | 1 0 0 | 2 2 2 |
1 1 2 |
P2 | 6 1 3 | 5 1 1 | 1 0 2 | |
P3 | 3 1 4 | 2 1 1 | 1 0 3 | |
P4 | 4 2 2 | 0 0 2 | 4 2 0 |
(1)T0时刻的安全性:
表格2来源解析:Work=Available={1,1,2},满足Need[i]≤Work的进程为P2,则先满足P2的资源申请。等P2执行完,Finish[i]=true;释放占有的资源,则Work=Work+Allocation[i];此时的Work为{6,3,2};同理为其他为结束的进程分配资源。
表2 T0时刻的安全序列
资源情况 进程 | Work | Need | Allocation | Work+Allocation | Finish |
A B C | A B C | A B C | A B C | ||
P2 | 1 1 2 | 1 0 2 | 5 1 1 | 6 2 3 | TRUE |
P1 | 6 2 3 | 2 2 2 | 1 0 0 | 7 2 3 | TRUE |
P3 | 7 2 3 | 1 0 3 | 2 1 1 | 9 3 4 | TRUE |
P4 | 9 3 4 | 4 2 0 | 0 0 2 | 9 3 6 | TRUE |
(2)P2请求资源Request2(1,0,1)系统根据银行家算法进行检查,执行如下操作:(对比表1中的数据)。
① Request2(1, 0, 1)≤Need2(1, 0, 2)
② Request2(1, 0, 1)≤Available(1, 1, 2)
③ 系统先假定可为P2分配资源,并修改Available, Allocation2和Need2向量,由此形成的资源变化情况如表2所示。
表2 系统先假定可为P2分配资源时刻的资源分配表
资源情况 进程 | Max | Allocation | Need | Available |
A B C | A B C | A B C | A B C | |
P1 | 3 2 2 | 1 0 0 | 2 2 2 | 0 1 1 |
P2 | 6 1 3 | 6 1 2 | 0 0 1 | |
P3 | 3 1 4 | 2 1 1 | 1 0 3 | |
P4 | 4 2 2 | 0 0 2 | 4 2 0 |
④ 再利用安全性算法检查此时系统是否安全。可见安全性分析结果见表3,有结果可知,可以找到一个安全序列{P2,P1,P3,P4},因此系统是安全的,可以将资源分配给P2.
表3 P2申请资源时的安全性检查
资源情况 进程 | Work | Need | Allocation | Work+Allocation | Finish |
A B C | A B C | A B C | A B C | ||
P2 | 0 1 1 | 0 0 1 | 6 1 2 | 6 2 3 | TRUE |
P1 | 6 2 3 | 2 2 2 | 1 0 0 | 7 2 3 | TRUE |
P3 | 7 2 3 | 1 0 3 | 2 1 1 | 9 3 4 | TRUE |
P4 | 9 3 4 | 4 2 0 | 0 0 2 | 9 3 6 | TRUE |