死锁

217 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

一、死锁定义 & 资源死锁条件

  • 如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是 死锁 。按照通俗的语言来说,就是进程运行到某个时刻时,所有没有运行结束的进程因为没有得到足够的资源,全部被阻塞了。
  • 资源死锁发生的 四个必要条件
  1. 互斥条件。每个资源要么已经分配给了一个进程,要么就是可用的。
  2. 占有和等待条件。已经得到某个资源的进程可以再请求新的资源。
  3. 不可抢占条件。已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它地进程显式地释放。
  4. 环路等待条件。死锁发生时,系统中一定有两个或两个以上的进程组成一条环路,该环路上的每个进程都在等待下一个进程所占有的资源。

二、死锁的恢复

1、抢占恢复

  • 直接从字面意思理解:抢占。当发生死锁时,就可以通过人工干预把一个资源从一个进程中抢出来,分配给另外一个进程。

2、回滚恢复

  • 这里就有一点像数据库中的 undo 日志了,通过周期性设置检查点,并维护检查点。当检查到有死锁发生时,就会回退到前一个检查点(设置检查点时,都是没有死锁的)。

3、杀死进程恢复

  • 这个就很简单粗暴,杀死进程就意味着,被杀死的进程会释放其之前所占有的资源。然后这些释放的资源又会从新分配给需要这些资源的进程。如果还有死锁存在则继续杀死更多的进程,直至没有死锁。

三、死锁避免

1、单资源银行家算法

  • 银行家算法是对每一个请求进行检查,检查这一请求是否达到安全状态。若达到安全状态,就满足该请求,反之推迟这一请求。
  • 所谓的安全状态就是即使所有进程请求对资源的最大需求,也仍然存在某种调度次序能够使每一个进程运行完毕。

2、多资源银行家算法

  • 与单资源银行家算法相似,这里就由单个资源推广到多个资源。

四、死锁预防

  • 我们知道要有死锁产生,就必须满足上面列出的四个条件,缺一不可。所以只要破环其中任意条件即可避免死锁。
条件处理方式
互斥一切都使用假脱机技术
占有等待在开始就请求全部资源
不可抢占抢占资源
环路等待对资源按序编号

1、破环互斥条件

  • 就是说这时两个进程可以使用同一个资源,可以通过使用假脱机技术避免混乱。避免分配不是绝对必须的资源,尽量做到尽可能少的进程可以真正请求资源。

2、破环占有并等待条件

  • 第一种实现方案是规定所有进程在开始执行前请求所需的全部资源,如果全部资源可用,就会马上分配资源,说明可以进行至结束。存在一个以上资源正在使用,那么就不会进行分配资源,而是在等待。但是这就会带来问题,运行的进程知道它们运行结束才知道它们所需资源的数量。
  • 第二种实现方案是当一个进程请求资源时,先暂且释放当前占有所有的资源,然后尝试一次性获取全部资源。

3、破环不可抢占条件

  • 这中方法和第一种方法相似,会造成混乱。同样的,可以通过虚拟技术来避免混乱。

4、破环环路等待条件

  • 第一种实现方案是保证每一个进程在任何时刻都只能用一个资源,如果要请求另外一个资源,它就必须释放第一个资源。
  • 第二种实现方案是将所有资源进行编号,进程可以在任何时刻提出资源请求,但是所有的资源必须按照资源编号的顺序提出。这种方案虽然解决了死锁问题,但是效果是不尽人意的。同时也存在潜在的资源以及不同用途的数量很大时,会导致编号方法无法正常使用。看来每种方法都有它的局限之处。