死锁

133 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,点击查看活动详情

死锁

概念相关

  • 什么是死锁

    • 各进程互相等待对方手里的资源,导致进程都阻塞,无法向前推进
  • 死锁,饥饿,死循环的区别

    • 死锁

      • 两个以及两个以上的进程死锁进程一定阻塞,不能上处理机
    • 饥饿

      • 可能一个可能阻塞可能就绪,不能上处理机
    • 死循环

      • 可能一个死循环是程序员的问题,能上处理机
  • 死锁产生的必要条件

    • 互斥条件

      • 资源只能一个人使用
    • 不可剥夺

      • 进程占有的资源,不能被他人强行剥夺,只能进程主动释放
    • 请求和保持条件

      • 我占有了一些资源,我还在申请其他资源
    • 循环等待

      • 发生死锁一定有循环等待
      • 有循环等待未必死锁
  • 死锁产生的原因

    • 竞争资源
    • 进程推进顺序非法
    • 信号量使用不当(把信号量理解为一种抽象的资源)

死锁的处理策略

  • 不允许死锁发生

    • 预防死锁

      • 破坏互斥条件

        • spooling技术 :将互斥资源改造为允许共享使用

        • 缺点:可行性不高,大多数情况下不能改造

      • 破坏不剥夺条件

        • 1.立即释放,2.允许自己被剥夺
        • 缺点:实现复杂,开销大
      • 破坏请求保持条件

        • 要么全给,要么全不给,资源不全就不能运行
        • 缺点:效率低,饥饿
      • 破坏循环等待条件

        • 给资源编号,必须从小到大的顺序申请资源
        • 原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。
        • 缺点:不方便增加新设备,进程实际使用资源的顺序可能和 编号递增顺序不一致,会导致资源浪费;
    • 避免死锁

      • 在资源分配之前预先判断这次分配是否会导致系统进入不安全状态

      • 不安全状态

        • 找不到任何一个安全序列(安全序列:每个进程都能被满足的序列)
        • 死锁一定是在不安全状态,但是在不安全状态未必就是发生了死锁
        • 安全状态一定不死锁
      • 银行家算法

        • 检查当前的剩余开可用资源是否满足某个进程的最大需求,如果可以就把该进程加入安全序列,然后回收资源,接着看有没有下一个能运行的进程,一直重复操作,最后形成的序列就是安全序列

        • 安全序列不唯一

        • 并将该进程持有的资源全部回收

        • 银行家算法用来判断系统是否处于死锁状态

        • 银行家算法用来判断系统是否处于不安全状态

  • 允许死锁发生

    • 死锁检测算法

      • 原理

        • 依次消除与即不阻塞又不孤立进程相连的边,直到无边可消

        • 死锁定理:如果分配图不可完全简化,说明发生了死锁

image.png