Linux高速缓存和内存屏障

目录

一、高速缓存与地址映射

二、MESI缓存一致性协议和伪共享

三、指令重排序和内存屏障

四、Java  volatile和final关键字


一、高速缓存与地址映射

       CPU访问内存(DRAM)较慢,基于数据的空间局部性(该数据存储位置附近的数据可能很快被访问)和时间局部性(当前正在访问的数据可能很快被再访问)而引入了高速缓存(SRAM)。高速缓存位于分页单元和内存控制器之间,即虚拟地址通过分页单元转换成物理地址后,首先在高速缓存中查找是否存在对应的数据,如果存在则返回缓存中的数据,否则请求内存控制器读取内存,把目标数据附近的一个缓存行大小(通常是64byte)的数据读到高速缓存中,具体的读取规则取决于高速缓存同内存之间的地址映射方式。缓存行是高速缓存同内存交换数据的最低单位,是替换高速缓存中的数据的最低单位,也是高速缓存同内存地址映射的最低单位。高速缓存的命中率直接影响程序的性能,Linux下可以通过perf命令查看缓存的命中率。

      高速缓存同内存之间的地址映射方式有三种:全相联映射、直接相联映射和组相联映射。全相联映射是指按缓存行大小将高速缓存分成N块,内存分成M块,内存的第m块可以映射到高速缓存中的任意一块n,通过映射表记录m和n之间对应关系,缺点是映射表实现电路复杂,需要比较的记录多,优点是高速缓存的利用率和命中率都高,适用于小容量的高速缓存。直接相联映射是指按缓存行大小将高速缓存分成N块,内存分成M块,将M块进一步分成S组,每组N块,M=S*N,内存的第s组下的第n块映射至高速缓存的第n块,通过映射表记录n和s的对应关系,缺点是因为需要频繁替换缓存行导致高速缓存利用率和命中率较低,优点是映射表实现简单。组相联映射按缓存行大小将高速缓存分成N块,S组,每组n块,N=S*n,将内存分成M块,T组,每组S块,即M=S*T,内存的第s组下第a块映射至高速缓存的第a组下的n块中的任意一块,通过映射表记录s和n之间的对应关系,即内存和高速缓存的组间采用直连相联映射,组内采用全相联映射。组相联映射按照每组n块分为n路全相联映射,n通常是2,4,8,16。组相联映射是前面两者间的折中,兼顾两者的优缺点,是普遍采用的地址映射方案。综上分析,从内存读取目标数据附近一个缓存行大小的数据时,目标数据可能位于缓存行中的任意位置,即不是从目标物理地址往后读取一个缓存行数据。

     现代CPU的高速缓存包含L1,L2,L3三级高速缓存,访问速度逐渐下降,缓存容量逐渐上升,上级缓存的内容来源于下级,其中L1,L2是CPU独享的,L3是多核CPU共享的,但是对操作系统而言高速缓存只有一个,由底层硬件维护三级缓存的缓存内容读写和彼此间的缓存一致性。

     参考: 主存与Cache的地址映射

                 CPU缓存

                CPU体系结构之cache小结

二、MESI缓存一致性协议和伪共享

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值