【Java并发编程与高并发解决方案】CPU多级缓存与缓存一致性(

2018-10-29  本文已影响0人  留夕_3826

开始搞起来吧。这周先把多线程的各个细节搞好他。最好能整理出文字性的东西吧。现在开始第一天吧~

开始搞cpu、内存、缓存之间的关系

如果只是读的情况

这种情况下,任意时刻,缓存中缓存段的内容和内存中对应的内容是一致的。

如果考虑写的情况

记住一条:当所有脏数据都被回写后,任一级别缓存中所有缓存段的数据和内存中对应的数据是一致的。

一致性协议

上面扯的那些都是在只有一组缓存的情况下,如果有多个cpu对应多组缓存,如果某一组缓存段对应的内存地址中的数据被另一个cpu给修改了,会发生什么。

MESI缓存一致性协议

  • 上面说的那种方式,在直写模型中没有任何问题,但如果到了回写模型,就会有问题了。
    • 有可能在某一组缓存中已经产生了脏数据,但是此刻并没有发生回写,所以其他内存组没办法知道这一变化,还是拿了内存中的数据。
    • 这时候只需要做的是,在产生脏数据之前,要把这一变化sync到其他的缓存组。这就是MESI协议啦。

1.在多核系统中,读取某个缓存段,实际上会牵涉到和其他处理器的通讯,并且可能导致它们发生内存传输。写某个缓存段需要多个步骤:在你写任何东西之前,你首先要获得独占权,以及所请求的缓存段的当前内容的拷贝(所谓的“带权限获取的读(Read For Ownership)”请求)。

2.尽管我们为了一致性问题做了额外的工作,但是最终结果还是非常有保证的。即它遵守以下定理,我称之为:MESI定律

  • 在所有的脏缓存段(M状态)被回写后,任意缓存级别的所有缓存段中的内容,和它们对应的内存中的内容一致。此外,在任意时刻,当某个位置的内存被一个处理器加载入独占缓存段时(E状态),那它就不会再出现在其他任何处理器的缓存中。
上一篇下一篇

猜你喜欢

热点阅读