关于RISC-V中LR/SC锁实现的效率与虚假失败问题咨询
关于LR/SC锁的效率优势与虚假失败问题解答
一、为什么带addi x12, x0, 1的LR/SC锁更高效?
对比原子交换与LR/SC锁的核心行为差异:
- 原子交换(
amoswap)的逻辑是无论锁是否被持有,每次尝试获取锁都会执行写操作:将寄存器中的1与锁地址的值交换,再判断返回值是否为0。这类写操作会强制让缓存行进入脏状态,必须通知其他核心的对应缓存行失效,带来额外的总线同步开销。 - 带
addi x12, x0, 1的LR/SC锁逻辑是:先用lr读取锁地址的值,仅当锁处于未锁定状态(值为0)时,才调用sc尝试写入1。若锁已被持有,循环内只会重复执行读操作与判断,不会触发写操作。此时缓存行可保持共享状态(MESI协议的S状态),无需触发总线无效化事务,大幅降低了总线带宽占用与核心间缓存同步的成本。
简言之,原子交换是“先写再判断”,而LR/SC版本是“先判断再写”,避免了锁被持有期间的无效写操作,因此更高效。
二、该LR/SC锁是否无法避免虚假失败?
你的判断是正确的。
LR/SC的“虚假失败”指:无其他线程修改目标锁地址,但sc指令仍执行失败。其根源在于LR/SC的硬件实现基于缓存行粒度:
- 只要锁所在的缓存行因其他操作(比如其他线程访问同一缓存行的其他地址、缓存行被系统回收驱逐、总线事务干扰等)失效或被驱逐,
sc就会返回失败,哪怕锁地址本身的值从未被修改。 - 书中的这个LR/SC锁实现未针对此类场景做额外处理,因此当缓存行发生上述非锁地址修改的变化时,
sc会出现虚假失败,导致循环重试。
内容的提问来源于stack exchange,提问作者An5Drama
相关产品推荐
相关产品推荐

