计算机存储结构

本文详细解释了计算机存储结构分级,尤其是CPU缓存(L1、L2、L3)的工作原理,强调了缓存命中率对程序性能的影响。通过数据和指令缓存的管理,以及利用局部性原理和多核CPU优化策略,阐述了如何编写能有效利用缓存的高效代码。
摘要由CSDN通过智能技术生成

存储结构

计算机储存结构分级

不同级别的存储结构具有不同的访问速度,CPU访问CPU Cache的延时只需要几纳秒,访问物理内存的延时则是100ns,速度相差100倍,访问磁盘延时就更高了,到了毫秒级别,但是访问速度越快的存储器,造价成本高很多,容量也比较小。

通过分级存储结构,可以将数据按照不同的访问速度、容量和成本要求进行管理,CPU Cache用于存储近期频繁访问的数据,内存用于存储当前执行的程序和数据,而硬盘则用于存储大量数据和长期存储。不同存储器之间性能差距很大,构造存储器分级目的是形成缓存体系

存储结构分层

L1 Cache 通常会分为「数据缓存」和「指令缓存」,这意味着数据和指令在 L1 Cache 这一层是分开缓存的,上图中的 index0 也就是数据缓存,而 index1 则是指令缓存,它两的大小通常是一样的。

另外,L3 Cache 比 L1 Cache 和 L2 Cache 大很多,这是因为 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的,而 L3 Cache 是多个 CPU 核心共享的。

程序执行时,会先将内存中的数据加载到共享的 L3 Cache 中,再加载到每个核心独有的 L2 Cache,最后进入到最快的 L1 Cache,之后才会被 CPU 读取。

CPU cache L1 L2 L3读取数据的时间量级差距

时间差距
差距不大,都是纳秒级别

CPU Cache的数据结构和读取过程

一个内存的访问地址,包括组标记(由于有多个内存块投射到同一个缓存块CPU Cache Line上,所以需要组标记来区分内存块)、CPU Cache Line 索引、偏移量这三种信息,于是 CPU 就能通过这些信息,在 CPU Cache 中找到缓存的数据。而对于 CPU Cache 里的数据结构,则是由索引 + 有效位 + 组标记 + 数据组成。

如果内存中的数据已经在 CPU Cache 中了,那 CPU 访问一个内存地址的时候,会经历这 4 个步骤:

  1. 根据内存地址中索引信息,计算在 CPU Cache 中的索引,也就是找出对应的 CPU Cache Line 的地址;
  2. 找到对应 CPU Cache Line 后,判断 CPU Cache Line 中的有效位,确认 CPU Cache Line 中数据是否是有效的,如果是无效的,CPU 就会直接访问内存,并重新加载数据,如果数据有效,则往下执行;
  3. 对比内存地址中组标记和 CPU Cache Line 中的组标记,确认 CPU Cache Line 中的数据是我们要访问的内存数据,如果不是的话,CPU 就会直接访问内存,并重新加载数据,如果是的话,则往下执行;
  4. 根据内存地址中偏移量信息,从 CPU Cache Line 的数据块中,读取对应的字。
让CPU缓存命中率更高

要想写出让 CPU 跑得更快的代码,就需要写出缓存命中率高的代码,CPU L1 Cache 分为数据缓存和指令缓存,因而需要分别提高它们的缓存命中率:

  • 对于数据缓存,我们在遍历数据的时候,应该按照内存布局的顺序操作,这是因为 CPU Cache 是根据 CPU Cache Line 批量操作数据的,所以顺序地操作连续内存数据时,性能能得到有效的提升;
  • 对于指令缓存,有规律的条件分支语句能够让 CPU 的分支预测器发挥作用,进一步提高执行的效率;(如果分支预测可以预测到接下来要执行 if 里的指令,还是 else 指令的话,就可以「提前」把这些指令放在指令缓存中,这样 CPU 可以直接从 Cache 读取到指令,于是执行速度就会很快。当数组中的元素是随机的,分支预测就无法有效工作,而当数组元素都是是顺序的,分支预测器会动态地根据历史命中数据对未来进行预测,这样命中率就会很高。)

另外,对于多核 CPU 系统,线程可能在不同 CPU 核心来回切换,这样各个核心的缓存命中率就会受到影响,于是要想提高线程的缓存命中率,可以考虑把线程绑定 CPU 到某一个 CPU 核心。

CPU缓存对程序性能的影响

程序具有局部性原理,如果一个数据被访问,那么附近的数据很可能也会被访问到,CPU Cache就是基于这个局部性原理,在访问数据的时候,如果访问的数据不在CPU Cache中,不会只从内存读这个数据,而是会从内存连续加载数据到CPU Cache,这样相邻的数据都会被缓存在 CPU Cache,那么程序在访问相邻数据的时候,相邻数据就可以直接在缓存中命中,无需访问内存,可以提高访问的效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值