我还有一些额外的问题:忙碌等待的一些问题是什么,在什么情况下使用忙碌等待是否合适?有忙于等待的替代方案吗?
答案 0 :(得分:1)
在操作系统的上下文中,为什么像testAndSet这样的原子指令需要实现互斥?
这是必需的,因为通常给定的执行线程不知道何时可以暂停执行。假设您必须执行检查机器指令,然后执行设置机器指令。在进行"检查"之后(尽管可能发生小的可能性)是可能的。指令核心接受中断,内核切换到第二个线程,该线程运行检查并在同一个互斥锁上设置指令。现在,当原始线程继续时,它认为它可以使用互斥锁,因为已通过"检查"指令,运行"设置"指令,现在我们有两个线程在相互排除的代码中运行,很可能会崩溃您的程序或内核!但是,如果"设置并检查"教学以原子方式进行,我们不必担心陷入这种情况。
此外,一些体系结构原子集指令也可以确保更改通过各种缓存正确有效地传播,以便其他内核可以访问相同的互斥锁。
忙碌等待有什么问题
有忙于等待的替代方案吗?
主要问题是,当核心忙于等待时,其他线程无法前进。为了解决这个问题,OS的调度程序可以停止执行等待互斥锁的线程并让另一个线程运行。释放互斥锁后,调度程序可以继续执行在互斥锁上阻塞的线程。
在什么情况下使用忙碌的等待是可以/适当的
有时当互斥锁只持续一小段时间时,最好忙于等待互斥锁变为空闲然后将执行切换到另一个线程。这主要归功于上下文切换(跳转执行到不同的线程)这一事实可能是一个耗时的过程。如果互斥锁保持足够短的持续时间,则上下文切换所花费的时间将大于忙于等待的时间。