首页 文章

为什么MESI协议可能导致写入操作,然后对同一地址执行写操作?

提问于
浏览
0

MESI协议用于回写 . 单个处理器上有2个内核,为简单起见,只有L1缓存 .

  • 地址A从未使用过

  • core 1启动了对地址A的写操作 . 它导致数据保存到其缓存中,状态设置为M.

  • core 2启动了对地址A的写操作 . 导致缓存未命中 . 核心2发布RWITM广播 . 核心1是窥探,阻止RWITM,值保存到主内存,其状态在其缓存中设置为I.接下来是核心2重新发布RWITM并将值存储在主存储器中的地址A.状态为其缓存中的地址A.

为什么核心1在主内存中保存了任何东西,浪费时间 - 它几乎立即被覆盖了?

我的来源:

http://upload.wikimedia.org/wikipedia/commons/9/99/MESI_protocol_activity_diagram.png

https://www.cs.utexas.edu/~pingali/CS395T/2009fa/lectures/mesi.pdf

http://en.wikipedia.org/wiki/MESI_protocol

1 回答

  • 1

    有两个原因:

    • 这是在整行粒度上完成的 . 没有人保证两个核心都修改了相同的字节,因此核心2需要首先从核心1看到更新,然后与它修改的字节进行合并,然后才提交其存储 .

    • Core 2可能在飞行中被抢占,或者其他东西可能在其写入时发生(它仍然没有等待RWITM) . 在这种情况下,您将丢失来自核心1的数据,因为您信任核心2.永远不要相信多核硬件的行为符合您的预期(并且更信任多线程软件) .

    请记住,没有任何共享缓存会过度简化 . 如果你有一个(并假设它是包容性的),那么核心1将简单地将修改写入其中,而核心2将更快地获得它 . 其他系统也可以为这种情况实现直接的核心到核心窥探 .

    一般来说,协议应该假设除了协议明确告诉它之外,没有任何一方知道任何事情 . 您必须使核心1的线路无效以保持一致性(没有2个核心可以同时修改同一条线路),并且由于您没有其他缓存级别 - 您必须将其写入内存并保证数据不会丢失(不要指望核心2,就核心1而言它不存在,你用你信任的唯一流回应一个神秘的窥探 - 写回内存) .

    最后一件事 - 这个流程结束了(在幻灯片中,据我所知),核心2在M状态的自己的缓存中安装线路,并进行修改 . 从这一点开始,系统可以以任何方式继续(如果线路稍后再被窥探,或者从Core 2的缓存中老化 - 这是另一回事) . 如您所述,流程不需要Core 2将行写回内存,因此没有双重写入 .

相关问题