银行家算法和安全性算法笔记

简介

首先银行家算法属于避免死锁的一个著名算法,由Dijkstra在1965年为T.H.E系统设计的一种避免死锁产生的算法。这是由于该算法用于银行系统现金贷款的发放而得名。

基本思想

允许进程动态地申请资源,在资源分配之前,通过相应的算法确定本次资源分配后系统是否安全(不会产生死锁),若是,则进行分配,否则,让进程处于等待状态

重要概念

安全状态

某时刻,对于并发执行的n个进程,若系统能够按照某种顺序如{p1,p2…pn}来为每个进程分配所需资源,直至最大需求,从而使每个进程都可顺利完成,则认为该时刻系统处于安全状态,这样的序列为安全序列

安全状态例子
P1、P2和P3三个进程和12台磁带机,T0时刻可用资源为3:

进程最大需求已分配尚需
P11055
P2422
P1927

那么此刻如果以{P2,P1,P3} 的顺序来执行,就可以顺利运行(系统就可以救活)
执行的过程如下表:

进程空闲资源
P25
P110
P312

如果在T0 状态不按安全序列进行分配,可能会导致系统进入一个不安全状态,例如在T0状态下P3中申请1台磁带机。

银行家算法思想简框图

Created with Raphaël 2.2.0 开始 资源请求合法性检查 进行尝试性的资源分配 分配安全吗? 结束 撤销本次资源分配 不合法性处理 yes no yes no

银行家算法的数据结构

可用资源向量 Available[m]

m为系统中资源种类数,Available[j]=k表示系统中第j类资源数为k个。

最大需求矩阵 Max[n,m]

n为系统中进程数,Max[i,j]=k表示进程i对j类资源的最大需求数为中k。

分配矩阵 Allocation[n,m]

它定义了系统中每一类资源当前已分配给每一进程资源数, Allocation[i,j] = k表示进程i已分得j类资源的数目为k个。

需求矩阵 Need[n,m]

它表示每个进程尚需的各类资源数,Need[i,j]=k 表示进程i 还需要j类资源k个。Need[i,j]=Max[i,j] – Allocation[i,j]。

进程Pi的请求向量Requesti

如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。

银行家算法具体框图

Created with Raphaël 2.2.0 开始 Requesti ≤ Need[i] Request[i]≤Available Available= Available-Requesti Allocation[i]= Allocation[i]+Requesti Need[i]=Need[i]-Requesti 分配安全吗? Available= Available+Requesti Allocation[i]= Allocation[i]-Requesti Need[i]=Need[i]+Requesti 结束 撤销本次资源分配 请求进程等待 资源请求非法 yes no yes no yes no

银行家算法具体步骤描述

当Pi发出资源请求后,系统按下述步骤进行检查:

  • (1) 如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
  • (2) 如果Requesti[j]≤Available[j],便转向步骤(3);否则, 表示尚无足够资源,Pi须等待。
  • (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,以完成本次分配;否则,
    将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。

安全性算法

由银行家算法改进更通用的安全性算法

安全性算法原理简框图

Created with Raphaël 2.2.0 开始 寻找一个非阻塞的进程? 运行完成,释放资源 所有进程节点都可以运行完成吗? 系统安全 系统不安全 yes no yes no

安全性算法的数据结构

工作向量Work

它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素

Finish

它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]:= False; 当有足够资源分配给进程时, 再令Finish[i]:= True。

安全性算法具体框图

Created with Raphaël 2.2.0 开始 Work=Available; All Finish=FALSE; Finish[i]=false &&Need[i]≤work? Work=Work+Allocation[i]; Finish[i]=TRUE; All finish==TRUE? Return 安全 Return 不安全 yes no yes no

安全性算法具体步骤描述

  • (1) 设置两个向量: 在执行安全算法开始时,Work∶=Available; Finish[i]:= False;
  • (2) 从进程集合中找到一个能满足下述条件的进程: ① Finish[i]= False; ② Need[i,j]≤Work[j];
    若找到, 执行步骤(3), 否则,执行步骤(4)。
  • (3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行: Work[j]∶= Work[i]+
    Allocation[i, j]; Finish[i]∶= true; go to step 2;
  • (4) 如果所有进程的Finish[i]=true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。

例子

假定系统中有五个进程{P0、P1、P2、P3、P4}和三种类型资源{A、B、C},每一种资源的数量分别为10、5、7。如下所示

进程\资源情况Max
A B C
Allocation
A B C
Need
A B C
Available
A B C
P07 5 30 1 07 4 33 2 2
P13 2 22 0 01 2 2
P29 0 23 0 26 0 0
P32 2 22 1 10 1 1
P44 3 30 0 24 3 1
  1. T0时刻是否安全?
    从表中可找出一个序列(P1 、 P3、 P4 、 P2 、 P0)使各进程顺序地一个个地执行完成
    |进程\资源情况|Work
    A B C|Need
    A B C|Allocation
    A B C|Work+Allocation
    A B C|Finish|
    |————- |————- |————- |————- |————- |————- |
    |P1|3 2 2|1 2 2|2 0 0|5 3 2|ture|
    |P3|5 3 2|0 1 1|2 1 1|7 4 3|ture|
    |P4|7 4 3|4 3 1|0 0 2|7 4 5|ture|
    |P2|7 4 5|6 0 0|3 0 2|10 4 7|ture|
    |P0|10 4 7|7 4 3|0 1 0|10 5 7|ture|
    原文作者:银行家问题
    原文地址: https://blog.csdn.net/Caoyang_He/article/details/80819411
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞