为什么CompareAndSwap指令被认为是昂贵的?
我读了一本书:
"内存障碍很昂贵,与原子compareAndSet()指令一样昂贵."
谢谢!
"CAS与正常商店的区别并不明显.有关CAS的一些错误信息可能源于英特尔处理器上最初的lock:cmpxchg(CAS)实现.lock:前缀导致LOCK#信号被置位,获得独占权访问总线.这当然没有扩展.随后的锁实现:cmpxchg利用缓存一致性协议 - 通常基于snoop的MESI - 并且不会断言LOCK#.- David Dice,HotSpot中的偏向锁定
"内存障碍很昂贵,与原子compareAndSet()指令一样昂贵."
这是真的.
例如,在x86上,多处理器系统上的正确CAS具有锁定前缀.
锁定前缀会导致完整的内存屏障:
"...锁定操作序列化所有未完成的加载和存储操作(即等待它们完成)." ......"锁定操作对于所有其他内存操作和所有外部可见事件都是原子操作.只有指令获取和页表访问才能传递锁定指令.锁定指令可用于同步由一个处理器写入的数据并由另一个处理器读取".- 英特尔®64和IA-32架构软件开发人员手册,第8.1.2章.
事实上,内存屏障实现为虚拟LOCK OR
或LOCK AND
在x86/x64上的.NET和JAVA JIT中实现.
在x86上,CAS会产生完整的内存屏障.
在PPC上,它是不同的.的LL/SC对- lwarx
&stwcx
-可用于存储器操作数加载到寄存器中,然后要么将它写回如果没有其他存储到目标位置,或重试整个循环,如果有.LL/SC可以被中断.
它也不意味着自动全栅栏.
不同体系结构的性能特征和行为可能会有很大差异.
但话说回来 - 弱LL/SC不是CAS.