cpu-cache_冲突文件_zkx_20240828215908
最后更新于
最后更新于
内存地址映射到 CPU Cache 地址里的策略有很多种,其中比较简单是直接映射 Cache
把内存地址转换为「 组标记 + 索引 + 偏移量」标记
CPU L1 Cache 分为数据缓存和指令缓存
对于数据缓存,我们在遍历数据的时候,应该按照内存布局的顺序操作
对于指令缓存,有规律的条件分支语句能够让 CPU 的分支预测器发挥作用
把数据同时写入内存和 Cache 中
当发生写操作时,新的数据仅仅被写入 Cache Block 里,只有当修改过的 Cache Block「被替换」时才需要写到内存中
需要一种机制,来同步两个不同核心里面的缓存数据
第一点,某个 CPU 核心里的 Cache 数据更新时,必须要传播到其他核心的 Cache,这个称为写传播(Write Propagation);
第二点,某个 CPU 核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的,这个称为事务的串行化(Transaction Serialization)。
CPU 核心对于 Cache 中数据的操作,需要同步给其他 CPU 核心;
要引入「锁」的概念,如果两个 CPU 核心里有相同数据的 Cache,那么对于这个 Cache 数据的更新,只有拿到了「锁」,才能进行对应的数据更新。
具体实现
总线嗅探
方式
当 A 号 CPU 核心修改了 L1 Cache 中 i 变量的值,通过总线把这个事件广播通知给其他所有的核心, 然后每个 CPU 核心都会监听总线上的广播事件,并检查是否有相同的数据在自己的 L1 Cache 里面, 并更新该数据
缺陷
一直都需要发出广播
不能保证事务串行化
MESI 协议
Modified,已修改
Exclusive,独占
Shared,共享
Invalidated,已失效
这四个状态来标记 Cache Line 四个不同的状态。
Cache line 状态机, 对 Cache line 在不同的状态下进行操作时, 会触发不同的总线机制和状态切换机制