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

问题描述:

我还有一些其他问题:忙碌的等待中有哪些问题,以及在什么情况下可以使用忙碌的等待?有没有其他方法可以忙着等待?在操作系统的上下文中,为什么像testAndSet这样的原子指令需要实现互斥锁?

+0

因为如果测试和设置不是原子的,那么有人可能会在测试锁定位置和设置锁定位置时设置锁定。 – displayName

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

这是必需的,因为通常给定的执行线程不知道什么时候它的执行停止。假设您必须执行检查机器指令,然后执行机器指令。这是可能的(尽管可能发生这种情况的机会很小),在执行“检查”指令后,内核接受中断,内核切换到第二个线程,该线程运行检查并在同一个互斥量上设置指令。现在,当原始线程继续运行时,它认为它可能因为通过了“检查”指令而需要互斥体,运行“set”指令,现在我们有两个线程运行在相互排除的代码中,这很可能会导致程序或内核崩溃!但是,如果“设置和检查”指令是以原子方式执行的,我们不必担心会陷入这种情况。

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

有哪些等待

的问题忙是否有忙等待的方法吗?

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

在什么情况下是好/适合使用忙等待

有时,当只保持很短的时间最好是忙等待的互斥体成为*然后切换执行到互斥另一个线程。这主要归功于上下文切换(将执行跳转到不同的线程)可能是一个耗时的过程。如果互斥量保持足够短的时间,则花费在上下文切换上的时间将大于只是忙于等待的时间。