从缓存和内存的更新关系看,写策略分为写回和写直达;
- 写回,对缓存的修改不会立刻传播到主存,只有当缓存块被替换时,这些被修改的缓存块,才会写回并覆盖内存中过时的数据;
- 写直达,缓存中任何一个字节的修改,都会立刻传播到内存
从写缓存时 CPU 之间的更新策略来看,写策略分为写更新和写无效;
-
写更新策略,每次它的缓存写入新的值,该 CPU 都必须发起一次总线请求,通知其他 CPU 将它们的缓存值更新为刚写入的值。
-
写无效,如果在一个 CPU 修改缓存时,将其他 CPU 中的缓存全部设置为无效。
从写缓存时数据是否被加载来看,写策略又分为写分配和写不分配。
- 写分配,在写入数据前将数据读入缓存
- 写不分配,在写入数据时,直接将要写入的数据传播内存,而并不将数据块读入缓存
MESI
缓存块的状态分为 4 种,也是 MESI 协议名字的由来:
- Modified(M):缓存块有效,但是是“脏”的,其数据与主存中的原始数据不同,同时还表示处理器对于该缓存块的唯一所有权,表示数据只在这个处理器的缓存上是有效的;
- Exclusive(E):缓存块是干净有效且唯一的;
- Shared(S):缓存块是有效且干净的,有多个处理器持有相同的缓存副本;
- Invalid(I):缓存块无效。
处理器对缓存的请求:
- PrRd:处理器请求从缓存块中读出;
- PrWr:处理器请求向缓存块写入。
总线对缓存的请求,分别是:
- BusRd:总线侦听到一个来自另一个处理器的读出缓存请求;
- BusRdX:总线侦听到来自另一个尚未取得该缓存块所有权的处理器读独占(或者写)缓存的请求;
- BusUpgr:侦听到一个其他处理器要写入本地缓存块上的数据的请求;
- Flush:总线侦听到一个缓存块被另一个处理器写回到主存的请求;
- FlushOpt:侦听到一个缓存块被放置在总线以提供给另一个处理器的请求,和 Flush 类似,但只不过是从缓存到缓存的传输请求。
MESI 协议通过引入了 Modified 和 Exclusive 两种状态,并且引入了处理器缓存之间可以相互同步的机制,非常有效地降低了 CPU 核间带宽。它是当前设计中进行 CPU 核间通讯的主流协议,被广泛地使用在各种 CPU 中。
此文章为7月Day15学习笔记,内容来源于极客时间《编程高手必学的内存知识》