代码之家  ›  专栏  ›  技术社区  ›  flow2k

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

  •  3
  • flow2k  · 技术社区  · 7 年前

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

    我认为它们没有特权,可以在用户空间中调用。但是 http://faculty.salina.k-state.edu/tim/ossg/IPC_sync/ts.html 似乎不这么认为。但是后来, futex(7)

    矛盾?如果是,哪一个是正确的?

    1 回复  |  直到 7 年前
        1
  •  9
  •   Peter Cordes    7 年前

    那一页错了

    如果是这样的话,那就需要 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/ )

    我不知道有什么机制可以在x86上为用户空间禁用原子RMW。即使任何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/immediate , lock cmpxchg [mem], reg ,甚至 lock xadd [mem], reg fetch_add 当需要返回值时。( Can num++ be atomic for 'int num'? )


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

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

    (例如,在用户空间旋转几次,以防锁定可用。)

    这就是 futex(7) .