前言
上次做计算机系统的实验,做到一个高速缓存的实验,不过实验内容比较简单,就是验证一下不同的数据存取方式对缓存命中率的影响(通过运行时间体现)
因为我上课全程摸鱼,所以今天来回顾一下高速缓存这个内容,加深映像(
高速缓存介绍
什么是高速缓存
高速缓存是介于cpu和内存之间的一级存储器。访问cpu高速缓存的速度要快于访问内存,因此高速缓存常常用来加速cpu的运算。
你可以在任何一本介绍计算机基础的课本上找到类似的图(图片源 百度图片)来描述计算机的各种存储器:
高速缓存基本原理
cpu的速度远远快于内存,因此如果cpu只是从内存中读取数据,那么会花费较多的时间在等待数据上,我们希望有一种方法解决【从内存中读数据慢】的问题,于是有了高速缓存。
对于数据的读取基于两个猜想,假设我们读取内存地址x处的数据,那么有
- 内存地址x处的数据在短时间内容易被再次访问
- 内存地址x周围的数据在短时间内容易被再次访问
以上两个猜想很容易得到证实,(这也是程序的局部性原理的一部分),比如我们会经常编写这样的代码
// 猜想1: 频繁地访问指针a指向的地址存储的变量
int* a = new int;
*a = 123;
for(int i=0; i<n; i++)
{
*a += i;
}
// 猜想2: 矩阵运算的时候 频繁访问相邻的变量 a[i+1]
int a[10];
int b[10];
for(int i=0; i<9; i++)
{
a[i] += b[i+1];
a[i+1] += b[i];
}
频繁访问内存意味着速度慢。高速缓存的引入解决了这个问题
hit
我们在访问一个内存地址的时候,先查看高速缓存里面有无该地址的数据。如果有就直接从高速缓存中读取数据,这个行为我们叫做hit,即缓存命中
miss
如果高速缓存中没有数据,我们需要从内存中读取数据,这个行为叫做miss。值得注意的是,我们一次读取不是读取一个内存单元的数据,而是读取一个【cache行】的数据,这意味着目标地址及其附近区域的一些数据会被读到高速缓存中,如果下次访问邻近的数据,就不会miss。(cache行一般是64字节)
图解
下面通过一张图解释高速缓存的基本原理,这个原理告诉我们,对内存中的数据的访问,数据们相距的越近,数据越集中,存取速度越快。
更加详细
在《深入理解计算机系统》书中,给出了相当详细的对于高速缓存的解释,我们可以来一探究竟
简单的来说,就是取数据的时候,先查看数据地址,然后做一次硬件哈希映射,查找缓存里是否命中,然后按照情况做对应的操作。
简单实验验证
我们模拟简单的矩阵