缓存一致性协议

缓存一致性协议

简介

缓存一致性协议是为了解决多核以及多处理器的多个缓存之间的数据不一致提出来的,缓存一致性协议分为两种,第一种是基于窥探的协议(snoop-based),第二种是基于目录的协议(directory-based),基于窥探的协议在共享总线上广播一致信息,基于目录的协议能更好地扩展。MESI协议是基于目录的协议,本文主要讲述MESI协议。

MESI协议

MESI协议为cache block定义了四种状态,分别是Modified(M),Exclusive(E),Shared(S)和Invalid(I)。

  • Modified状态:当前cache block的内容与内存不同,是脏的(dirty),并且只有一个core拥有这个cache block的副本
  • Exclusive状态:当前cache block的内容与内存一致,是干净的(clean),并且只有一个core拥有这个cache block的副本
  • Shared状态:当前cache block的内容与内存一致,是干净的(clean),但是不止一个core拥有这个cache block的副本
  • Invalid状态:当前cache block的内容过时(无效)

举个不那么恰当的例子:
比如说现在有一个project,需要四个人(core)参与到coding工作,为了版本控制,我们将代码传到github(内存)上,四个人分别是甲乙丙丁,对应着core0,core1,core2和core3,每个人都有自己的计算机(local cache),平时在自己的计算机上coding。
现在,假设甲从github(内存)上下载(load)了某一个类文件(cache block)到他的计算机(甲的local cache),而乙丙丁的计算机并没有这个类文件(cache block)的副本,这时候甲独占着这个类文件的副本,并且和github(内存)上一样,所以此时这个类文件的状态是exclusive。
假设这时候丁也从github上下载了这个类文件到他的计算机上,这时候,这个类文件在甲和丁两个人的计算机上都有副本,并且和github上一样,所以此时这个类文件的状态是shared。
假设现在丁在自己的计算机上对这个类文件进行了修改,此时,甲的计算机上的这个类文件就过时了,成了invalid状态,而这个类文件的最新副本在丁的计算机上,且只有丁的计算机上有这个类文件的最新副本,同时这个类文件和github上的内容不一致,是脏的(dirty),所以这个类文件的状态就是modified。

下面是《大话处理器》书中MESI的状态迁移图,拿过来借用一下:
缓存一致性协议_第1张图片

  • local read代表着本内核读取本内核的cache中的数据,相当于甲在自己的计算机上阅读类文件
  • load write代表着本内核写本内核的cache中的数据,相当于甲在自己的计算机上修改类文件
  • remote read代表着其他内核读取其他内核的cache中的数据,假设我就是甲,那么乙丙丁就是其他人,这就相当于乙在乙的计算机上读取类文件
  • remote write代表着其他内核写其他内核的cache中的数据,同样,假设我是甲,这就相当于乙在乙的计算机上修改类文件。

MESI状态迁移:

  • 如果当前core的cache block状态是invalid

    • 那么当前core读取这个cache block(local read)的时候,考虑两种情况:
      • 如果其他core的cache上没有这个cache block的副本,那么从内存中加载,此时只有当前core拥有和内存中一致的cache block副本,所以转移到exclusive状态
      • 如果其他core的cache上有这个cache block的副本,那么从LLC中加载,此时不止一个core拥有和内存中一致的cache block副本,所以转移到shared状态
    • 当前core修改这个cache block(local write)的时候,这个cache block的内容与内存中不一致(dirty),并且只有当前core拥有这个最新的副本,所以转移到modified状态
    • 其他core读取这个cache block(remote read)以及其他core修改这个cache block(remote write)的时候,对当前core的cache中的cache block没有任何影响
  • 如果当前core的cache block状态是exclusive,

    • 那么当前core读取这个cache block(local read)的时候,当前core的cache block的状态还是exclusive,因为local read不会让其他core拥有这个cache block的副本,并且也不会对这个cache block进行修改
    • 当前core修改这个cache block(local write)的时候,因为对这个cache block进行了修改,也就和内存中不一致了,所以当前core的cache block转移到modified状态
    • 其他core读取这个cache block(remote read)的时候,其他core的cache中也会拥有这个cache block的副本,所以此时当前core的cache block转移到shared状态
    • 其他core修改这个cache block(remote write)的时候,当前core的cache block数据过时,不再有效,所以当前core的cache block转移到invalid状态
  • 如果当前core的cache block处于shared状态

    • 那么当前core对cache block的读取(local read)以及其他core对cache block的读取(remote read)对当前core的cache block状态无影响,所以还是shared状态
    • 当前core对cache block的修改(local write)会使得当前core的cache block内容与内存中不一致,所以会转移到modified状态
    • 其他core对cache block的修改(remote write)会使得当前core的cache block内容过时失效,所以转移到invalid状态
  • 如果当前core的cache block处于modified状态

    • 那么当前core对cache block的读取(local read)以及当前core对cache block的修改(local write)对当前core的cache block状态不产生影响,所以还是modified状态
    • 其他core对cache block的读取(remote read)会导致其他core拥有这个cache block的最新副本,所以此时不再是当前core独占,所以转移到shared状态
    • 其他core对cache block的修改(remote write)会导致当前core的cache block内容过时失效,所以转移到invalid状态

你可能感兴趣的:(缓存一致性协议)