记录我了解的一点点关于缓存命中的知识。
链接: 参考文章链接,大佬的文章,偏底层,我是小白读不懂
链接: 我的博客
内存分布和多级缓存
我们了解最清楚的计算机的储存设备就是硬盘了,那么硬盘和平时所说的CPU之间有什么关系呢?如下图所示,计算机拥有层次分明的储存和运算结构。
在图中所示的金字塔结构中,越往上的硬件存取数据的速度和计算的速度越快,但是所需要付出的代价也越大。CPU,123级高速缓存和主存,虽然运算速度极快,但是只能在通电的时候使用,当失去电源时,这几个缓存中的数据就会被清空,我们在关机时,未关闭的程序会提示保存就是这个原因,如果不将缓存中的数据保存到磁盘中,断电后这些数据就会消失,再也找不到了。往下的本地二级储存(磁盘)和远程储存服务(比如将文件保存在某个网盘上),即使计算机没有通电也能够保存数据,保存在磁盘上的数据,理论上磁盘不坏,就能将之读取出来。
计算机的三级缓存结构,如图计算机拥有3个高速缓存,老式的CPU可能只有2个。在计算机计算过程中,每一级的储存器都只保存从下一级取出的数据,也就是说,当我们进行某个计算的时候,主存首先去本地磁盘里把需要的数据取出来,如果需要更快的算力,高速缓存L3就会去主存里取数据进行计算,当需要比L3更高的算力时,L2就会去L3里面取出数据进行计算,而作为最高级的寄存器,处理的都是高速运算。
虽然等级越高的硬件运算速度越快,但是容积也越小,成本也越高,L1/L2的大小基本上也就是KB级别的,L3会是MB级别的。例如:Intel Core i7-8700K ,是一个6核的CPU,每核上的L1是64KB(数据和指令各32KB),L2 是 256K,L3有2MB。
缓存命中
由于一些硬件上的原因,上级硬件从下级硬件中加载数据并不是一个字节一个字节的加载,而是一次加载一块内存连续区域的数据,一般来说,一个主流的CPU一次加载是 64 Bytes(也有的CPU用32Bytes和128Bytes),64Bytes也就是16个32位的整型,这就是CPU从内存中捞数据上来的最小数据单位。
那么缓存命中是什么意思呢?简单的说,CPU在计算之前,会先去寻找需要的数据在不在CPU中,如果需要的数据在,就叫缓存命中,如果不在,就叫缓存不命中。
具体我们画图来了解:
假如CPU此时需要进行a+b
运算
- 情况1
根据顺序,CPU需要先找到a,先检查自身,发现a不在自身缓存中,此时就叫a缓存不命中
a缓存不命中时,cpu去下级缓存中寻找a的地址,并将从该地址开始的64个字节的数据都加载到自身缓存中
找到a后,CPU还需要b的数据,先检查自身,发现b在自身缓存中,此时就叫b缓存命中
- 情况2
先前的a和b在相邻的64个字节内,所以CPU将a加载的同时也将b加载了,后续就不用再加载一次b,节省了一次加载数据的时间。但要是a和b的地址相差了64个字节以上呢?那么加载了a之后,b仍然缓存不命中。
CPU需要再加载一次,才能进行运算
缓存命中与线性表
知道了缓存命中的机制之后,我们很容易明白,想要加快运算速度,提高缓存命中率也是一个重要手段(毕竟加载数据耗时),这时就可以延申到线性表的两种经典结构,顺序结构和链式结构了。
顺序结构的数据都在地址连续的空间上,加载时缓存命中率肯定会高于地址随机分布在堆中的链表,所以顺序表相对于链表还有一个优点就是缓存命中率高。
以上就是我关于缓存命中率的一些了解了,能力有限,能了解的底层知识不多,以后有能力了再补充。
标签:缓存,L3,命中,数据,CPU,加载 From: https://blog.csdn.net/weixin_69356744/article/details/136963464