zoukankan      html  css  js  c++  java
  • 死锁产生的条件以及解决方法

    本文主要讲为什么会产生死锁?如何避免以及发生死锁该如何恢复死锁?


    产生死锁的四个必要条件:
    (1) 互斥条件:一个资源每次只能被一个进程使用。
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    (3) 不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
    (4) 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
    只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。


    1.预防死锁
    预防死锁的发生只需破坏死锁产生的四个必要条件之一即可。
    1) 破坏互斥条件
    如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。


    2) 破坏不剥夺条件
    当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU 的寄存器及内存资源,一般不能用于打印机之类的资源。
    3) 破坏请求和保持条件


    釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。


    4) 破坏环路等待条件

    为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提
    出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri 的资源。这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在
    为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使甩资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。


    2.避免死锁
    银行家算法。


    3.检测死锁
    死锁定理。


    4.解除死锁
    4.1 从死锁进程处剥夺资源
    4.2 终止部分或全部进程

  • 相关阅读:
    LUA脚本中的方法使用冒号和点,以及调用者使用冒号和点
    Lua类对象的继承
    Lua类对象和类对象的单例
    toLua使用protobuf协议转Lua表
    关于Lua表的弱引用
    Lua-面向对象中函数使用时冒号(:)和点(.)的区别
    Python【day 14-5】sorted filter map函数应用和练习
    Python【day 14-4】sorted filter map+递归文件夹+二分法查找
    Python【day 14-3】二分法查找
    Python【day 14-2】递归遍历文件夹
  • 原文地址:https://www.cnblogs.com/loren-Yang/p/7577373.html
Copyright © 2011-2022 走看看