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高速缓存中的数据失效,强制加载主内存数据
网友评论