活锁:什么是活锁,示例,与死锁的区别

什么是活锁?

活锁是指一个独占锁的请求被反复拒绝的情况,因为许多重叠的共享锁不断相互干扰。进程会不断改变它们的状态,这进一步阻止了它们完成任务。这进一步阻止了它们完成任务。

活锁的例子

示例 1

活锁最简单的例子是两个人脸对脸地在走廊里相遇,他们都向旁边让路,以便让对方通过。他们最终会左右摇摆,没有任何进展,因为他们在同一时间以相同的方式移动。在这里,他们从未互相通过。

示例 2

Examples of Livelock

您可以在上图中看到,两个给定的进程都需要两个资源,它们使用原始的轮询进入注册表来尝试获取它们所需的锁。如果尝试失败,该方法会再次工作。

  1. 进程 A 持有 Y 资源
  2. 进程 B 持有 X 资源
  3. 进程 A 需要 X 资源
  4. 进程 B 需要 Y 资源

假设进程 A 先运行并获取数据资源 X,然后进程 B 运行并获取资源 Y,无论哪个进程先运行,它们都无法进一步进展。

然而,这两个进程都没有被阻塞。它们会反复消耗 CPU 资源而没有任何进展,同时也阻止了任何处理块。

因此,这种情况不是死锁,因为没有一个进程被阻塞,但我们面临着一种等同于死锁的情况,那就是活锁。

导致活锁的原因是什么?

当一个特定系统中允许的进程总数应该由进程表中的条目总数来定义时,就会发生活锁。因此,进程表槽应被称为有限资源。

什么是死锁?

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

死锁示例

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

什么是饥饿?

饥饿是指所有低优先级进程都被阻塞,而高优先级进程继续进行的情况。在任何系统中,对高/低优先级资源的需求都会动态地发生。因此,需要某种策略来决定谁在何时获得支持。

使用一些算法,即使某些进程没有被死锁,也可能无法获得所需的“服务”。当某些线程使共享资源在很长一段时间内不可用时,就会发生饥饿。

饥饿的例子

例如,一个对象提供了一个可能需要很长时间才能返回的同步方法。如果一个线程频繁使用此方法,其他需要频繁同步访问同一对象的线程将经常被阻塞。

死锁、饥饿和活锁的区别

  • 死锁是指在操作系统中,当任何进程因另一个等待进程持有所需资源而进入等待状态的情况。
  • 另一方面,活锁几乎与死锁相似,不同之处在于参与活锁的进程状态总是在不断变化,但没有一个进程能取得进展。
  • 所以,活锁是饥饿的一种独特情况。

摘要

  • 定义:活锁是指一个独占锁的请求被反复拒绝的情况,因为许多重叠的共享锁不断相互干扰。
  • 当一个特定系统中允许的进程总数应该由进程表中的条目总数来定义时,就会发生活锁。
  • 死锁是指在操作系统中,当任何进程因另一个等待进程持有所需资源而进入等待状态的情况。
  • 一个真实的例子是交通,它只朝一个方向行驶。
  • 活锁的一个例子是两个人脸对脸地在走廊里相遇,他们都向旁边让路,以便让对方通过。
  • 饥饿是指所有低优先级进程都被阻塞,而高优先级进程继续进行的情况。