操作系统中死锁问题

157 阅读4分钟

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

什么是死锁

定义: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。称此时系统处于死锁状态或系统产生了死锁。大家占有别的进程希望的到资源,同时又希望别的进程释放资源。


一个经典的场景就是哲学家进餐问题,一个圆形的桌子上坐着一圈哲学家,规定哲学家们要先拿起自己左手边的筷子🥢,然后再拿起右手边儿的🥢才能进食。当开始进餐时候,哲学家们都首先拿起了 自己左手边的筷子,这时候,右手边儿的筷子,都被右手边儿的这说哲学家所占用,同右边儿的哲学家又在等着 右边的哲学家放下手中的筷子,这样就形成了循环♻️。

image.png

发生死锁的几个条件

  1. 互斥(资源之间的访问是互斥的)
  2. 不可抢占(资源一旦被抢占就不可被其他资源剥夺)
  3. 占有和等待 (进程本身占用着其他资源所需要的资源,又等待着其他起源释放自己所需要的资源)
  4. 循环和等待(进程的资源请求之间形成环路)

解决死锁的办法

  • 死锁预防
  • 死锁检测和恢复
  • 避免死锁
  • 鸵鸟定理

1. 预防死锁

通过确保死锁的一个必要条件不会满足,保证不会发生死锁

条件一(互斥):
这个是资源固有性质决定的不但 不应该破坏 还应该加以保持
条件二(不可抢占)

  • 如果占有某些资源的一个进程进行进一步资源请求时被拒绝,则该进程必须释放它最初占有的资源。
  • 如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另外一个进程,要求它释放资源。
    条件三(占有和等待):
    为预防占有且等待条件,可以要求进程一次性的请求所有需要的资源,并且阻塞这个进程直到所有请求都同时满足。这个方法比较低效。
    条件四(循环等待): 通过定义资源类型的线性顺序来预防。

*如果一个进程已经分配了R类资源,那么接下来请求的资源只能是那些排在R类型之后的资源类型。该方法比较低效。

2. 避免死锁

在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁,防止进程进入不安全状态

  • 进程启动拒绝:如果一个进程的请求会导致死锁,则不启动该进程。
  • 资源分配拒绝:如果一个进程增加的资源请求会导致死锁,则不允许此分配(银行家算法)。

银行家算法:详解

image.png

系统能按照某种进程顺序,为每个进程分配资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利完成

3. 死锁检测和恢复

通过资源分配图可以检验出 是否发生了死锁

如果发生了死锁可以通过破坏产生死锁条件中的任意一个来接触这种状态。

  1. 资源剥夺法: 挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。
  2. 撤销进程法: 强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按进程优先级和撤销进程代价的高低进行。

4. 鸵鸟定理

类似鸵鸟 置之不理