图解CPU缓存一致性问题

  产生背景

    CPU的读取速度比内存的快,一个快一个慢,就会有矛盾,就会有人想要解决这个矛盾,所以就提出多级缓存来解决,如下图所示。     

               

     L1级缓存:分为数据域和程序域。

     L2级缓存:二级缓存。

     L3级缓存:所有CPU共用。

     容量逐级越来越大,读取速度逐级降低。

     这里会产生什么问题呢,比如一个数据:x=3;

    

        现在X=3,存在多份,所以就存在了数据一致性。

  解决方案

    缓存一致性原则:MESI。

    Modified: 已修改的

      缓存行是dirty,与主存的值不同。如果有别的CPU内核想要读主存这块数据,该缓存行必须回写到主存,状态变成S。

    Exclusive:独占的

      缓存行只在当前缓存中,且是干净的。缓存数据等于主数据的,当别的缓存读取它的时候,状态为共享。当前写数据,变成已修改状态。

    Shared: 共享的

      缓存行也存在其他缓存且是干净的,缓存可以在任何时刻被抛弃。

    Invalid:失效的

      缓存行是失效的

    上面四个状态,可以考虑在缓存行里面用两个Bit来实现即可。

    上面四个缓存行的相容状态,如下图:

    

     当前缓存被标记成M,其他CPU上的缓存都要变成失效状态。

     所以现在的有一种机制就是:你的缓存控制器,除了要管缓存的读写之外,还要监听到其他CPU对缓存的值修改。

    

               MESI协议转换图

    

           

 

 

 

 

  

 

       

 

             

 

 

 

          

 

 

    

 

    

    

posted @ 2021-02-01 10:48  GDOUJKZZ  阅读(536)  评论(0编辑  收藏  举报