活锁:什么是活锁,示例,与死锁的区别
什么是活锁?
A 活锁 是一种独占锁请求被反复拒绝的情况,因为许多重叠的共享锁不断相互干扰。进程不断改变其状态,这进一步阻止它们完成任务。这进一步阻止它们完成任务。
活锁示例
例如1:
活锁最简单的例子是两个人在走廊里面对面相遇,他们都让开让对方通过。他们最终从一边移动到另一边,没有取得任何进展,因为他们当时的移动方向相同。在这种情况下,他们永远不会相遇。
例如2:
您可以在上图中看到,两个给定进程中的每一个都需要两个资源,并且它们使用原始轮询进入注册表来尝试获取它们所需的锁。 如果尝试失败,则该方法再次起作用。
- 进程A持有Y资源
- 进程 B 持有资源 X
- 进程A需要X资源
- 流程B需要Y资源
假设,进程A先运行并获取数据资源X,然后进程B运行并获取资源Y,无论哪个进程先运行,它们都不会进一步进展。
但这两个进程都没有被阻塞。它们反复消耗 CPU 资源而没有任何进展,并且也停止了任何处理阻塞。
因此,这种情况并不是 僵局 因为没有一个进程被阻塞,但是我们面临的情况相当于死锁,即LIVELOCK。
什么导致活锁?
当特定系统中允许的进程总数应由进程表中的条目总数定义时,就会发生活锁。因此,进程表槽应称为有限资源。
什么是死锁?
死锁是操作系统中发生的一种情况,即任何进程进入等待状态,因为另一个等待进程正在占用所需资源。死锁是多进程处理中的一个常见问题,其中多个进程共享一种特定类型的互斥资源,称为软锁或软件锁。
死锁示例
- 现实世界中的一个示例是仅朝一个方向行驶的交通。
- 在这里,桥梁被视为一种资源。
- 所以,当发生死锁时,只要有一辆车倒车(抢占资源并回滚)就可以轻松解决。
- 如果出现死锁情况,可能需要几辆车倒车。
- 因此饥饿是可能的。
什么是饥饿?
饥饿是指所有低优先级进程都被阻塞,而高优先级进程继续运行的情况。在任何系统中,对高/低优先级资源的请求都会不断动态发生。因此,需要一些策略来决定谁在何时获得支持。
使用某些算法,某些进程即使没有死锁也可能无法获得所需的服务。当某些线程使共享资源长时间不可用时,就会发生饥饿。
饥饿的例子
例如,一个对象提供了一个同步方法,该方法可能需要很长时间才能返回。如果一个线程频繁使用此方法,其他也需要频繁同步访问同一对象的线程通常会被阻塞。
死锁、饥饿和活锁之间的区别
- 死锁是操作系统中发生的一种情况,当任何进程进入等待状态时,因为所需资源被另一个等待进程持有。
- 另一方面,活锁几乎与死锁类似,不同之处在于,涉及活锁的进程的状态总是不断地相互变化,没有任何进展。
- 因此,活锁是资源匮乏的一个特殊例子。
总结
- 定义:活锁是指由于许多重叠的共享锁不断相互干扰,导致独占锁请求反复被拒绝的情况。
- 当特定系统中允许的进程总数应由进程表中的条目总数定义时,就会发生活锁
- 死锁是操作系统中发生的一种情况,当任何进程进入等待状态,因为另一个等待进程正在持有所需的资源。
- 现实世界中的一个示例是仅朝一个方向行驶的交通。
- 活锁的一个例子是,两个人在走廊里面对面相遇,他们都让开一边让对方通过。
- 饥饿是指所有低优先级进程都被阻塞,而高优先级进程继续前进的情况。