MESI缓存一致性协议
整理一下一些计算机的基础概念。
概念
- MESI(Modified, Exclusive, Shared, Invalid) 也称 Illinois 协议, 由美帝UIUC(University of Illinois at Urbana Champaign, 本人表弟目前就读的学校, 计算机系美帝5th, 刚知道...)提出, 是一种被广泛使用的支持回写策略的缓存一致性协议。
- 回写高速缓存可以节省很多通常在写入缓存上浪费的带宽, 但其中会存有脏状态(缓存中数据与主存储器中的数据不同) 。
- 相对于MSI(不是微星协议哈)协议减少了主存储器事务的数量, 从而获得了性能上的提升。
- 缓存行(Cache line): 缓存存储数据的单元。
MESI 协议中的状态
- CPU中每个缓存行(cache line) 使用4种状态进行标记(用额外的两位(bit)表示):
- M: Modified(被修改过)
- 该缓存行有效, 但是数据有脏状态(和内存中的数据不一致, 数据只存在于本Cache中)
- 缓存行必须时刻监听所有试图读该缓存行相对旧主存的操作, 该操作必须在缓存中将缓存行写回主存中并将状态改为共享的(Shared)状态之前被延迟执行
- E: Exclusive(被排除的, 独占的)
- 该缓存行有效, 数据和内存中的数据一致, 数据只存在于本缓存中
- 缓存行也必须监听其他缓存读主存中该缓存行的操作, 一旦有该操作, 该缓存行需要变成共享转态
- S: Shared(共享的)
- 该缓存行有效, 数据和内存中的数据一致, 数据存在于很多缓存中
- 缓存行也必须监听其他缓存使该缓存行无效或者独占该缓存行的请求, 并将该缓存行变成无效的(Invalid)。
- I: Invalid(无效的)
- 此缓存行无效(未被使用)
- M: Modified(被修改过)
MESI转态转化图
-
状态之间的转换关系表(当成临接矩阵来看)
M(Modified) E(Exclusive) S(Shared) I(Invalid) M(Modified) × × × √ E(Exclusive) × × × √ S(Shared) × × √ √ I(Invalid) √ √ √ √ -
缓存(cache)分类
- 分类前提: 所有的cache共同缓存了主内存中的某一条数据。
- local cache(本地缓存): 指当前cpu的缓存
- action cache(触发缓存): 触发读写事件的缓存
- other cache(其他缓存): 除以上外其他缓存
状态 触发本地读取 触发本地写入 触发远端读取 触发远端写入 M状态(修改) 本地cache: M 触发cache:M 其他cache:I 本地cache:M 触发cache:M 其他cache:I 本地cache:M→E→S 触发cache:I→S 其他cache:I→S 同步主内存后修改为E独享,同步触发、其他cache后本地、触发、其他cache修改为S共享 本地cache:M→E→S→I 触发cache:I→S→E→M 其他cache:I→S→I 同步和读取一样,同步完成后触发cache改为M,本地、其他cache改为I E状态(独享) 本地cache:E 触发cache:E 其他cache:I 本地cache:E→M 触发cache:E→M 其他cache:I 本地cache变更为M,其他cache状态应当是I(无效) 本地cache:E→S 触发cache:I→S 其他cache:I→S 当其他cache要读取该数据时,其他、触发、本地cache都被设置为S(共享) 本地cache:E→S→I 触发cache:I→S→E→M 其他cache:I→S→I 当触发cache修改本地cache独享数据时时,将本地、触发、其他cache修改为S共享.然后触发cache修改为独享,其他、本地cache修改为I(无效),触发cache再修改为M S状态(共享) 本地cache:S 触发cache:S 其他cache:S 本地cache:S→E→M 触发cache:S→E→M 其他cache:S→I 当本地cache修改时,将本地cache修改为E,其他cache修改为I,然后再将本地cache为M状态 本地cache:S 触发cache:S 其他cache:S 本地cache:S→I 触发cache:S→E→M 其他cache:S→I 当触发cache要修改本地共享数据时,触发cache修改为E(独享),本地、其他cache修改为I(无效),触发cache再次修改为M(修改) I状态(无效) 本地cache:I→S 或者I→E 触发cache:I→S或者I →E 其他cache:E、M、I→S、I 本地、触发cache将从I无效修改为S共享或者E独享,其他cache将从E、M、I 变为S或者I 本地cache:I→S→E→M 触发cache:I→S→E→M 其他cache:M、E、S→S→I 既然是本cache是I,其他cache操作与它无关 既然是本cache是I,其他cache操作与它无关