标签:
处理死锁的方法:预防死锁,避免死锁,检测死锁,解除死锁
其中,避免死锁的著名算法:Dijkstra的银行家算法。(这是由于该算法能用于银行系统现金贷款的发放而得名的)
要实现该算法,系统中需要设置如下几个数据结构:
1)可利用资源向量Available。Available[j]=K表示系统中j类可用资源有K个。
2)最大需求矩阵Max。Max[i,j]=K表示进程i对j类资源的最大需求个数为K个。
3)已分配资源矩阵Allocation。Allocation[i,j]=K表示已为进程i分配J类资源K个。
4)需求矩阵Need。Need[i,j]=K表示进程i还需要请求j类资源K个。
银行家算法:
Request[i,j]=K表示进程i请求j类资源K个。
1)比较Request[i,j]与Need[i,j],如果Request[i,j]<=Need[i,j],则执行步骤2,否则认为出错,请求的数量超出需求的最大数量。
2)比较Request[i,j]与Available[j],如果Request[i,j]<=Available[j],则执行步骤3,否则进程i需要等待,系统无足够的可用资源。
3)系统尝试为进程i分配请求的j类资源K,
available[j]:=available[j]-request[i,j]
allocation[i,j]:=allocation[i,j]+request[i,j]
need[i,j]:=need[i,j]-request[i,j]
4)调用安全算法,如果检测出此次分配后系统处于安全状态,则正式分配资源,否则将本次试探分配作废,所有数据量还原,放弃本次资源分配。
安全算法:
安全算法用于检测资源分配后,系统是否处于安全状态。
1)设置两个向量:
(1)work,它表示系统可提供给进程各类资源的数目,在执行安全算法开始时,work:=available
(2)finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始执行安全算法时,finish:=false,
当有足够的资源分配给进程时,finish:=true
2)从进程集合中找到满足下列条件的进程:
(1)finish:=false
(2)need<=work
若找到,则执行步骤3,否则执行步骤4。
3)该进程可以被执行完,之后释放其占用的资源,将finish设置为true
work:=work+allocation
finish:=true
go to step 2
4)若所有进程的finish都为true,则认为系统处于安全状态,否则认为此次分配结束后系统将处于不安全状态。
以上就是整个银行家算法的过程。
如有表达不当,敬请指正。
标签:
原文地址:http://www.cnblogs.com/yangsisi99/p/5303082.html