【梳理】简明操作系统原理:银行家算法(内附文档高清截图)

银行家算法
W. Dijkstra的银行家算法是一种避免死锁的算法。命名原因是该算法原本为银行设计,确保银行发放贷款时,不会发生不能满足全部客户的需求的情况。
1、银行家算法需要的数据结构
设1个CPU核心上有:
s个进程。进程向量
P ⃗=(p,p_2,…,p_s)
t种空闲资源。空闲资源向量
F ⃗=(f_1,f_2,…,f_t)
最大需求矩阵
M =(m_i ,j )(s×t)
m_i ,_j表示:第i个进程p_i在运行过程中需要j种资源的最大数量。
分配矩阵
A=(a_i ,j )(s×t)
a_i ,_j表示:进程p_i已经分配到资源j的数量。
需求矩阵
N=(n_i ,j )(s×t)
n_i ,_j表示:进程p_i在对资源j的需求最大的时刻,仍然需要分配的资源j的数量。
不难看出
∀i∈{1,…,s}, j∈{1,…,t}, n_i ,_j=m_i ,_j-a_i ,_j
2、银行家算法的步骤
设现在开始向进程p_i尝试分配需要的资源。进程p_i需要的每种资源的数量用请求向量R_i=(r_i ,_1,〖 r〗_i ,_2,…, r_i ,_t)表示。
银行家算法的步骤是:
【1】如果r_i ,_j≤n_i ,_j,则跳至【2】;否则报错,因为进程p_i需要的资源用量超过原先已知的最大值。
【2】如果r_i ,_j≤a_i ,_j,则跳至【3】;否则,当前可用资源不足,进程p_i需要等待,或尝试为另一个进程分配资源。
【3】系统开始尝试将资源分配给进程p_i。先修改如下的值:
F ⃗_j-=r_i ,_j
a_i ,_j+=r_i ,_j
n_i ,_j-=r_i ,_j
注:因为要模拟满足该进程的请求后,该进程及其它进程剩余的资源获取请求是否依然能满足,所以上述三条表达式中的第1、第3条是必须的;第2条可以移到【4】中执行,但安全性算法中也需要相应修改。
【4】执行安全性算法。若安全,则正式将资源分配给进程p_i(即:在完成【3】的基础上继续);否则,撤销【3】(即尝试分配作废,进程p_i继续等待)。
3、安全性算法
【1】设:工作向量
W ⃗=F ⃗
其长度为t,用于模拟资源分配后各个资源剩余的数量。
完成向量
C ⃗=(0, 0,…, 0)
其长度为s,用于在模拟中标记一个进程在资源需求最高时是否仍能顺利获得所需资源并完成。进程未完成和完成分别标记0和1。
【2】在s个进程中,任选一个进程p_i能满足
c_i=0
n_i ,_j≤w_i ,_j
若找到,跳至【3】;否则,跳至【4】。
【3】找到了【2】中所描述的进程,意味着剩余资源数量可以满足该进程的最大需求,并供该进程运行至完成。该进程在完成后释放它占有的全部资源:
w_j+=a_i ,_j
c_i=1
【4】如果s个进程全部完毕,即C ⃗的每一项均为1,则系统处于安全状态;否则,系统处于不安全状态。
系统处于安全状态,意味着存在一个序列
{〖P_k〗_1,…,〖P_k〗_s }, k_1,…,k_s 是1,2,……,s的一个全排列
使得:按照该顺序为s个进程分配所需资源,且每个进程都在上一个进程结束后才继续,则能够保证所有进程都可以顺利结束,不会产生死锁。

银行家算法并不是普适性的算法。它只在少数领域有用,例如只运行特定任务、对每个运行任务的行为都知根知底的一些嵌入式系统。总之,死锁一般是不可完全避免的。各种预防、避免死锁的方法都有其弊端。具体采用哪些方案,应当结合操作系统面对的应用环境来决定。
【梳理】简明操作系统原理:银行家算法(内附文档高清截图)_第1张图片【梳理】简明操作系统原理:银行家算法(内附文档高清截图)_第2张图片【梳理】简明操作系统原理:银行家算法(内附文档高清截图)_第3张图片【梳理】简明操作系统原理:银行家算法(内附文档高清截图)_第4张图片在这里插入图片描述

你可能感兴趣的:(专业课,#,操作系统原理)