二、CPU缓存与内存屏障

CPU缓存介绍

1、位置:磁盘 -> 内存 -> CPU缓存

2、结构:cpu缓存分3层   CPU  < - > L1-L3缓存

                                         CPU  < - > L1-L3缓存   < - >    缓存一致性协议  < - >   主内存

                                         CPU  < - > L1-L3缓存

    L1:cpu一级缓存,分为数据缓存和指令缓存,一般服务器的容量在32~4096KB,多处理器时独立

    L2:cpu二级缓存,对L1缓存容量不足的的外层备份,多处理器时独立

    L3:cpu三级缓存,进一步降低内存延迟,提高大数据量时处理器的性能,多处理器时公用

    数据查找顺序:L1、L2、L3、内存、外部存储器(磁盘)    


缓存一致性协议

1、多CPU时,缓存写入CPU为准的协议MESI协议(缓存一致性协议),枚举每个CPU高速缓存的状态

M(Modified) :修改态:此缓存行已经被修改过,与主存不一致,此缓存专有

E(Exclusive):专有态:与主存一致,但不同于其他缓存

S(Shared):共享态:与主存一致,与其他缓存一致

I(Invalid):无效态:缓存内容无效(空行)


运行时指令重排序

1、场景:

x = 100; y = z;

CPU写缓存时发现缓存区块正被其他CPU占用,为了提高CPU处理性能,可能将后面的读缓存命令优先执行

2、as-if-serial语义

重排序并非随便重排序,遵守as - if - serial语义(不论怎么重排序,单线程程序的执行结果不能被改变。编译器和处理器都必须遵守该语义。也就是说编译器和处理器不会对存在数据依赖关系的操作做重排序)


两个问题

1、CPU高速缓存的问题

CPU缓存中的数据与主存数据不能实时同步,各并行CPU缓存之间信息不能实时同步

2、运行时指令重排序的问题

as-if-serial语义只能确保单线程,也就是单cpu的执行结果,多CPU时会出现乱序的问题(volatile、final)


处理器提供两个内存屏障指令(Memory Barrier)来解决以上问题

1、写内存屏障(Store Memory Barrier)

在指令后加入Memory Barrier,能让写入缓存的最新数据更新到主内存,让其他线程(CPU)可见

2、读内存屏障(Load Memory Barrier)

在指令前加入Memory Barrier,让当前CPU高速缓存中的数据失效,强制加载主内存数据

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。