标签:前缀 多处理器 基础上 数据 遇到 做了 cache 共享内存 类型
CAS全称Compare And Swap,是一种硬件级别的原子操作.
golang中的atomic包的CompareAndSwapXXX函数,针对不同类型的变量提供CAS操作,这些函数都需要提供3个值分别为
TEXT ·CompareAndSwapUint64(SB),NOSPLIT,$0-25
MOVQ addr+0(FP), BP
MOVQ old+8(FP), AX
MOVQ new+16(FP), CX
LOCK
CMPXCHGQ CX, 0(BP)
SETEQ swapped+24(FP)
RET
比较eax和目的操作数(第一个操作数)的值,如果相同,ZF标志被设置,同时源操作数(第二个操作)的值被写到目的操作数,否则,清除ZF标志,并且把目的操作数的值写回eax。
CMPXCHG 的工作原理:
比较 _old 和 (*__ptr) 的值,如果相同,ZF 标志被设置,同时 _new 的值被写到 (*__ptr),否则,清 ZF 标志,并且把 (*__ptr) 的值写回 _old。
在 Intel 平台下,会用 LOCK CMPXCHG 来实现,这里的 LOCK 是 CPU 锁。
Intel 的手册对 LOCK 前缀的说明如下:
CPU 锁主要分两种,总线锁和缓存锁。
总线锁就是使用 CPU 提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该 CPU 可以独占使用共享内存。总线锁的这种方式,在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。所以总线锁定的开销比较大,最新的处理器在某些场合下使用缓存锁定代替总线锁定来进行优化。
缓存锁定就是如果缓存在处理器缓存行中内存区域在 LOCK 操作期间被锁定,当它执行锁操作回写内存时,处理器不在总线上产生LOCK#信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改被两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时会对缓存行无效。
处理器无法使用缓存锁的情况。
虽然缓存锁可以大大降低 CPU 锁的执行开销,但是如果遇到多处理器之间的竞争程度很高或者指令访问的内存地址未对齐时,仍然会锁住总线。所以缓存锁常与总线锁相互配合。
标签:前缀 多处理器 基础上 数据 遇到 做了 cache 共享内存 类型
原文地址:https://www.cnblogs.com/quanee/p/11719932.html