"互斥"之间有什么区别吗?和"原子操作"?

时间:2015-09-29 00:23:42

标签: multithreading operating-system

我现在正在学习操作系统,我对两个概念感到困惑 - 互斥原子操作。在我的理解中,它们是相同的,但我的操作系统老师给了我们这样一个问题,

  

假设多处理器操作系统内核跟踪每个用户创建的进程数。此操作系统内核为每个用户维护一个计数器变量,每次为用户创建新进程时它都会递增,并在每次从该用户终止进程时递减。此外,该操作系统在提供原子提取和递增以及提取和递减指令的处理器上运行。   操作系统是否应使用原子递增和递减指令更新计数器,还是应更新受互斥锁保护的临界区中的计数器?

这个问题表明互斥和原子操作是两回事。任何人都可以帮我吗?

3 个答案:

答案 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-incrementfetch-decrement应该是原子的,因此您不需要使用互斥锁。

原子操作使用低级/硬件级别锁来进行一些操作ATOMIC:虚拟地在一个转/ cpu周期中执行的操作。因此,原子操作永远不会将系统置于不一致状态

修改

No Atomic和Mutex不是同一个东西,而是两个相反的用于确保系统状态不会变得不一致的相同目的。您使用Mutex进行非ATOMIC操作,而对于ATOMIC操作则不使用Mutex。

答案 2 :(得分:0)

如果您是一个菜鸟,我的答案可能是一个不错的起点。我刚刚了解了这些方法的工作原理,并觉得我处于中继的好位置。

通常,这两种方法都是避免在阅读一半写的东西时发生坏事的方法。


Mutex

互斥锁就像是小企业洗手间的钥匙。只有一个人拥有钥匙,因此,如果有其他人出现,他们可能必须等待。这是摩擦:

  • 如果有人拿着钥匙走了,那么等待的人就永远不会停止等待。
  • 没有什么可以阻止其他一些过程来自己制造通往浴室的门了。

在代码的上下文中,互斥锁主要是关键部分,而人是一个过程。


原子

原子意味着不能分解成更小的步骤。在自然界中,没有CPU时钟-因此我们所做的一切都可能是较小的步骤-但我们假装...

在键盘上键入内容时,按下的每个键都是一个原子动作。它一次全部发生,并且您不能完全同时按下两个键。这有什么好处:

  • 无需等待:没有同时按下两个键的事实并不是因为一个必须等​​待。这是因为一个总是在下一个到达时完成。
  • 没有冲突:无论您付出多大的努力,都永远不会重叠两个字符。一个总是总是先于另一个发生。

举个反例,如果您尝试同时键入两个单词,那将是不是原子的。这些字母会混合在一起。

在代码上下文中,击键与运行单个CPU命令相同。队列中还有其他命令并不重要,您正在执行的命令将在下一个命令发生之前完全完成。

如果您可以原子地做某事,那么您就不必担心碰撞。但是在这些范围之内,并非一切都是可行的。通常,原子用于真正的低级操作-例如获取和设置基元(int,布尔值等)。对于将要运行一堆CPU命令但想要成为原子的任何事情,有一些技巧:

  1. 使用互斥锁。有点作弊,不是真的原子。但是有些事情做到了,并称自己为原子。
  2. 谨慎地编写代码,以使其在一行数据中永远不需要多条并发指令来保持正确。这一点会更深入,但有时可以做到。

从这里可以读到很多内容,以深入了解具体细节,但这足以使您对这个主题有基本的了解。