操作系统 死锁

1、资源

把需要排他性使用的对象称为资源。资源可以是硬件也可以是软件,比如打印机或者数据库中的一个加锁记录。

资源可以分为两类:可抢占资源和不可抢占资源。

  • 可抢占资源:可以从拥有它的进程中抢占而不产生副作用。

  • 不可抢占资源:不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来。

抢占这个词,在进程和线程调度时就提到了这个概念,那时是进程或者线程可以抢占CPU,即抢占式调度。存储器也可以抢占,如内存换页。

一般来说,可抢占资源不会引起死锁,可以在进程间重新分配资源而得到解决。

2、死锁的概念

如果一个进程集合中,每个进程都在等待只能由该集合中其他进程才能引发的事件,那么该进程集合就是死锁的。
死锁并不仅仅发生在资源上,资源死锁只是一种。
本篇博客将围绕资源死锁来主要介绍。

3、死锁的必要条件

参考此篇博客:https://www.cnblogs.com/lustar/p/8087496.html
一般来说,死锁的必要条件共有4个:

  1. 互斥:至少有一个资源必须处在非共享模式,即一次只能有一个进程使用,如果另一进程申请该资源,那么申请进程必须延迟直到该资源释放为止。
  2. 占有(占用)并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。即:资源不能被抢占
  3. 不可(非)抢占:已经分配给一个进程的资源不能被抢占,只能由占有它的进程显式地释放。
  4. 循环(环路)等待:死锁发生时,系统中一定有由两个或以上的进程组成的一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。即:有一组进程{P0,P1,…Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,Pn-1等待的资源被Pn占有,Pn等待的资源被P0占有。

4、死锁的处理策略

  1. 忽略死锁:一般称为鸵鸟算法,即躲起来视而不见。
  2. 检测死锁并恢复:让死锁发生,检测它们是否发生,一旦发生死锁,就采取行动解决问题。
  3. 避免死锁:仔细对资源进行分配,动态地避免死锁。
  4. 预防死锁:通过破坏引起死锁的四个必要条件,防止死锁的发生。

4.1 忽略死锁

采用鸵鸟算法,即一种计算机操作系统算法,用于当死锁真正发生且影响系统正常运行时,手动干预 ——> 重新启动。
传说中鸵鸟看到危险就把头埋在地底下。当你对某一件事情没有一个很好的解决方法时,那就忽略它,就像鸵鸟面对危险时会把它深埋在沙砾中,装作看不到。这样的算法称为“鸵鸟算法“。这实在不算是一个算法,但却是目前实际系统采用最多的一种策略。例如在计算机操作系统中,当死锁真正发生且影响系统正常运行时,手动干预 ——> 重新启动。
在计算机科学中,鸵鸟算法是一个忽略潜在问题的一种算法策略,这种策略对计算机程序可能出现的问题采取无视态度(类似于鸵鸟在遇到危险时将头埋在地里,装作看不见)。鸵鸟算法的使用前提是,问题出现的概率很低。

4.2 检测死锁并恢复

采用这种办法的时候,系统并没有试图阻止死锁的发生,而是允许死锁发生,检测到死锁后,采取措施进行恢复。
该方法分为两个阶段:检测、恢复

  • 检测:我们知道,死锁的一个必要条件是存在两个及以上进程组成的环路。通过检测有向图环路,是一种检测死锁存在的方法。
    然而,当每种类型存在多个资源时,检测可能会复杂许多。
  • 恢复:拥有以下几种方法:
    • 利用抢占恢复。死锁发生的必要条件,其中一个就是不可抢占。如果允许抢占,那么就可以破坏死锁条件。
    • 利用回滚:周期性对进程进行检查点检查,一旦发现了死锁,就回滚到一个较早的检查点上。
    • 通过杀死进程:这个方法是最显而易见的。杀死一个进程可以释放它占有的资源,如果仍然不行那么久继续杀死其他进程直到打破死锁。

4.3 避免死锁

  1. 资源轨迹图
    如果直到了进程在各个阶段需要哪些资源,那么可以在图中进程标注。两个进程的交叠区域就是一个会造成死锁的区域。进程在图中只能向右或者向上前进,一旦进入了危险区,那么就可能发生死锁。为了避免死锁,应当在合适的时间阻塞某个进程,使得运行避开这个区域。
  2. 银行家算法
    银行家算法可以推广到多个资源的情况,此时可以写成矩阵的形式,每次判断一行是否满足,即一个进程的多个资源都进行检查。

但是需要注意到,死锁避免是非常困难的,无论是资源轨迹图还是银行家算法,都需要事先知道进程运行的过程中需要的最大资源数,这几乎是不可能实现的!

4.4 预防死锁

死锁避免可以认为是在程序执行中动态地避免死锁发生,而死锁预防可以说是静态的方式,杜绝死锁发生的可能性。

事实上,只要能破坏死锁发生的四个必要条件之一,那么死锁就不会发生。

  1. 破坏互斥条件
    尽量使得资源不被某个进程独占。比如打印机的假脱机打印,就是尽量避免一个进程独占打印机,而是把要打印的文件存入一个假脱机目录,然后通过一个守护进程管理打印机进行打印。

  2. 破坏占有(占用)并等待条件
    禁止已经持有资源的进程再等待其他资源。

    • 一种方式是,在进程开始执行前请求所需的全部资源,如果不能满足,那么就不分配资源,进行等待。这种方式的问题在于,类似银行家算法,事先不知道需要多少资源,而且资源利用率不高。

    • 另一种方式就是,当一个进程请求资源时,先暂时释放其当前所占用的所有资源,然后再尝试一次获取所需的全部资源。

  3. 破坏不可(非)抢占条件
    允许资源抢占即可。当然,有的时候资源应当是不可抢占的。

  4. 破坏循环(环路)等待条件
    对资源进行编号,进程在任何时候都可以请求资源,但是所有的请求必须按照资源编号的顺序(升序或降序)提出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

赈川

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

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

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

打赏作者

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

抵扣说明:

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

余额充值