高并发之硬件MESI缓存一致性协议与CPU屏障
Wirte by 021.
MESI缓存一致性协议
- cache line是cache与内存数据交换的最小单位,根据操作系统一般是32byte或64byte。在MESI协议中,状态可以是M、E、S、I,地址则是cache line中映射的内存地址,数据则是从内存中读取的数据。
状态介绍
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)。
- cache操作
- 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 :