OS_死锁

2024.09.04:操作系统死锁学习笔记


1.1 定义

1.1.1 死锁&饥饿

死锁:如果一组进程中的每一个进程都在等待仅有该组进程中的其他进程才能引发的事件,那么该组进程是死锁的,eg.哲学家抢筷子

饥饿:当你的等待事件给进程的推进带来了一些明显影响的时候,称发生了饥饿。

饥饿不代表系统已经死锁,但至少有一进程执行被无限推迟


1.1.2 死锁产生的原因

竞争不可抢占资源:系统中的不可抢占资源数量不足以满足多个进程运行需要,进程运行过程中就会因竞争资源而陷入僵局(对可抢占的资源的竞争不会引起死锁)

进程推进顺序不当:哲学家进餐问题中,若事先规定好合法的吃饭顺序也不会引起死锁


1.2 必要条件

注意:区分在处理进程同步互斥的问题的时候,我们应该遵循的四条规则。如果发生了死锁,下面的四个条件是必然满足的

  • 互斥条件:一段时间内,进程分配到的资源只能被自己占用,如果有其他进程此时请求该资源,则请求进程只能等待

  • 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但是对已有资源保持不放

  • 不可抢占条件:进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完时由自己释放

  • 循环等待条件:所以系统出现死锁时,必然会有多个进程处于阻塞态,发生死锁时,必然存在一个进程–资源的循环链,P1等P2资源,P2等P3资源…


1.3 处理方法

1.3.1 预防死锁

通过设置某些限制条件,去破坏产生死锁四个必要条件中的一个或几个来预防产生死锁。预防死锁是一种比较容易实现的方法,已被广泛使用
在这里插入图片描述

(1)破坏“请求和保持条件”

请求与保持条件指的就是这个进程它已经有了一些资源或者一个资源,但是它又想要去申请一个新的资源,那么这个资源被其他进程占用了,然而此时它由于等待这个新资源被阻塞,可是对于它已有的这些资源,它是会保持住的,不会去释放的。

如果要打破这个条件,我们可以从这个思路去分析,走到反面,限制这个进程在运行之前必须一次性地把它整个运行过程中需要的资源全部都申请了,不可以在中间就是你运行的过程中再去申请资源,这样的话就不会发生刚才请求和保持条件里面的整个请求,我们在运行的时候不会再去请求新的资源。那么在申请资源的时候,只要有一种不满足这个进程的要求,比如我想要3个,但系统里面只有两个,那系统就不会分给他,这样的话也可以破坏掉它的保持条件


(2)破坏“不可抢占条件”

不可抢占指的就是进程获得的资源在它没有使用完之前是不可以被其他进程抢走的,只能由他自己来释放。

如果要打破这个条件,我们可以让一个进程在没有使用完的时候把这个资源给释放出来。所以想要破坏不可抢占的条件,我们就可以规定一个已经保持了某些不可被抢占的资源的进程,再提出新的资源请求不能被满足时,必须要释放已经保持的所有资源,需要的时候再重新申请。

这个做法其实就相当于对于一个进程来说,它已经占有了这个资源,可能会暂时释放,或者说你就可以把它理解成这个资源被抢占了,从而就可以破坏掉不可抢占这个条件

这个方法有一个劣势:该方法实现复杂,且需付出很大代价


(3)破坏“循环等待条件”

循环等待指的就是我们刚才哲学家面临的哪个问题,每个哲学家持有一个筷子,然后他又在等待其他哲学家进程放弃一个筷子。

这里,我们的一个思路就是对系统中的资源去进行一个线性排序,规定每个进程必须要按照序号递增的顺序去请求资源,如果拥有高序号资源,又想要一个低序号的资源,我们就必须要释放掉所有的高序号资源,再申请低序号资源

这种方式因为需要为资源编号,就限制了新类型设备的增加;作业使用顺序与系统预期不同也会导致资源浪费


1.3.2 避免死锁(银行家算法)

避免死锁里面我们会学到一个东西叫(安全状态),它指的就是如果系统可以按照某种进程推荐的顺序,给每个进程去分配它所要的资源,然后满足它对这个资源的最大需求,使每个进程都可以顺利的完成,这个推荐顺序,我们就把它叫做一个(安全序列)。此时的操作系统也属于一个(安全状态)下

不安全状态:如果找不到安全序列,那系统此时是不安全状态

进入不安全状态就可能发生死锁(也有可能不发生);若系统处于安全状态,系统便不会进入死锁状态

当你去检验有没有发生安全状态,你不是说边给它们分资源,边去检测会不会卡住,而是你先模拟一下,如果我这么分的话,它会不会卡住,所以说此时你都还没有给它分资源,只是想了一下,我只有找到一个安全序列,我才真的会给它们分配资源,如果你再一个不安全状态下,也可以不分资源,等待新资源,因而不发生死锁(饥饿与死锁的区别)

在这里插入图片描述


1.3.3 检测死锁

在这里插入图片描述
在这里插入图片描述
资源分配图化简:找出一个不阻塞也不独立的进程结点Pi,检查一切顺序的话是否给该进程所有需要的资源让其运行完毕。可以释放其占用的所有资源,也就是消去它的所有请求边和分配边

若能把图中所有的边都消除,则称该图是可完全简化的;如果该图是不可完全简化的,则此时处于死锁状态


1.3.4 解除死锁

常见的三种解除死锁的办法

资源剥夺法:挂起一些死锁进程,抢占它的资源,分配给其他死锁进程

撤销进程法:强制撤销部分或者全部死锁进程并且剥夺资源,可以按照优先级和撤销代价来考虑撤销顺序,实现简单但是代价较大

进程回退法:让一个或多个死锁进程回退到足以回避死锁的地步,进程回退时自愿释放而不是被剥夺。但要求系统保持进程历史信息,设置还原点。


在这里插入图片描述


  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

麻溜学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值