与 CAS(比较和交换)相比,LL/SC 的优势是啥?

Posted

技术标签:

【中文标题】与 CAS(比较和交换)相比,LL/SC 的优势是啥?【英文标题】:What' s the advantage of LL/SC when compared with CAS (compare-and-swap)?与 CAS(比较和交换)相比,LL/SC 的优势是什么? 【发布时间】:2015-08-19 14:02:22 【问题描述】:

在计算机体系结构中,LL/SC 与 CAS(比较和交换)相比有什么优势?我认为 LL/SC 可以在多核系统中解决活锁问题,并解决 ABA 问题,但 CAS 不能。与 CAS 相比,我找不到 LL/SC 的任何优势。谁能告诉我?

【问题讨论】:

有一个基本的比较here。 感谢您的回答。对比太简单了。我想知道详细的性能对比。 【参考方案1】:

由于没有人回答,LL/SC 不会遇到 ABA 问题,因为如果 LL 引用的地址被修改,条件存储将失败。此外,它不能活锁,因为一个或多个 LL/SC 对失败意味着另一个成功。 CAS 也可能更昂贵,因为它可能需要刷新无效队列。

【讨论】:

感谢您的回答。现在我知道 LL/SC 完全不会受到 ABA 问题的影响,因为上下文切换会导致 SC 失败。但是,当 LL 和 SC 之间的其他核心发生太多其他 LL(s) 时,就会出现 case livelock,因为其他核心的 LL 会导致 SC 失败。 @winter 我不确定我是否完全理解您的描述。您能否用您不理解或您想知道的内容更新您的问题? 使用 LL/SC 的实现在某些情况下会产生活锁情况。我认为基本情况是两个硬件线程使彼此的 LL/SC 操作无效。这就是为什么在 LC 和 SC 之间可以做的事情受到限制的原因。另请参阅yarchive.net/comp/linux/cmpxchg_ll_sc_portability.html 和 RISC-V 手册,特别讨论 LR/SC 和“受约束的 LR/SC 序列”。 @Flow:这不是一个线程在 它自己的 LL 和 SC 之间所做的事情,这就是问题所在,甚至是 MESI 共享请求(用于对缓存的只读访问)行)会导致 SC 发生故障。 (因为之前拥有它的核心必须从 Modified 或 Exclusive 状态转换出来,并且 SC 依赖于自 LL 以来一直处于这些状态之一的线路,从而保证没有其他核心可以看到原子操作的内部)。我猜高性能多核 CPU 倾向于延迟 MESI 响应,以让 LL/SC 有更多机会完成并避免活锁等。

以上是关于与 CAS(比较和交换)相比,LL/SC 的优势是啥?的主要内容,如果未能解决你的问题,请参考以下文章

AtomicInteger的CAS原理

动态BGP与静态BGP相比的优势都有哪些

CAS

如何在 C++ 中为共享计数器实现简单的比较和交换

哪些 CPU 架构支持比较和交换 (CAS)?

Java并发编程实战 第15章 原子变量和非阻塞同步机制