硬件结构-缓存一致性

什么是缓存一致性?缓存一致性是怎么做到的?写传播/事务顺序性是用什么技术实现的?MESI协议是什么?

1. 什么是缓存一致性?

2. 缓存一致性是怎么实现的?

3. 什么是MESI协议?

缓存一致性通过:写传播,事务串行化实现;

写传播,事务串行化通过MESI协议实现;

  1. 核心A对应线程a,核心B对应线程b;
  2. 当a,b两个线程同时加载相同的Cache Line,对应Cache Line被标记为共享状态;
  3. 此时,核心A修改Cache Line中的数据:
    • 核心A中对应的Cache Line被标记为已修改状态;
    • 核心B中对应的Cache Line被标记为已失效状态;
  4. 此时,核心B试图修改Cache Line中的数据:
    • 由于核心B对应Cache Line被标记为已失效,核心A对应Cache Line被标记为已修改;
    • 首先先把核心A中的对应的Cache Line写回内存;
    • 核心B再从内存读取Cache Line大小数据到Cache中;
    • 最后修改核心B中的对应Cache Line的数据,并标记为已修改;
    • 此时,核心A中对应的Cache Line则被标记为已失效;

但是上述过程会引出一个性能上的问题,即伪共享。

3.1 什么是伪共享?

由于CPU从内存中读数据是以Cache Line为单位,当多个核心读取相同内存块的Cache Line时,写操作作用于相同Cache Line,但是作用于Cache Line中不同的数据时,也会执行上述过程,无形中增加了性能上的开销。这个问题被称为伪共享。

3.2 如何避免伪共享?

通过给变量添加宏定义 __cacheline_aligned_in_smp来避免伪共享问题。

底层原理是:将连续内存上存储的变量,本来应该是缓存在同一个Cache Line中的,现在利用字节填充,将它们缓存在不同Cache Line中。

4. 为什么[已修改]状态不需要发送广播?


硬件结构-缓存一致性
http://example.com/2025/05/11/OperatingSystem/硬件结构-缓存一致性/
作者
ZhangHangming
发布于
2025年5月11日
许可协议