原子操作如何在硬件级别实现?

时间:2013-02-07 18:13:30

标签: language-agnostic x86 atomicity smp

我在汇编语言级别获得指令集架构提供比较和交换以及类似操作。但是,我不明白芯片是如何提供这些保证的。

正如我想象的那样,指令的执行必须

  1. 从内存中获取值
  2. 比较值
  3. 根据比较,可能在内存中存储另一个值
  4. 什么阻止另一个核心在第一个核心提取后但在设置新值之前访问内存地址?内存控制器是否管理这个?

    编辑:如果x86实现是秘密的,我会很高兴听到任何处理器系列如何实现它。

3 个答案:

答案 0 :(得分:28)

这是在software.intel.com上的article结束,这对用户级锁定没有什么了解:

  

用户级锁涉及利用的原子指令   处理器以原子方式更新内存空间。原子指令   涉及在指令上使用锁定前缀并具有   分配给内存地址的目标操作数。下列   指令可以在当前Intel上以锁定前缀原子运行   处理器:ADD,ADC,AND,BTC,BTR,BTS,CMPXCHG,CMPXCH8B,DEC,INC,   NEG,NOT,OR,SBB,SUB,XOR,XADD和XCHG。 [...]大多数说明   除xchg指令外,必须显式使用锁定前缀   如果指令涉及内存,则隐含锁定前缀   地址。

     

在英特尔486处理器的时代,锁定前缀用于断言a   锁定在公共汽车上以及性能的巨大打击。从...开始   在英特尔奔腾Pro架构中,总线锁被转换为   缓存锁定。最多仍然会在总线上锁定一个锁   现代架构,如果锁位于不可缓存的内存中或者如果   锁延伸超出缓存行边界分割缓存行。   这两种情况都不太可能,因此大多数锁前缀都是   变成了一个更便宜的缓存锁。

那么是什么阻止了另一个核心访问内存地址? cache coherency protocol已经管理了缓存行的访问权限。因此,如果核心具有(临时)对高速缓存行的独占访问权限,则没有其他核心可以访问该高速缓存行。要访问该缓存行,其他核心必须首先获取访问权限,获取这些权限的协议涉及当前所有者。实际上,缓存一致性协议可以防止其他内核静默访问缓存行。

如果锁定的访问权限未绑定到单个缓存行,则事情变得更加复杂。有各种令人讨厌的角落案例,例如锁定访问页面边界等。英特尔不会告诉细节,他们可能会使用各种技巧来加快锁定。

答案 1 :(得分:4)

此示例的实现是LL/SC,其中处理器实际上具有用于完成原子操作的额外指令。在内存方面,它是缓存一致性。最受欢迎的缓存一致性协议之一是MESI Protocol

答案 2 :(得分:0)

内存控制器只负责确保内存和放大器。不同处理器上的缓存保持一致 - 如果您在CPU1上写入内存,CPU2将无法从其缓存中读取其他内容。确保他们都试图操纵相同的数据并不是它的责任。有一些低级指令使用锁定和原子操作。这些在操作系统级别用于操作小块内存来创建互斥锁和信号量等内容,这些内容实际上是一个或两个字节的内存,需要对它们执行原子,同步操作。然后,应用程序在此基础上构建,以对更大的数据结构和资源执行操作。