测试和设置(或其他原子 RMW 操作)是任何体系结构上的特权指令吗?

Is test-and-set (or other atomic RMW operation) a privileged instruction on any architecture?

硬件提供原子指令,如测试和设置、比较和交换、加载链接存储条件。这些是特权指令吗?也就是说,只能 OS 执行它们(因此需要系统调用)?

我以为他们没有特权,可以在用户 space 中调用。但是http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html seems to suggest otherwise. But then, futex(7),在一定条件下,不需要系统调用就可以实现锁定,这意味着它必须在没有特权的情况下执行指令(如test-and-set)。

矛盾?如果是这样,哪个是对的?

那个页面是错误的。它似乎声称无锁原子操作通常在 ISA 上享有特权,但事实并非如此。我从未听说过原子测试和设置或任何其他无锁操作需要内核模式。

如果是这样的话,就需要 C++11 lock-free atomic read-modify-write operations to compile to system calls, but they don't on x86, ARM, AArch64, MIPS, PowerPC, or any other normal CPU. (try it on https://godbolt.org/).

它也会使 "light-weight" 锁定(试图在没有系统调用的情况下获取锁)变得不可能。 (http://preshing.com/20111124/always-use-a-lightweight-mutex/)

普通 ISA 允许用户 space 在线程之间甚至不同进程之间共享的内存上执行原子 RMW 操作。 我不知道有什么机制用于在 x86 上为 user-space 禁用原子 RMW。就算在任何ISA上都有这样的东西,也不是正常的运行方式。

只读或只写访问通常在所有 ISA 上的对齐位置自然是原子的,达到一定宽度 (),但原子 RMW 确实需要硬件支持。


在 x86 上,TAS 是 lock bts,它是无特权的。 (Documentation for the lock prefix). x86 has a wide selection of other atomic operations, like lock add [mem], reg/immediate, lock cmpxchg [mem], reg, and even lock xadd [mem], reg which implements fetch_add when the return value is needed. ()

大多数 RISC 都有 LL/SC,包括 ARM、MIPS 和 PowerPC,以及所有不再常见的旧 RISC ISA。


futex(2)是一个系统调用。如果你调用它,它所做的一切都是在内核模式下。

这是轻量级锁定在存在争用时使用的回退机制,它提供OS辅助sleep/wake。因此,在 user-space 中做任何事情的不是 futex 本身,而是围绕 futex 构建的锁实现可以避免在无竞争或低竞争情况下进行系统调用。

(例如,旋转 user-space 几次以防锁可用。)

这就是 futex(7) 手册页所描述的内容。但是我发现如果您实际上不进行系统调用,将其称为 "futex operation" 有点奇怪。我猜它是在内存上运行的,内核代码可能会代表正在等待的其他线程查看内存,因此在 user-space 代码中修改内存位置的必要语义取决于 futex.