分享

MESI&MOESI协议

 waston 2019-04-10

Cache的写策略

  1. Write through(写通)
    每次CPU修改了cache中的内容,Cache立即更新内存的内容

  2. Write back(写回)
    内核修改cache的内容后,cache并不会立即更新内存中的内容,而是等到这个cache line因为某种原因需要从
    cache中移除时,cache才会更新内存中的内容。

    • Write through(写通)由于有大量的访问内存的操作,效率太低,大多数处理器都使用Writeback(写回)策略。

    • Cache如何知道这行有没有被修改?需要一个标志-dirty标志。Dirty标志为1,表示cache的内容被修改,和内存的内容不一致,当该cache line被移除时,数据需要被更新到内存,dirty标志位0(称为clean),表示cache的内容和内存的内容一致。

有dirty标志的cache结构:
cache-dirty
程序cache不会被修改,不需要dirty标志,数据cache需要dirty标志。

Cache一致性

  1. 一致性问题的产生-信息不对称导致的问题
    在多核处理器中,内存中有一个数据x,值为3,被缓存到core0和core1中,如果core0将x修改为5,而core1不知道x被修改,还在使用旧事,就会导致程序出错,这就是cache的不一致。

  2. Cache一致性的底层操作为了保证cache的一致性,处理器提供了两个保证cache一致性的底层操作:Writeinvalidate和Write update。

    • Write invalidate(置无效):当一个内核修改了一份数据,其他内核上如果有这份数据的复制,就置成无效。

    • Write update(写更新):当一个内核修改了一份数据,其他地方如果有这份数据的复制,就都更新到最新值。

Cache一致性协议

MESI

  • MESI协议是一种采用写–无效方式的监听协议。它要求每个cache行有两个状态位,用于描述该行当前是处于修改态(M)、专有态(E)、共享态(S)或者无效态(I)中的哪种状态,从而决定它的读/写操作行为。这四种状态的定义是:

    1. 修改态(Modified)--此cache行已被修改过(脏行),内容已不同于主存并且 为此cache专有;

    2. 专有态(Exclusive)--此cache行内容同于主存,但不出现于其它cache中;

    3. 共享态(Shared)--此cache行内容同于主存,但也出现于其它cache中;

    4. 无效态(Invalid)--此cache行内容无效(空行)。

  • MESI协议适合以总线为互连机构的多处理器系统。各cache控制器除负责响应自己CPU的内存读写操作(包括读/写命中与未命中)外,还要负责监听总线上的其它CPU的内存读写活动(包括读监听命中与写监听命中)并对自己的cache予以相应处理。所有这些处理过程要维护cache一致性,必须符合MESI协议状态转换规则。

  • MESI协议状态迁移图:
    MESI协议状态迁移图
    Local Read表示本内核读本Cache的值,Local Write表示本内核写Cache中的值,Remote Read表示其他内核读其他Cache中的值,Remote write 表示其他内核写其他Cache的值,箭头表示本Cache line状态的迁移,唤醒箭头表示状态不变。
    MESI转移过程

MESI
下面由图的四个顶点出发,介绍转换规则:(规则中与上图 的相应位置以*数字序号对照给出)
1. 该无效行在自身Cache读未命中将被相应内存块填充以建立新行时,读监听命中,说明其它Cache正在读同地址的内存块,以建立新行。故为多Cache共享行,应为S状态,并应继续发出读监听广播,使其它Cache的类似情况效仿。
2. 该无效行在自身Cache读未命中将被相应内存块填充以建立新行时,未读监听命中,为本Cache专有,故新建行应为E状态。
3. 该无效行在自身Cache写未命中时,将先读入相应内存块填充新行后,再进行写修改,与原内存正本的数据不一至,故新建行为M状态。
4. 该共享行写监听命中,说明别的Cache由于写命中修改了同此地址的行,根据写无效原则,此共享行应改变为无效(I)状态。
5. 该共享行读命中,状态不变。
6. 该共享行读监听命中,说明其它Cache正在读同地址内存块,以建立新行,此时该共享行状态不必改变,但应继续发读监听广播,供它者监听。
7. 该共享行被写命中,其中某字被改写,与内存正本不一至,故应改为M状态,且应发出共享行写命中监听广播,使其它Cache同地址行作废(同*4)。
8. 该E态行读监听命中说明别的Cache正在读同地址的内存正本,以建立新行,故其状态应改为S状态,并发出读监听广播,以使同此情况及* 1效仿之。
9. 该E态行读命中不必改变状态。
10. 该E态行写监听命中,说明别的Cache由于写未命中而访问同地址的内存正本,该E态行内容即将过时,故应作废。
11. 该E态行写命中,只改变状态为M态即可,无须他者监听。
12. 该M态行写命中状态不变。
13. 该M态行读命中状态不变。
14. 该M态行读监听命中,应将该行最新数据写回内存正本后变为S状态。并发出读监听广播,供他者监听。
15. 该M态行写监听命中,说明别的Cache由于写未命中而访问了同地址的内存块(同* 3),将实行先读后修改,此时本地M态行应抢先写回主存,然后作废,以保证别的Cache读出整行而未被修改数据的正确性。
16. 该M态行写监听命中,说明别的Cache由于写未命中而访问了同地址的内存块,将实行先读后整行的修改,此时本地M态行不必写回主存,只作废即可。

  • 上述分析可以看出,虽然各cache控制器随时都在监听系统总线,但能监听到的只有读未命中、写未命中以及共享行写命中三种情况。读监听命中的有效行都要进入S态并发出监听命中指示,但M态行要抢先写回主存;写监听命中的有效行都要进入I态,但收到RWITM时的M态行要抢先写回主存。总之监控逻辑并不复杂,增添的系统总线传输开销也不大,但MESI协议却有力地保证了主存块脏拷贝在多cache中的唯一性,并能及时写回,保证cache主存存取的正确性。

MOSEI

- MOESI协议引入了一个O(Owned)状态,并在MESI协议的基础上,进行了重新定义了S状态,而E、M和I状态和MESI协议的对应状态相同。

  1. O位。O位为1表示在当前Cache 行中包含的数据是当前处理器系统最新的数据拷贝,而且在其他CPU中一定具有该Cache行的副本,其他CPU的Cache行状态为S。如果主存储器的数据在多个CPU的Cache中都具有副本时,有且仅有一个CPU的Cache行状态为O,其他CPU的Cache行状态只能为S。与MESI协议中的S状态不同,状态为O的Cache行中的数据与存储器中的数据并不一致。

  2. S位。在MOESI协议中,S状态的定义发生了细微的变化。当一个Cache行状态为S时,其包含的数据并不一定与存储器一致。如果在其他CPU的Cache中不存在状态为O的副本时,该Cache行中的数据与存储器一致;如果在其他CPU的Cache中存在状态为O的副本时,Cache行中的数据与存储器不一致。

MOESI

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多