我现在正在学习操作系统,我对两个概念感到困惑 - 互斥和原子操作。在我的理解中,它们是相同的,但我的操作系统老师给了我们这样一个问题,
假设多处理器操作系统内核跟踪每个用户创建的进程数。此操作系统内核为每个用户维护一个计数器变量,每次为用户创建新进程时它都会递增,并在每次从该用户终止进程时递减。此外,该操作系统在提供原子提取和递增以及提取和递减指令的处理器上运行。 操作系统是否应使用原子递增和递减指令更新计数器,还是应更新受互斥锁保护的临界区中的计数器?
这个问题表明互斥和原子操作是两回事。任何人都可以帮我吗?
答案 0 :(得分:9)
An atomic operation is one that cannot be subdivided into smaller parts. As such, it will never be halfway done, so you can guarantee that it will always be observed in a consistent state. For example, modern hardware implements atomic compare-and-swap operations.
A mutex (short for mutual exclusion) excludes other processes or threads from executing the same section of code (the critical section). Basically, it ensures that at most one thread is executing a given section of code. A mutex is also called a lock.
Underneath the hood, locks must be implemented using hardware somehow, and the implementation must make use of the atomicity guarantees of the underlying hardware.
Most nontrivial operations cannot be made atomic, so you must either use a lock to block other threads from operating while the critical section executes, or else you must carefully design a lock-free algorithm that ensures that all the critical state-changing operations can be safely implemented using atomic operations.
This is a very deep subject, and there is a large body of literature on all these topics. The Wikipedia links I've given are a good starting point, but since you're taking a class on operating systems right now, it might be best for you to ask your professor to provide good resources for learning and understanding this stuff.
答案 1 :(得分:2)
首先阅读@Daniel回答我的。
如果您的处理器提供足以完成任务的原子指令,则不需要Mutex /锁。在您的情况下,fetch-increment
和fetch-decrement
应该是原子的,因此您不需要使用互斥锁。
原子操作使用低级/硬件级别锁来进行一些操作ATOMIC:虚拟地在一个转/ cpu周期中执行的操作。因此,原子操作永远不会将系统置于不一致状态
修改强>
No Atomic和Mutex不是同一个东西,而是两个相反的用于确保系统状态不会变得不一致的相同目的。您使用Mutex进行非ATOMIC操作,而对于ATOMIC操作则不使用Mutex。
答案 2 :(得分:0)
如果您是一个菜鸟,我的答案可能是一个不错的起点。我刚刚了解了这些方法的工作原理,并觉得我处于中继的好位置。
通常,这两种方法都是避免在阅读一半写的东西时发生坏事的方法。
Mutex
互斥锁就像是小企业洗手间的钥匙。只有一个人拥有钥匙,因此,如果有其他人出现,他们可能必须等待。这是摩擦:
在代码的上下文中,互斥锁主要是关键部分,而人是一个过程。
原子
原子意味着不能分解成更小的步骤。在自然界中,没有CPU时钟-因此我们所做的一切都可能是较小的步骤-但我们假装...
在键盘上键入内容时,按下的每个键都是一个原子动作。它一次全部发生,并且您不能完全同时按下两个键。这有什么好处:
举个反例,如果您尝试同时键入两个单词,那将是不是原子的。这些字母会混合在一起。
在代码上下文中,击键与运行单个CPU命令相同。队列中还有其他命令并不重要,您正在执行的命令将在下一个命令发生之前完全完成。
如果您可以原子地做某事,那么您就不必担心碰撞。但是在这些范围之内,并非一切都是可行的。通常,原子用于真正的低级操作-例如获取和设置基元(int,布尔值等)。对于将要运行一堆CPU命令但想要成为原子的任何事情,有一些技巧:
从这里可以读到很多内容,以深入了解具体细节,但这足以使您对这个主题有基本的了解。