2.4_3 死锁的处理策略——避免死锁

2.4_3 死锁的处理策略——避免死锁

知识总览

死锁的处理
不允许死锁发生
静态策略:预防死锁
动态策略:避免死锁
什么是安全序列
什么是系统的不安全状态,与死锁有何联系
如何避免系统进入不安全状态:银行家算法
允许死锁发生
死锁的检测和解除

什么是安全序列

所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。

什么是系统的不安全状态

如果分配了资源之后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。

与死锁有何联系

如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)

因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。

银行家算法

银行家算法是荷兰学者Dijkstra为银行系统设计的,以确保银行在发放现金贷款时,不会发生不能满足所有客户需要的情况。后来该算法被用在操作系统中,用于避免死锁

核心思想:在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态。如果会进入不安全状态,就暂时不答应这次请求,让该进程先阻塞等待。

进程最大需求已分配最多还需要
P0(7,5,3)(2,2,1)(5,3,2)
P1(3,2,2)(2,0,0)(1,2,2)
P2(9,0,2)(3,0,2)(6,0,0)
P3(2,2,2)(2,1,1)(0,1,1)
P4(4,3,3)(0,0,2)(4,3,1)

假设系统中有n个进程,m种资源
每个进程在运行前先声明对各种资源的最大需求数,则可用一个n * m的矩阵(可用二维数组实现)表示所有进程对各种资源的最大需求数。不妨称为最大需求矩阵Max,Max[i,j]=K表示进程Pi最多需要K个资源Rj。同理,系统可以用一个n * m的分配矩阵 Allocation表示对所有进程的资源分配情况。Max-Allocation=Need矩阵,表示各进程最多还需要多少各类资源。
另外,还要用一个长度为m的一维数组 Available表示当前系统中还有多少可用资源。

某进程Pi向系统申请资源,可用一个长度为m的一维数组 Request;表示本次申请的各种资源量。

可用银行家算法预判本次分配是否会导致系统进入不安全状态:

  1. 如果Requesti[j]≤Need[i,j] (0≤j≤m)便转向2;否则认为出错。
  2. 如果 Requesti[j]≤Available[j] (0≤j≤m),便转向3;否则表示尚无足够资源,Pi必须等待。
  3. 系统试探着把资源分配给进程Pi,并修改相应的数据**(并非真的分配,修改数值只是为了做预判)**:
  4. 操作系統执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式分配;否则,恢复相
    应数据,让进程阻塞等待。

Available = Available - Request;
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] - Request,[j]


知识回顾与重要考点

数据结构:

长度为m的一维数组Available表示还有多少可用资源
n * m矩阵 Max 表示各进程对资源的最大需求数
n * m矩阵 Allocation 表示已经给各进程分配了多少资源
Max-Allocation=Need 矩阵表示各进程最多还需要多少资源
用长度为 m 的一位数组 Request 表示进程此次申请的各种资源数

银行家算法步骤:

  1. 检查此次申请是否超过了之前声明的最大需求数
  2. 检查此时系统剩余的可用资源是否还能满足这次请求
  3. 试探着分配,更改各数据结构
  4. 用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:

检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。

不断重复上述过程,看最终是否能让所有进程都加入安全序列。

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AngelaEzioHe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值