缓存行Cache Line 是个啥

缓存行Cache Line 是啥

Cache Line :顾名思义叫做缓存行

缓存行越大,局部空间效率越高,读取时间越慢!

缓存行越小,局部空间效率越低,读取时间越快!

总所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来
这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLine

Mysql里面的存储引擎也是有磁盘预读的效果,比如innodb默认读16kb为一页,多余的数据读出来会保存住,因为下次读取它们的概率会比较大!

多核CPU下 每个CPU可单独处理一个线程,每个核拥有L1、L2、L3 高速缓存Cache,每个核公用L3

三级缓存(L1、L2、L3)是什么?

以近代CPU的视角来说,三级缓存(包括L1一级缓存、L2二级缓存、L3三级缓存)都是集成在CPU内的缓存,它们的作用都是作为CPU与主内存之间的高速数据缓冲区,L1最靠近CPU核心;L2其次;L3再次。运行速度方面:L1最快、L2次快、L3最慢;容量大小方面:L1最小、L2较大、L3最大。CPU会先在最快的L1中寻找需要的数据,找不到再去找次快的L2,还找不到再去找L3,L3都没有那就只能去内存找了

Volatile可见性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDDZr4Xl-1641431210881)(C:\Users\PC3070\AppData\Roaming\Typora\typora-user-images\image-20220105210806696.png)]

  1. x被标记了volatile
  2. 两个线程运算时是将缓存中要被运算数所在的整条CacheLine复制到线程自己的存储,并进行运算,运算之后写回缓存
  3. 假设线程1修改了x并写回,但是线程2中的x还是未修改的x
  4. 由于x被标记了volatile,在线程1写回x缓存时,线程1会通知线程2重新读取缓存中的x

伪共享状态:,当x,y在同一块cacheLine中,两个线程分别修改,会频繁互相通知同步修改x,y的状态,不断读取消耗性能!

CacheLine对齐

多线程会有上面的伪共享问题,但如果x,和y分别在不同的cacheLine中进行修改读取,双方就不会一直发生同步了,因为另一个线程根本就没有这个数据!

如果让两个数据处于不同的CacheLine呢?方法就是Cache Line对齐

在一般的x86环境下一个CacheLine64字节,也就是8Long,我们可以把x定义为Long,并同时定义7个没有用的Long变量,这样这8个数就在同一个CacheLine
之后再定义yy自然也就在下一个CacheLine中

这就叫CacheLine对齐,这样两线程就不会出现伪共享的现象了

建议看完再去这个博客补充一下知识:

利用CPU cache特性优化Go程序_猛犸象-CSDN博客

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值