美文网首页
二、CPU缓存与内存屏障

二、CPU缓存与内存屏障

作者: 温不胜_kangle | 来源:发表于2020-06-06 15:35 被阅读0次

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

    相关文章

      网友评论

          本文标题:二、CPU缓存与内存屏障

          本文链接:https://www.haomeiwen.com/subject/oalozhtx.html