进程死锁的产生和解决策略

一、什么是死锁

在并发环境下,各进程存在抢夺资源而造成的互相等待对方手里的资源,导致进程阻塞,无法向前推进叫死锁

二、死锁、饥饿和死循环的区别

死锁,至少2个进程一起死锁,死锁进程处于阻塞态
饥饿,可以是1个或多个进程,饥饿进程可以是阻塞态也可以是就绪态
死循环,可以是1个或多个进程,死循环进程可以是运行态
死锁和饥饿是操作系统分配资源的策略不合理导致,由操作系统解决,死循环是程序员解决

三、死锁产生的必要条件

注意:从数学层面理解充分和必要区别

  1. 互斥条件,对必须互斥的资源的争抢才会导致死锁,互斥意思就是只能有1个进程在用,其他进程必须等待其释放
  2. 不剥夺条件,进程占用的资源只能自己主动释放
  3. 请求和保持条件,进程保持着某些资源不放的同时,请求其他资源,典型吃着碗里瞧着锅里
  4. 循环等待,存在一种进程资源的循环等待链;循环等待未必死锁(比如Q符号,虽然闭环,但是有其他进程可以介入,释放等待的资源即可解锁),死锁一定是循环等待

四、什么时候会发生死锁

对不可剥夺资源的不合理分配,可能导致死锁

五、死锁的处理策略

5.1. 预防死锁
  1. 破坏互斥条件
    将临界资源改造成共享资源(共享是宏观上的意思),比如SPOOLing技术;
    代码层面就是第三方进程处理用户消息,同步变异步,哪个进程的请求先到先处理哪个进程的消息

    缺点,可行性不高,很多时候不能破坏互斥条件,即我们要按序处理消息

  2. 破坏不剥夺条件
    方案一,设置进程主动释放,当进程请求新的资源得不到满足时,释放保持的所有资源进入阻塞态
    方案二,设置系统强制剥夺,当进程需要的资源被某进程占有时,由操作系统协助踢走

    缺点,实现比较复杂
    释放已获得的资源可能造成前一段工作的失效
    反复申请和释放资源增加系统开销,降低系统吞吐量;
    方案一可能导致一直释放资源,导致进程饥饿

  3. 破坏请求和保持条件
    避免出现在程序运行中请求资源,直接在进程运行前把所有需要的资源申请好

    缺点,资源浪费,有些运行过程中没有用到的资源,比如我打开QQ我不一定要用摄像头资源
    可能导致某些进程饥饿

  4. 破坏循环等待条件
    编号,避免闭环请求资源,也叫顺序资源分配法

    缺点,不方便新增设备,因为需要重新编号
    进程使用资源的顺序跟资源的编号顺序不一样
    程序员可能要频繁修改代码

5.2. 避免死锁
  1. 安全序列,安全状态,死锁联系

    • 安全状态,只要能找到一个安全序列,即按照这个序列分配资源能保证所有进程完成(完成时会回收资源)
    • 不安全状态,找不到一个安全序列,这意味着所有进程没有办法再请求新的资源来满足自己运行,但是这些进程不一定需要请求新资源,可能还会提前归还前面的资源
    • 如果操作系统处于安全状态,即会按安全序列来分配资源,肯定不会发生死锁,如果操作系统处于不安全序列,有可能发生死锁,有可能不发生
  2. 银行家算法

    1. 检查申请的资源有没有超过最初声明最大需求数
    2. 检查系统剩下的资源够不够分配这次的请求
    3. 试探分配(修改数据),剩下的系统资源能不能满足安全性算法
    4. 满足安全性算法,真分配(保存刚才修改的数据);不满足安全性算法,不处理(不保存刚才修改的数据),该进程进入堵塞态
  3. 安全性算法

    • 首先明确它是银行家算法里的一个步骤
    • 其次它的作用是预测现在的资源能不能满足其他进程
    • 步骤:
      1. 检查当前的剩余可以用的资源是否满足内存中这么多进程里的一个,它的最大需求,找到1个就行
      2. 如果可以加入安全序列,回收该进程的资源,在内存划掉这个进程
      3. 经历了第二个步骤回收资源,现在系统资源会变多或者不变,再重复1,2步骤,直到内存中所有进程加入安全序列,说明安全状态,如果有进程无法加入安全序列,说明不安全状态
5.3. 死锁的检测和解除

背景:如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供两个算法
①死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁。
②死锁解除算法:当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来。

  1. 如何检测

    • 数据结构:资源分配图
      在这里插入图片描述

      2种结点:进程结点,资源结点

      2种边,请求边,进程结点->资源结点;分配边,资源结点->进程结点

    • 死锁检测算法

      1. 先找出不阻塞进程(注意不能是独立的结点)
      2. 依次消除与该进程相连的边,直到无边可消(因为不阻塞进程正常可以正常运行结束归还资源,所以可以消除这些边)
      3. 如果还有剩下的边不能消除,说明发生了死锁
    • 死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁

  2. 如何解除(死锁解除算法)
    资源剥夺法,挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。

    撤销进程法,也叫终止进程法,强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。

    进程回退法,让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

  3. 针对死锁,如何决定对谁动手?

    • 进程优先级
    • 已执行多长时间,还要多久能完成
    • 进程已经使用了多少资源
    • 进程是交互式的还是批处理式的,交互式就是跟用户有互动的,比如QQ,批处理式就是执行一堆任务,用户看不见的,这种情况下,我们干掉交互式的进程,用户肯定不爽,所以可以优先干掉批处理式进程

欢迎交流评论关注,有问题直接指出!!!
欢迎交流评论关注,有问题直接指出!!!
欢迎交流评论关注,有问题直接指出!!!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值