Compare-and-Swap 的 LR/SC 实现

821 阅读1分钟

image.png

image.png

硬件提供的原子性指令常见的有test and set, compare and swap。之所以compare and swap性能更优的原因,是在compare 不等的情况下,省去一次内存的写入。具体怎么实现其实是基于 Load-Reserved/Store-Conditional。Load-Reserved就是,在 load的时候,在内存上标记 reserved (盯上你了),中断、其他处理器写入都会导致标记消除。Store-Conditional就是,如果 “盯上” 未被解除,则写入。compare and swap 的话,compare 是一次load操作,load的同时放上一个标记,比较结果如果不符合预期,直接返回旧值, 如果符合预期,预备把新值写入内存,这个时候如果发现标记没了,就会重新开始(retry),直到成功写入为止。

而test and set, 就直接交换了。

compare and swap 不仅可以通过retry的方式实现原子操作,而且可以检测原子操作拥堵 (如果 store conditional failed 失败太多)。

为什么写内存耗费性能?不写可以省去cache line 多核广播