操作系统中的死锁:什么是循环等待(示例)

什么是死锁?

死锁 是操作系统中发生的一种情况,当任何进程进入等待状态,因为另一个等待进程持有所需的资源。死锁是多进程中一个常见的问题,其中多个进程共享一种特定类型的互斥资源,称为软锁或软件。

死锁示例

  • 一个真实的例子是交通,它只朝一个方向行驶。
  • 这里,桥梁被视为一种资源。
  • 所以,当发生死锁时,如果一辆车后退(抢占资源并回滚),它可以很容易地解决。
  • 如果发生死锁情况,可能需要后退几辆车。
  • 所以饥饿是可能的。
Example of Deadlock
死锁示例

什么是循环等待?

一个进程在等待另一个进程持有的资源,而第二个进程也在等待第三个进程持有的资源,以此类推。这将继续下去,直到最后一个进程在等待第一个进程持有的资源。这会形成一个循环链。

例如,进程 A 已分配资源 B,因为它正在请求资源 A。同样,进程 B 已分配资源 A,并且它正在请求资源 B。这会形成一个循环等待循环。

循环等待示例

例如,一台计算机有三个 USB 驱动器和三个进程。三个进程中的每一个都可以拥有一个 USB 驱动器。因此,当每个进程请求另一个驱动器时,三个进程将处于死锁状态,因为每个进程都将等待释放当前正在使用的 USB 驱动器。这将导致一个循环链。

Example of Circular wait

循环等待示例

操作系统中的死锁检测

死锁的发生可以由资源调度程序检测到。资源调度程序帮助操作系统跟踪分配给不同进程的所有资源。因此,当检测到死锁时,可以使用以下方法解决:

操作系统中的死锁预防

在死锁发生之前预防死锁非常重要。系统在执行每笔交易之前都会进行检查,以确保它不会导致死锁情况。即使是一个微小的变化也可能导致死锁,并且它也不会允许进程执行。

这是一系列确保至少一个条件不成立的方法。

无抢占操作

无抢占——资源只能由持有它的进程在完成任务后自愿释放。

  • 如果一个持有某些资源但无法立即获得所需资源的进程,在这种情况下,所有资源都将被释放。
  • 被抢占的资源需要一个等待该进程的资源列表。
  • 进程只有在能够重新获取其旧资源和它正在请求的新资源时才会被重新启动。
  • 如果进程请求的其他资源可用,那么它将被提供给请求进程。
  • 如果它被另一个等待其他资源的进程持有,我们释放它并将其提供给请求进程。

互斥

互斥是 Mutex 的完整形式。它是一种特殊的二元信号量,用于控制对共享资源的访问。它包括优先级继承机制,以避免扩展的优先级反转问题。它允许当前优先级较高的任务被阻塞的时间尽可能短。

像只读文件这样的共享资源永远不会导致死锁,但像打印机和磁带驱动器这样的资源需要单个进程的独占访问。

持有并等待

在这种情况下,进程在等待一个或多个其他资源的同时,必须停止持有单个或多个资源。

循环等待

它强制对所有资源类型进行总排序。循环等待还要求每个进程按枚举的递增顺序请求资源。

死锁避免算法

最好避免死锁,而不是在死锁发生后采取行动。它需要额外的信息,例如资源的使用方式。死锁避免是最简单也是最有用的模型,即每个进程声明它可能需要的每种资源的最大数量。

避免算法

死锁避免算法可以帮助您动态评估资源分配状态,从而永远不会出现循环等待情况。

单个实例的资源类型。

  • 使用资源分配图
  • 周期是死锁的必要充分条件

多个实例的资源类型。

  • 周期是必要的,但并非死锁的充分条件。
  • 使用 银行家算法

饥饿与死锁的区别

以下是死锁和饥饿之间的一些重要区别

死锁 饥饿
当一个进程被阻塞时,就会发生死锁情况。 饥饿是一种所有低优先级进程被阻塞,而高优先级进程执行的情况。
死锁是一个无限过程。 饥饿是长时间等待,但不是无限过程。
每个死锁都有饥饿。 并非所有饥饿都必然导致死锁。
死锁发生时,互斥、持有并等待。此时,抢占和循环等待不同时发生。 它是由不受控制的优先级和资源管理引起的。

死锁的优点

使用死锁方法的优点/好处如下:

  • 此情况适用于执行单一活动突发的进程。
  • 死锁不需要抢占。
  • 适用于状态可以轻松保存和恢复的资源。
  • 可以通过编译时检查来实现。
  • 由于问题是在系统设计中解决的,因此不需要运行时计算。

死锁的缺点

使用死锁方法的缺点/不足如下:

  • 延迟进程启动
  • 进程必须知道未来的资源需求
  • 抢占频率高于必要。
  • 不允许增量资源请求。
  • 固有的抢占损失。

摘要

  • 死锁定义:它是操作系统中发生的一种情况,当任何进程进入等待状态,因为另一个等待进程持有所需的资源。
  • 循环等待发生在当一个进程等待另一个进程持有的资源,而第二个进程又在等待第三个进程持有的资源,以此类推。
  • 死锁的发生可以由资源调度程序检测到。
  • 在死锁发生之前预防死锁非常重要。
  • 资源只能由持有它的进程在完成任务后自愿释放。
  • 互斥是 Mutex 的完整形式。它是一种特殊的二元 信号量,用于控制对共享资源的访问。
  • 持有并等待是一种情况,即进程在等待一个或多个其他资源的同时,必须停止持有单个或多个资源。
  • 死锁避免是最简单也是最有用的模型,即每个进程声明它可能需要的每种资源的最大数量。
  • 死锁避免算法可以帮助您动态评估资源分配状态,从而永远不会出现循环等待情况。
  • 死锁是一个无限过程,而饥饿是长时间等待但不是无限过程。