硬件提供原子指令,如测试和设置,比较和交换,负载链接存储条件。这些是特权指令吗?也就是说,只有OS才能执行它们(因此需要系统调用)吗?
我认为它们没有特权,可以在用户空间中调用。但是http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html似乎暗示了另一种情况。但是,futex(7)在某些情况下可以在没有系统调用的情况下实现锁定,这意味着它必须无特权地执行指令(如测试设置)。
矛盾?如果是这样,那是正确的吗?
答案 0 :(得分:8)
该页面有误。似乎声称无锁原子操作通常在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操作。我不知道有一种机制可以在用户空间上为用户空间禁用原子RMW x86。即使在任何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具有 wide 个其他原子操作的选择,例如lock add [mem], reg/immediate
,lock 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
。