由SnpUniqueFwd和SnpUnique混合使用引发的思考
May 16th, 2026
No comments
一致性与内存屏障:一场在CHI总线上的花活
前几日,在 xhs 上刷到一则颇有意思的讨论:关于SnpUniqueFwd和SnpUnique混合使用的话题,以及这种混用究竟会在底层引发什么灾难性的影响。这个案例用来理解内存一致性、缓存一致性和可见性的关系非常有价值。在讨论这个哑谜之前,先得理清这两个概念的底牌是什么。
Coherence(缓存一致性)和 Consistency(内存一致性)有点关系,但不好说清。就拿王者荣耀举个例子:Coherence 就像是红蓝 Buff 的存活状态,不管玩家的网络延迟有多大,只要红 Buff 被打掉了,所有人最终看到这个野怪坑位肯定都是空的。这是Coherence 加持后的结果;而 Consistency 关乎的是因果律,它就像是英雄的连招顺序。比如对面打野先闪现(动作 1),再放大招秒人(动作 2)。被虐的玩家不应该看到:自己先掉血被秒了,然后对面打野才闪现过来。两个动作前后关系由Consistency 规定,但是每个动作能正常执行都必须依赖Coherence。
在多核架构的世界里,缓存分布在不同的核心上,依赖监听事务去同步。SnpUnique是一种非转发类型的监听请求(Non-forwarding snoop),为了获取缓存行的独占(Unique)副本,它会严谨地要求系统内所有持有该副本的节点立刻将缓存销毁(作废缓存,强制转换为 Invalid (I) 态)。属于妥妥的保守派。SnpUniqueFwd(Forwarding snoop),则是前...