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

什么是活锁?

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

活锁示例

例如1:

活锁最简单的例子是两个人在走廊里面对面相遇,他们都让开让对方通过。他们最终从一边移动到另一边,没有取得任何进展,因为他们当时的移动方向相同。在这种情况下,他们永远不会相遇。

例如2:

活锁示例

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

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

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

但这两个进程都没有被阻塞。它们反复消耗 CPU 资源而没有任何进展,并且也停止了任何处理阻塞。

因此,这种情况并不是 僵局 因为没有一个进程被阻塞,但是我们面临的情况相当于死锁,即LIVELOCK。

什么导致活锁?

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

什么是死锁?

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

死锁示例

  • 现实世界中的一个示例是仅朝一个方向行驶的交通。
  • 在这里,桥梁被视为一种资源。
  • 所以,当发生死锁时,只要有一辆车倒车(抢占资源并回滚)就可以轻松解决。
  • 如果出现死锁情况,可能需要几辆车倒车。
  • 因此饥饿是可能的。
死锁示例
死锁示例

什么是饥饿?

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

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

饥饿的例子

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

死锁、饥饿和活锁之间的区别

  • 死锁是操作系统中发生的一种情况,当任何进程进入等待状态时,因为所需资源被另一个等待进程持有。
  • 另一方面,活锁几乎与死锁类似,不同之处在于,涉及活锁的进程的状态总是不断地相互变化,没有任何进展。
  • 因此,活锁是资源匮乏的一个特殊例子。

总结

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

每日Guru99新闻简报

通过立即获取最新、最重要的人工智能新闻报道来开始您的一天。