高并发之硬件MESI缓存一致性协议与CPU屏障浅析

高并发之硬件MESI缓存一致性协议与CPU屏障

​ Wirte by 021.

MESI缓存一致性协议

  • cache line是cache与内存数据交换的最小单位,根据操作系统一般是32byte或64byte。在MESI协议中,状态可以是M、E、S、I,地址则是cache line中映射的内存地址,数据则是从内存中读取的数据。

img

  • 状态介绍

  • MESI协议将cache line的状态分成modify、exclusive、shared、invalid,分别是修改、独占、共享和失效。

    • modify:当前CPU cache拥有最新数据(最新的cache line),其他CPU拥有失效数据(cache line的状态是invalid),虽然当前CPU中的数据和主存是不一致的,但是以当前CPU的数据为准;

    • exclusive:只有当前CPU中有数据,其他CPU中没有改数据,当前CPU的数据和主存中的数据是一致的;

    • shared:当前CPU和其他CPU中都有共同数据,并且和主存中的数据一致;

    • invalid:当前CPU中的数据失效,数据应该从主存中获取,其他CPU中可能有数据也可能无数据,当前CPU中的数据和主存被认为是不一致的;

    • 对于invalid而言,在MESI协议中采取的是写失效(write invalidate)。

  1. cache操作
  2. MESI协议中,每个cache的控制器不仅知道自己的操作(local read和local write),每个核心的缓存控制器通过监听也知道其他CPU中cache的操作(remote read和remote write),今儿再确定自己cache中共享数据的状态是否需要调整。
  • local read(LR):读本地cache中的数据;
  • local write(LW):将数据写到本地cache;
  • remote read(RR):其他核心发生read;
  • remote write(RW):其他核心发生write;

CPU内存保证

  • 通常情况下,在代码被正常编译成机器码后,在汇编代码级别不加lock 原子指令情况下,代码也会产生乱序,编译器会优化代码,调整执行顺序,如果需要执行强代码一致性需要加上CPU内存屏蔽代码;

  • final int a =0 这行代码在编译器编译成机器码时会加内存屏障,防止重排序.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #TODO


    sfence :

    ifence :

    mfence :


    image-20211111163154506