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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试和设置(或其他原子RMW操作)是否是任何架构上的特权指令?相关的知识,希望对你有一定的参考价值。

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

我认为他们没有特权,可以在用户空间中调用。但http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html似乎暗示不然。但是,在某些条件下,futex(7)可以在没有系统调用的情况下实现锁定,这意味着它必须在没有特权的情况下执行指令(如测试和设置)。

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

答案

那页错了。它似乎声称无锁原子操作一般在ISA上具有特权,但事实并非如此。我从来没有听说过一个原子测试和设置或任何其他无锁操作需要内核模式。

如果是这种情况,则需要C++11 lock-free atomic read-modify-write operations编译为系统调用,但它们不适用于x86,ARM,AArch64,MIPS,PowerPC或任何其他普通CPU。 (试试https://godbolt.org/)。

它也会使“轻量级”锁定(试图在没有系统调用的情况下锁定)成为不可能。 (http://preshing.com/20111124/always-use-a-lightweight-mutex/

正常的ISA允许用户空间执行原子RMW操作,在线程之间共享的内存上,甚至在单独的进程之间。我不知道在x86上禁用用户空间的原子RMW的机制。即使在任何ISA上都有这样的东西,它也不是正常的操作模式。

只读或只写访问通常在所有ISA上的对齐位置上自然是原子的,达到一定宽度(Why is integer assignment on a naturally aligned variable atomic on x86?),但原子RMW确实需要硬件支持。


在x86上,TAS是lock bts,它是无特权的。 (Documentation for the lock prefix)。 x86有很多其他原子操作选择,比如lock add [mem], reg/immediatelock cmpxchg [mem], reg,甚至lock xadd [mem], reg,它们在需要返回值时实现fetch_add。 (Can num++ be atomic for 'int num'?

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


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

这是轻量级锁定所使用的回退机制,以防有争用,提供操作系统辅助的睡眠/唤醒。因此,futex本身不会在用户空间中执行任何操作,而是围绕futex构建的锁定实现可以避免在无争用或低争用情况下进行系统调用。

(例如,如果锁定可用,则在用户空间中旋转几次。)

这就是futex(7)手册页所描述的内容。但是如果你实际上没有进行系统调用,我觉得把它称为“futex操作”有点奇怪。我猜它是在内存代码可能会代表正在等待的其他线程查看的内存上运行的,因此用于修改用户空间代码中的内存位置的必要语义取决于futex

以上是关于测试和设置(或其他原子RMW操作)是否是任何架构上的特权指令?的主要内容,如果未能解决你的问题,请参考以下文章

Aarch64 上 C++11 原子的部分重新排序

保证原子性的单比特操作

原子操作成本

是否可以在使用 Angularjs 的网站上使用 Optimizely(或其他 DOM 操作 A/B 测试工具)?

是否有任何选项可以使用 tsc 或 ts-node 或其他任何东西更快地编译和运行 ts 代码?

不同场景下的CUDA原子操作性能