用动图的方式,理解 CPU 缓存一致性协议!
扫描二维码
随时随地手机看文章
然后期间挺多人对 MESI 协议的转换有疑问,其实我在文章中把 MESI 协议状态切换的各个过程都总结成了一个表格,可能内容太多,很多小伙伴没有仔细看。就在昨天,我发现个可以「在线体验 MESI 协议状态转换」过程的网站,地址如下:https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm
我先给大家复习下 MESI 协议,然后再跟大家讲一些这个网站怎么用。
MESI 协议
MESI 协议其实是 4 个状态单词的开头字母缩写,分别是:- Modified,已修改
- Exclusive,独占
- Shared,共享
- Invalidated,已失效
网站体验
接下来说说,怎么玩这个网站。看上图,共分为三个部分:
- 第一部分,内存。显示内存地址和数据;
- 第二部分,CPU 缓存。显示 CPU 缓存的变量数据和 MESI 协议状态,因为我现在还没开始操作,所以显示的是空白。
- 第三部分,CPU 操作。共有三个 CPU,每个 CPU 都有各自的 Cache,CPU 操作分别「读」和「写」,这部分是我们手动操作的部分。
- 数据总线(Data Bus):在CPU与内存之间来回传送需要处理或是需要储存的数据。
- 地址总线(Adress Bus),用来指定在内存之中储存的数据的地址。
- shared,这个我也不知道是什么总线,网上没搜到资料,网站上最细那条总线就是这个名字,作用是控制 Cache 的数据状态。
可以看到,CPU1 和 CPU1 的 Cache 数据的状态都是 S(共享),和表格中表述的现象一致。别看我的结果是静态的,实际上当我操作完 CPU2 读取 a0 变量后,实际上是有动画效果的,这里有个小技巧,在动画的过程中,我们可以点击网站任意一个位置,就会暂停,然后再点击就开始,这样我们可以很清晰的知道这个状态过程是怎么通过这三个总线完成的。
我大概简述下过程:
- 点击 CPU2 的 read a0 操作;
- CPU2 会向地址总线,发送读取 a0 变量的数据的请求,此时该请求不仅会被内存收到,也会被其他 CPU 核心收到。
- CPU1 从地址总线得知,CPU2 发起的读取地址存在于 CPU1 Cache 里,于是 CPU1 Cache 里数据的状态会从 E(独占)变更为 S(共享);
- 内存收到 CPU2 发起的读取 a0 数据的请求后,就会通过数据总线将数据传递给 CPU2;
- 最后数据会写到 CPU2 Cache 里,且状态是 S(共享)。