是x86 CMPXCHG原子,如果是这样,为什么需要LOCK?

Ale*_*Suo 10 concurrency x86 compare-and-swap

Intel的文档

该指令可以与LOCK前缀一起使用,以允许指令以原子方式执行.

我的问题是

  1. 可以CMPXCHG用内存地址操作吗?从文档看来似乎没有,但任何人都可以确认只能在寄存器中使用实际的VALUE,而不是内存地址吗?

  2. 如果CMPXCHG不是原子级和高级语言级CAS必须通过LOCK CMPXCHG(带LOCK前缀)来实现,那么引入这样一条指令的目的是什么?

Pet*_*des 23

这似乎是你真正要求的一部分:

为什么不使用内存操作数lock隐含前缀cmpxchg,就像它一样xchg

简单的答案(其他人给出的)就是英特尔以这种方式设计它.但这导致了一个问题:

为什么英特尔这样做?是否有一个用例的cmpxchglock

在单CPU系统上,相对于其他线程或在同一CPU内核上运行的任何其他代码cmpxchg 原子的.(但不是"系统"观察者,如内存映射I/O设备,或者是正常内存的DMA读取设备,因此lock cmpxchg即使在单处理器CPU设计上也是如此).

上下文切换只能发生在中断上,中断发生在指令之前或之后,而不是在中间.在同一CPU上运行的任何代码都会将其cmpxchg视为完全执行或根本不执行.


例如,Linux内核通常使用SMP支持进行编译,因此它lock cmpxchg用于原子CAS.但是当在单处理器系统上启动时,它会将lock前缀修补到nop代码内联的任何地方,因为nop cmpxchg运行速度比快lock cmpxchg.有关更多信息,请参阅此LWN有关Linux的"SMP替代"系统的文章.它甚至可以lock在热插拔第二个CPU之前修补回前缀.

在这个答案中阅读更多关于单处理器系统上单个指令的原子性的信息,并在@ supercat的答案+注释中可以num++是原子的int num.请参阅我的答案,了解有关原子性如何实现/为读 - 修改 - 写指令实现的大量详细信息lock cmpxchg.


(同样的推理也适用于cmpxchg8b/ cmpxchg16b,并且xadd通常仅用于同步/原子操作,而不是使单线程代码运行得更快.显然,内存目的地add [mem], reglock add [mem], reg案例之外是有用的.)

  • @AlexSuo:不,Linux 的 [SMP 替代方案](https://lwn.net/Articles/164121/) 系统确实修补了 UP 系统上的内核映像。(顺便说一句,如果这纯粹是一个编译时的事情,这将取决于你是否正在构建 *for* UP 系统,而不是 *on* UP 系统。我想如果你省略 `CONFIG_SMP`,一些锁定 /同步的东西可以完全省去,而不是在启动时修补到 NOP 中。但现在可能没有那么多,尤其是使用标准的“CONFIG_PREEMPT”允许抢占内核代码。) (2认同)
  • @AlexSuo,恕我直言,这个答案应该被选为可接受的答案。 (2认同)
  • LOCK 前缀更改为 DS: 段覆盖前缀,而不是单独的 NOP 指令。这个 2008 年补丁因正确性问题而进行了更改(但它也更有效):https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id =f88f07e0 (2认同)

Hol*_*ger 13

您正在将高级锁与正好命名的低级CPU功能混合在一起LOCK.

无锁算法试图避免的高级锁可以保护执行可能需要任意时间的任意代码片段,因此,这些锁必须将线程置于等待状态,直到锁可用,这是一项代价高昂的操作,例如暗示维护等待线程的队列.

这与CPU LOCK前缀功能完全不同,后者仅保护单个指令,因此可能仅在该单个指令的持续时间内保留其他线程.由于这是由CPU本身实现的,因此不需要额外的软件工作.

因此,开发无锁算法的挑战并不是完全消除同步,它归结为将代码的关键部分减少到由CPU本身提供的单个原子操作.

  • @Peter Cordes:OP的实际问题在[本评论]中显而易见(/sf/ask/1948641201/?noredirect=1#comment44084729_27837731).在OP承认高级锁和指令前缀之间的混淆是实际问题后,我才发布了答案.您的添加对于将来的读者在搜索"锁定前缀"后找到此问题仍然有价值. (4认同)
  • @Rohit Sachan:您可以说它拥有BUS锁,但是由于它对每个内存访问都有效,所以唯一的区别在于,它是为一条指令进行的两次内存访问而持有的,更重要的是,它在交谈时只会造成混乱关于“无锁编程”。换句话说,您应该始终关心讨论是关于硬件还是软件体系结构…… (3认同)
  • 我认为OP部分地问"没有'锁定'的'cmpxchg`有什么意义?".请参阅[我的回答](/sf/ask/1948641201/#44273130):英特尔以这种方式设计它,因为它在单处理器系统上很有用. (3认同)
  • 啊我明白了。难怪这个问题没有得到太多关注。我只是在整理我的一些旧答案时在相关列表中注意到了它,并没有浏览所有评论。 (2认同)

归档时间:

查看次数:

8761 次

最近记录:

6 年,10 月 前