操作系统05——死锁

150 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

什么是死锁?

在两个或者多个进程,每个进程持有资源而又等待其它进程释放它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁(deadlock)。

两个或者两个以上进程执行时,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉就无法再执行下去,称为死锁。

死锁产生的必要条件?

  • 互斥:一个资源一次只能被一个进程使用;
  • 占有并等待:一个进程至少占有一个资源,并在等待另一个被其它进程占用的资源;
  • 非抢占:(不可剥夺)已经分配给进程的资源不能被其他进程抢占,只能由进程完成任务之后自愿释放;
  • 循环等待:若干进程之间形成一种头尾相接的环形等待资源关系,该环路中的每个进程都在等待下一个进程所占有的资源。

死锁有哪些处理方法?

鸵鸟策略

直接忽略死锁。因为解决死锁问题的代价很高,不采取任务措施的方案会获得更高的性能。当发生死锁不会对用户造成多大影响或发生死锁的概率很低,可以采用鸵鸟策略。

死锁预防

基本思想是破坏形成死锁的四个必要条件:

  • 破坏互斥条件:允许某些资源同时被多个进程访问。但是有些资源本身并不具有这种属性,因此这种方案实用性有限;

  • 破坏占有并等待条件:

    • 实行资源预先分配策略(当一个进程开始运行之前,必须一次性向系统申请它所需要的全部资源,否则不运行);
    • 只允许进程在没有占用资源的时候才能申请资源(申请资源前先释放占有的资源);
    • 缺点:很多时候无法预知一个进程所需的全部资源;同时会降低资源利用率和系统的并发性
  • 破坏非抢占条件:允许进程强行抢占被其它进程占有的资源。会降低系统性能

  • 破坏循环等待条件:对所有资源统一编号,所有进程对资源的请求必须按照序号递增的顺序提出,即只有占有了编号较小的资源才能申请编号较大的资源。这样避免了占有大号资源的进程去申请小号资源。

死锁避免

动态检测资源分配状态,以确保系统处于安全状态,只有处于安全状态时才会进行资源的分配。

安全状态:若所有进程请求需要的所有资源,也能存在某种资源分的配顺序,使得每一个进程运行完毕。

银行家算法

死锁解除

如何检测死锁:检测有向图是否存在环使用类似死锁避免的检测算法

死锁解除的方法:

  • 利用抢占:挂起某些进程,并抢占它的资源。但应防止某些进程被长时间挂起而处于饥饿状态;
  • 利用回滚:让某些进程回退到足以解除死锁的地步,进程回退时自愿释放资源。要求系统保持进程的历史信息,设置还原点;
  • 利用杀死进程:强制杀死某些进程直到死锁解除为止,可以按照优先级进行。