
缓存一致性

cache coherence
多核处理器
时钟频率受到流水线中最慢阶段的限制 -> 将流水线中比较长的部分进行细分 -> 将流水线转换成更多更短阶段但更深的超流水线
但是过高的频率带来了高功耗,也就从追求高频而转向了多核
CPU 缓存
在现代多核CPU中,一般每个核心独立拥有一个L1 Cache + L2 Cache
所有核心共享L3 Cache
在主存和寄存器之间引入高速缓存,就有了下面几个问题
- 映像规则:当把一个块调入高一层存储器时,可以放到哪些位置上
- 查找方法:如何找到该块
- 替换算法:当发生失效时,应该替换哪一块
- 写策略:当进行写访问时,应进行哪些操作
当然,这些问题也存在于磁盘和主存之间
由于现代处理器采用的 write-back 策略,在多核处理器中就遇到了一致性问题
缓存一致性问题
缓存一致性:不同存储节点中同一条数据副本之间不一致的问题
需要一种协议或者叫机制来同步两个不同核心内的缓存数据
- 某个CPU核心里的Cache数据更新时,必须要传播到其他核心的Cache,称为写传播 (Write Propagation)
- 某个CPU核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的, 称为事务的串形化 (Transaction Serialization)
写传播很好理解,而事务的串行化是指不同的CPU核心要看到相同顺序的数据变化,所有核心收到的更新变化都应该是相同的
一致性内存系统:所有处理器在任何时刻对每一个内促位置的最后一个全局写入值有一个一致的视图
一致性缓存提供了迁移的能力, 可以将数据项移动到本地缓存中, 并以透明的方式加以使用. 这种迁移既缩短了访问远程共享数据项的延迟, 也降低了对共享存储器的带宽要求
实现缓存一致性协议的关键在于跟踪数据块的所有共享状态, 那么就需要来维护数据的相关性 (coherence) 和一致性 (consistency)
- 相关性 (coherence):一个数据项的任何读均可得到该数据最近被写的值
- 一致性 (consistency):一个处理器何时读到另一处理器最近更新的内容
缓存一致性协议
实现缓存一致性协议的关键在于跟踪数据块的所有共享状态, 目前使用的协议有两类, 分别是监听协议(snooping, 也可以叫嗅探)和目录协议(directory-based)
监听协议 MSI MESI
当某个 CPU 核心更新了 Cache 中的数据,要把该事件广播通知到其他核心,与此同时处理器会监听来自总线上广播事件,如果当前 CPU 的缓存中有该缓存块的副本则应该以某种方式做出更新
监听协议的实现分为:写入失效 (write invalid protocal) 和写入更新 (write update/boardcast)
写入失效
写入