VivioJS-用于WWW的交互式可逆电子学习动画& raft 在线演示

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

  VivioJS-用于WWW的交互式可逆电子学习动画
  MESI缓存一致性协议

 


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

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

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

 
单击图表以激活动画,或单击此处获取全屏版本。

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

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

地址和数据总线上的通信方向分别由蓝色和红色箭头指示。事务中涉及的高速缓存行和内存位置显示为绿色。过时的内存位置被涂成灰色。

高速缓存行可以处于4种状态之一。无效:缓存行中不存在缓存行。独占性:仅存在于此缓存中的缓存行,与复制到内存中相同。修改:此缓存中仅存在缓存行,并且内存复制已过期(陈旧)。 共享:此高速缓存中的高速缓存行以及可能的其他高速缓存,所有副本与内存副本相同。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

raft 在线演示:http://thesecretlivesofdata.com/raft/

posted @ 2020-12-07 21:05  CharyGao  阅读(367)  评论(0编辑  收藏  举报