内存屏障和CPU缓存

0.CPU缓存

​ 指的是 在计算机系统中,CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。(来自于百度百科)

1.CPU发展变化图

1560136320471

计算机经过近些年,飞速的发展,已经由最初的单核处理器,为了提升性能,变成了现在的多核处理,多核处理器间并行工作,提升了计算机性能。

但也由此产生了一系列问题,比如说如何保证数据的一致性的问题,这里其实就是跟集群环境遇到的问题是类似的,多个CPU相当于 多台 服务器,对于集群服务器而言, 他们都需要链接同一个数据库,而CPU则是需要访问同一个内存及硬盘。由此产生了很多硬件间的协议。

2.CPU高速缓存理解图

1560138120709

CPU 缓存 分为 三级 , 一级和 二级 缓存 是CPU 独有的缓存,三级缓存是 共享的缓存,缓存的出现主要是希望提高数据运输的效率,来提升CPU的利用率。

L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存 和 指令缓存。一般服务器CPU的L1缓存的容量通常在 32K – 4096 K。

L2 由于 L1 级 高速缓存容量的限制,为了再次提升CPU的运算速度,在CPU外部放置一高速存储器,即二级缓存。

L3 现在带的都是内置的。而他的实际作用是, L3缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。一般是多核共享一个L3缓存。

CPU在读取数据时,先在L1中寻找,再从L2寻找,再从L3寻找,然后是内存,再是外存储器(指硬盘等)。

4.CPU性能优化手段–运行时指令重拍

x = 100;
y = z;

我们希望 CPU的执行顺序是

  1. 将 100 赋值 给 x
  2. 读取 z 值
  3. 将z 值 赋值 给 y值

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

所以重排序的结果可能就是

1.读取 z 值

2.将 z 值 赋给 y

3.将 100 赋值 给 x

但是指令重排序 并非随便重排,需要遵循 as - if - serial 语义

as - if - serial 语义的意思 指: 不管怎么重排序 (编译器 和 处理器 为了 提高并行度),(单线程) 程序的执行结果也不能被改变。编译器,runtime 和处理器 都必须 遵循 as - if -serial 语义。

也就是说: 编译器 和 处理器 不会对存在 数据依赖关系的操作 做 重排序。

java 中 的 jit 重排序 也是如此,jit 指的 是 just in time。

这里可以联想 线程 理解一波, 当线程正在进行数据库操作的时候,完全可以让线程 去 处理其他事情,以提升服务器CPU的利用效率。

3.高速缓存的两个问题

  1. CPU 高速缓存下 有一个问题:缓存中的 数据与主 内存的数据 并不是实时同步的,各CPU(或CPU核心)间缓存的数据也不是实时同步。在同一时间点,各CPU 所看到同一内存地址的数据的 值 可能 是不一致的。

    这里主要是会对 多线程 在多个 CPU 上同时执行的时候 ------> 存在 数据可见性问题 影响

  2. CPU 执行指令优化重排序有一个问题:虽然遵守了 as - if - serial 语义,当仅在 单 CPU 自己 执行的情况下能保证结果正确。多核多线程中,指令逻辑无法分辨因果关系,可能出现乱序执行,导致结果错误。

    这里其实 主要 ------> 存在 数据一致性 影响

4.内存屏障指令解决上述问题

处理器提供了两个内存屏障指令(Memory Barrier) 用于解决上述两个问题:

  1. 写内存屏障(Store memory Barrier): 在指令插入 Store Barrier,能让写入 内存中 的最新数据 更新 写入主 内存,让其他线程可见。强制写入主内存,这种显示调用,CPU就不会因为性能考虑而去对指令重排。
  2. 读内存屏障 (Load memory Barrier): 在指令 前 插入 Load Barrier,可以让 高速缓存中的 数据失效,强制从新从主内存加载数据。强制读取主内存内容,让CPU缓存与主内存保持一致,避免了缓存导致的一致性问题。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值