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



