Operating system 在操作系统的上下文中,为什么需要像testAndSet这样的原子指令来实现互斥?

Operating system 在操作系统的上下文中,为什么需要像testAndSet这样的原子指令来实现互斥?,operating-system,Operating System,我还有几个额外的问题:繁忙等待有哪些问题,在什么情况下使用繁忙等待可以/合适?除了忙着等待,还有别的选择吗 在操作系统的上下文中,为什么需要像testAndSet这样的原子指令来实现互斥 这是必需的,因为通常给定的执行线程不知道何时可以暂停执行。假设您必须先执行检查机器指令,然后执行设置机器指令。执行“检查”指令后,内核可能会中断,内核会切换到第二个线程,该线程会在同一个互斥体上运行检查和设置指令,这是可能的(尽管发生这种情况的可能性很小)。现在,当原始线程继续运行时,由于通过了“check”指

我还有几个额外的问题:繁忙等待有哪些问题,在什么情况下使用繁忙等待可以/合适?除了忙着等待,还有别的选择吗

在操作系统的上下文中,为什么需要像testAndSet这样的原子指令来实现互斥

这是必需的,因为通常给定的执行线程不知道何时可以暂停执行。假设您必须先执行检查机器指令,然后执行设置机器指令。执行“检查”指令后,内核可能会中断,内核会切换到第二个线程,该线程会在同一个互斥体上运行检查和设置指令,这是可能的(尽管发生这种情况的可能性很小)。现在,当原始线程继续运行时,由于通过了“check”指令,它认为可以接受互斥锁,运行“set”指令,现在我们有两个线程在相互排斥的代码中运行,这很可能会使程序或内核崩溃!但是,如果“set and check”指令是以原子方式执行的,那么我们就不必担心在这种情况下被捕获

此外,一些体系结构原子集指令还与确保更改正确有效地通过各种缓存传播有关,以便其他内核可以访问相同的互斥锁

忙着等待有什么问题

除了忙着等待,还有别的选择吗

主要的问题是,当一个内核忙于等待时,其他线程无法向前推进。为了解决这个问题,操作系统的调度程序可以停止执行等待互斥锁的线程,让另一个线程运行。释放互斥体后,调度程序可以恢复执行在互斥体上阻塞的线程

在什么情况下可以/适合使用繁忙等待


有时,当互斥锁仅保持很短的时间时,最好是忙碌地等待互斥锁变为空闲状态,然后将执行切换到另一个线程。这主要是由于上下文切换(将执行跳转到不同的线程)可能是一个耗时的过程。如果互斥锁被保持足够短的持续时间,那么上下文切换所花费的时间将超过正忙等待的时间。

因为如果测试和集合不是原子的,那么有人可以在锁的位置的测试和锁的位置的设置中间设置锁。