浅谈操作系统——死锁的避免

497 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

在系统运行过程中,对进程提出的每一个(系统能满足的)资源申请进行动态检查(安全性检查)。根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这就是我们今天要说的——死锁的避免。

安全状态

  • 如果系统能按照某种顺序为每个进程依次分配其所需的资源。直到所有进程都能运行完成,那么称此时系统处于安全状态
  • 这种进程的顺序如P4,P1... ...Pn称为安全序列
  • 如果不存在这样一个安全序列称此时系统处于不安全状态

安全状态举例

  • 系统有三个进程P1,P2,P3,12台打印机,P1共要求10台P2共要求4台,P3共要求9台。在T0时刻,P1,P2,P3分别获得5、2、2台,还有3台空闲

因为在T0时刻存在一个安全序列<P2,P1,P3>,所以系统此刻处于安全状态

由安全状态向不安全状态的转换

  • 如果不安全状态序列分配资源,则系统可能会由安全状态进入不安全状态
  • 如果在T0以后,P3要求1台打印机,若系统分配给他一台,那么系统进入不安全状态

注意:不安全状态不等于死锁。处于不安全状态的系统不一定会发生死锁,处于安全状态的系统一定不会发生死锁,系统处于安全与不安全状态都是对静态进行的评价。

利用银行家算法避免死锁

银行家算法:对资金最大需求不超过现有现金。分期贷款,但贷款总数没超过最大需求。贷款可推迟支付,但能在有限时间里支付。贷款后一定能在有限时间归还所有资金

银行家算法中的数据结构

  • 可利用资源向量:是一个含有m个元素的数组,其中每个元素代表一类资源的可利用数目
  • 最大需求矩阵:n*m矩阵,n为当前系统进程的数目,m为系统资源种类数。Max[i,j]为第i个进程对j类资源的最大需求
  • 分配矩阵:n*m矩阵,表示每个进程已分配的每类资源数
  • 需求矩阵:n*m矩阵,表示每个进程还需要各类资源数

银行家算法的步骤

进程提出资源请求-判断资源请求是否合法-判断是否有可用资源-试分配请求资源-调用安全性算法判断系统新状态安全与否

银行家算法描述

当进程P提出资源申请时Requesti[j],系统执行下列步骤:

1)若Requesti[j]≤Need[i,j],转2);否则错误返回。

2)若Requesti[j]≤Availablel[j],转3);否则进程等待。

3)假设系统给它分配资源,则有:
Available [i]=Available [j]-Requesti[j]; Allocation[i,j]:=Allocation[i,j]+Requesti[j]; Need[i,j]:=Need[i,j]-Requesti[j]

4)执行安全性算法,若系统新状态是安全状态,则分配完成,若系统新状态是不安全状态,则恢复原状态,进程等待。

安全性算法

为进行安全性检查,定义数据结构:

Work:ARRAY[0..m-1]of integer;

Finish:ARRAY[0..n-1]of Boolean;

  • m代表资源种类数,n代表进程的数量:
  • Work表示系统可提供给进程继续运行的各类资源的数目;
  • Finish表示系统是否有足够的资源分配给该进程

银行家算法的步骤——安全性算法

初始化数组-判断是否存在可获得足够资源的进程-进程i完成、可用资源修改、寻找下一个-退出状态判断

以上就是关于死锁避免的一些方法主要要掌握银行家算法,这个用处确实比较大,老师上课讲的时候我确实也是没有听懂,比较难懂我感觉,所以多看几遍多悟几遍就好啦。