• 死锁


    死锁定义和产生的根本原因

    两个p进行交换

    哲学家进餐问题,每个哲学家都拿不到右边的筷子,而阻塞等待,而且永远等待下去。

    1. 死锁的定义

    一组进程因竞争资源而造成的一种僵局,即每个进程都占有部分资源,同时又需得到已被该组进程中其他占用的资源,若无外力作用,这些进程将永远处于等待状态

    一种死锁状态的例子

    假设系统中有一个R1,一个R2资源,一次只允许一个进程使用,P1申请一个R1,再申请一个R2;P2申请一个R2,再申请一个R1;

    P1:
    P(R1);
    P(R2);
    ...
    V(R1);
    V(R2);

    P2:
    P(R2);
    P(R1);
    ...
    V(R2);
    V(R1);

    1. 死锁产生的根本原因
      (1) 竞争资源
      (2) 进程推进顺序不当

    P1:
    P(R1);
    P(R2);
    ...
    V(R1);
    V(R2);

    P2:
    P(R2);
    P(R1);
    ...
    V(R2);
    V(R1);

    产生死锁的四个必要条件:

    (1) 互斥条件

    对于独占资源,每个资源每次只能给一个进程使用,进程一旦申请到了资源后占为已有,则排斥其它进程共享该资源。

    (2) 不剥夺条件

    正在使用的资源不可剥夺,进程获得的资源尚未使用完毕之前,只能由占有者自己释放,不能被其它进程强行占用。

    (3) 请求和保持条件

    进程因未分配到新的资源而受阻,但又不放弃已占有的资源。

    (4) 环路等待条件

    存在进程的循环等待链,前一进程占有的资源正是后一进程所需求的资源,结果就形成了循环等待的僵持局面。

    上面四个条件是在死锁发生时同时出现的,我们可以利用它们的逆否命题,即:四个条件中只要有一个不满足,则死锁不会发生。这正是我们预防死锁所需考虑的方法。

    死锁不仅会发生在两个进程之间,也可能发生在多个进程之间,甚至发生在全部进程之间。此外,死锁不仅会在动态使用外部设备时发生,而且也可能在动态使用存储区、文件、缓冲区、数据库时发生,甚至在进程通信过程中发生。随着计算机资源的增加,系统出现死锁现象的可能性也大大增加,死锁一旦发生,会使整个系统瘫痪而无法工作。因此,要想办法解决死锁问题。

    死锁的处理方法

    • 死锁预防 破坏必要条件
    • 死锁避免 银行家算法
    • 死锁检测 死锁定理
    • 死锁解除 剥夺资源、撤销进程

    1.死锁的预防

    采取某种策略,限制并发进程对资源的请求,从而保证死锁的必要条件在系统执行的任何时间都不能得到满足。

    2.死锁的避免

    是指系统在分配资源时,根据资源的使用情况提前做出预测,给定一个合适的安全的进程推进顺序,从而避免死锁的发生。实现起来有一定的难度,但在一些较完善的系统中,常用这种方法。

    3.死锁的检测

    允许系统发生死锁。系统设有专门的机构,当死锁发生时,该机构能够检测到死锁的发生,并能确定参与死锁的进程及相关资源。

    4.死锁的解除

    这是与死锁检测相配套的措施,用于将进程从死锁状态中解脱出来。

    常用的解除死锁的方法有两种:

    • 一种是强制性地撤销一些死锁进程,并剥夺它们的资源给其余进程;

    • 另一种是使用一个有效的挂起机构来挂起一些进程,以便从被挂起进程中剥夺一些资源来解除死锁。

  • 相关阅读:
    联赛模拟26_Lesson5!(拓扑+最长路径树)
    联赛模拟27_地理课
    联考day7_树和森林(lct.cpp)
    CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths —dsu on tree
    O(m^1.5)寻找三元环
    未对参数做非空校验,我的服务被搞得内存溢出了!
    想法随写:推动与拉动 and 百思得解 and 学会扭转被动局面
    http code:502 Bad Gateway
    java.lang.reflect.Filed.class中setInt与set的区别
    dubbo提供者停止服务后zookeeper注册中心节点仍然存在
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/12695211.html
Copyright © 2020-2023  润新知