操作系统复习——死锁

313 阅读6分钟

过几天学校要操作系统考试了,打算将自己复习过程以笔记的方式记录下来,并且上传博客。主要是为了督促自己养成做笔记、写文章的好习惯,其次是因为上传博客上传文章这样的行为算是正反馈,有了成就感有了收获感才会更有动力。

什么是死锁?

在并发环境下,各进程因竞争资源而造成的一种互相等待对方手里资源,导致进程都阻塞,都无法向前推进的现象。发生死锁后若无外力干涉,这些进程都将无法向前推进。

死锁、饥饿、死循环的区别

饥饿:由于长期得不到想要的资源,某进程无法向前推进。例如在短进程优先算法(SPF),短进程不断到来,导致长进程一直得不到处理机,从而长进程饥饿。 死循环:进程执行过程中一直跳不出某个循环的现象。 区别:

  1. 死锁至少是2个或2个以上进程同时发生死锁。
  2. 一个进程可以发生饥饿。
  3. 死锁和饥饿是操作系统的问题,死循环是编程者(你)的问题。

死锁发生的四个必要条件

  1. 互斥条件:只有对互斥使用的资源争抢才会导致死锁。
  2. 不剥夺条件:该进程的资源只能有自己释放,不能被其他进程抢走。
  3. 请求和保持条件:进程至少保持了一个条件,同时还在请求新的资源。
  4. 循环等待条件:存在一种进程资源的循环等待链。(同类资源只有一个时,循环等待必然导致死锁

死锁的处理策略

  1. 预防死锁:破坏死锁产生的四个条件中的一个。
  2. 避免死锁:防止系统进入不安全状态(银行家算法)。
  3. 死锁的检测和解除:允许死锁发生,但是操作系统会检测并解除死锁。 接下来详细展开:

1.预防死锁

  1. 破坏互斥条件:SPOOLing技术,把独占设备在逻辑上改造成共享设备,例如打印机,增加了输出进程来实现共享。
  2. 破坏不剥夺条件:不推荐,实现起来复杂,增加了开销,可能导致进程饥饿。
  3. 破坏请求和保持条件:静态分配方法,在进程运行前一次申请所有资源。缺点是资源利用率低,且可能导致进程饥饿。
  4. 破坏循环等待条件:顺序资源分配法,即每个进程按编号递增的顺序请求资源。缺点是增加新资源麻烦。

2.避免死锁

安全序列:就是如果系统按照这个顺序分配资源,每个进程都能顺利完成。只要找到一个安全序列就说明系统是安全状态。安全序列可能有多个。如果系统在安全状态,就一定不会发生死锁,反之就有可能发生死锁。

银行家算法

核心思想:在资源分配前判断这次分配会不会导致系统进入不安全状态。

如图,表示t0时刻资源的分配情况:Max表示进程对资源的最大需求数量,Allocation表示当前已分配的资源数量,Need=Max-Allocation表示进程还需要的资源数量,Available表示当前还可以分配的资源,它随着资源的分配与回收动态地改变着。 在这里插入图片描述 使用银行家算法对T0时刻进行分析:加上上一张表格的Available(3,3,2)之后可以明显发现Work+Allocation的规律。它表示该进程完成后,资源回收后,所有的可分配资源。然后拿Work+Allocation与Need进行比较,若满足则Finish为true,以此类推。 在这里插入图片描述 最终我们可以找到这样一个安全序列(P1,P3,P4,P2,P0),需要注意的是T0时刻的安全序列并不一定只有一个,但是只要能找到一个安全序列,就说明此时系统是处于安全状态的。

此时,P1进程请求资源Request(1,0,2),我们根据它的请求动态地修改初始资源分配情况,如第一张图中的小括号()内所示。Allocation=Allocation+Request ,Need=Need-Request。然后再次检查此时系统是否安全: 在这里插入图片描述 同样可以找到一个安全序列(P1,P3,P4,P0,P2),系统仍处于安全状态,所以该请求是可以执行的。

3.死锁检测

资源分配图:

两种结点:进程结点、资源结点

两种边:进程结点——>资源结点,表示进程想申请几个资源(每个边代表一个资源)

资源结点——>进程结点,表示已为进程分配了几个资源(每个边代表分配了一个资源) 在这里插入图片描述 数据结构中,使用图的邻接表可以很容易的表示。

下图表示了资源分配图的化简,首先找到一个不阻塞不独立的结点(P1),判断P1可以顺利运行释放全部资源后,去掉P1的所有边,然后判断P2也可以顺利运行了,释放P2全部资源,即去掉P2所有边。经过这一系列操作,最终图上没有任何边,则代表该图可以完全简化,就一定不会有死锁发生在这里插入图片描述 如果最终不能消除所有边,那么此时就发生了死锁,最终还连着边的那些进程就是发生死锁的进程。 在这里插入图片描述 如图,P1,P2进程最终发生了死锁,而P3进程则没有。

4.死锁解除

解除死锁的主要方法有:

  1. 资源剥夺法:挂起某些死锁进程,并抢占它的资源分配给其他死锁进程。需要主要预防进程长时间得不到资源导致的饥饿。

  2. 撤销进程法:强制撤销部分或所有死锁进程。优点是实现简单,缺点是代价巨大,容易功亏一篑。 优先撤销哪些进程?优先级低,已执行时间短,使用资源少,非交互式(不影响用户体验)。

  3. 进程回退法:回退一个或多个进程到足以避免死锁的状态。要求系统记录进程的历史记录,设置还原点。