MESI 缓存一致性协议

VivioJS MESI 帮助
https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm

这个 VivioJS 动画旨在帮助您了解 MESI 缓存一致性协议。

描述了一个多处理器系统,包括 3 个带有本地缓存​​和主存储器的 CPU。为简单起见,主存储器包括 4 个位置 a0、a1、a2 和 a3。缓存是直接映射的,包含两个集合。偶数地址(a0 和 a2)映射到设置 0,而奇数地址(a1 和 a3)映射到设置 1。

注意:为了简化这个动画,缓存行的大小和 CPU 读/写操作的大小是相同的。但是,在写入未命中时,CPU 会读取内存,即使它会完全覆盖缓存行。这模拟了真实缓存的行为,其中缓存行的大小通常大于 CPU 读/写操作的大小。

单击图表激活动画,或单击此处查看全屏版本。

每个 CPU 都包含按钮,用于在指定的内存位置启动读取或写入事务。“CPU 写入”将递增值(最初为 1)写入“内存”。

这个想法是按下按钮,看看你是否可以跟随发生的动作和状态转换。可以通过按右上角的“无错误”按钮将错误引入动画中。看看你是否可以确定错误是什么!

地址和数据总线上的流量方向分别由蓝色和红色箭头指示。事务中涉及的缓存行和内存位置为绿色。陈旧的内存位置是灰色的。

缓存线可以处于 4 种状态之一。无效:缓存中不存在缓存行。独家:缓存行仅存在于该缓存中,并且与内存中的副本相同。MODIFIED:仅在此缓存中存在缓存行并且内存副本已过期(陈旧)。 SHARED:此缓存中的缓存行,可能还有其他缓存,所有副本与内存副本相同。SHARED缓存线的写入是直写,而对EXCLUSIVE缓存线的写入是回写。如果高速缓存观察到它包含的地址的总线事务,它会断言共享总线线路。MESI 是一种无效缓存一致性协议。

这是缓存行的状态转换图:

MESI状态转移图

尝试的示例序列 [来自 RESET]

1 CPU0:读取a0 CPU0 从内存中读取 a0 [未共享] - 状态 E
2 CPU0:读取a0 CPU0 从缓存中读取 a0 - 状态 E
3 CPU0:写a0 CPU0 仅更新缓存中的 a0 - 状态 M
4 CPU0:写a0 CPU0 仅更新缓存中的 a0 - 状态 M
5 CPU1:读取a0 CPU1读取a0,CPU0缓存干预并向缓存和内存提供数据——状态S
6 CPU1:写a0 CPU1 更新缓存和内存中的 a0,并使地址为 a0 的所有其他缓存失效 - 状态 E
7 CPU1:写a0 CPU1 仅更新缓存中的 a0 - 状态 M
8 CPU0:写a0 CPU0 读取 a0,CPU1 缓存干预并向缓存和内存(S)提供数据,然后 CPU0 写入缓存和内存中的 a0,使地址为 a0 的所有其他缓存无效 - 状态
9 CPU0:写a2 CPU0 从内存(E)中读取 a2,然后写入 a2 - 状态 M
10 CPU0:写a0 CPU0 将 a2 刷新到内存,从内存 (E) 读取 a2,然后写入 a0 - 状态 M

=========================

工作机会(内部推荐):发送邮件至gaoyabing@126.com,看到会帮转内部HR。

邮件标题:X姓名X_X公司X_简历(如:张三_东方财富_简历),否则一律垃圾邮件!

公司信息:

  1. 1.东方财富|上海徐汇、南京|微信客户端查看职位(可自助提交信息,微信打开);
原文地址:https://www.cnblogs.com/Chary/p/15739096.html