引言
计算机的CPU缓存(cache)作为一种存储结构,在数据的读写中发挥着十分重要的作用。其最主要的作用,是解决速度不匹配的问题。
在早期的计算中,计算机的运算效率并不高,所以对存取数据的速度也没有太高的要求。然而随着计算机技术的发展,内存能够存储更多的数据,这样肯定会降低数据读写的效率。由此便出现了所谓的速度不匹配,也就是说,CPU的效率高于内存的效率,为了解决这个问题,CPU缓存应运而生。
如何理解CPU的效率高于内存的效率?本身CPU处理数据,而内存存储数据,如何比较速度?
先来看一张图,这个图可以比较清楚地看到CPU
的主要构成及其与主内存的关系。
从上图中可以看出,CPU
由多个部分组成,其中包含了算术逻辑单元ALU
,控制单元CU
,内存管理单元MMU
,寄存器register
,程序计数器PC
,以及我们今天的主角缓存cache
。其中距离ALU
最近的存储结构就是寄存器。所以若没有缓存,那么这时候应该比较的就是ALU
从寄存器中读取数据的速度与读取主内存的速度。
1.缓存的作用
既然缓存可以解决速度不匹配的问题,那么缓存是如何解决这个问题的呢?
举个例子,如果将外存比作出版社印刷工厂生产的书,内存就是图书馆,那么缓存就是书架,我们每次在某个阶段想学知识,肯定现在书架的书中找,找不到就回去图书馆借书,如果还没有,就去外面买(网上直接搜索答案除外)。
这种“行为”在计算机中也是存在的,而计算机的查找结果叫做命中。CPU在运行的过程中,会优先处理寄存器中的数据,而在需要处理其他数据时,先在L1
缓存中去找,如果命中(找到了)就直接处理,未命中(找不到)就去L2
,以此类推,如果L3
还是找不到,就去内存中找,直到找到为止。
(在部分材料中,将缓存划分到CPU中,这种方法也是正确的,此时缓存便成了CPU的一部分。)
如下图所示:
这样以来,CPU
的运行效率就会快很多。因为缓存比内存小。所以很快就可以搜索一遍。而在三级缓存中,L1<L2<L3,所以距离CPU越近的存储结构,存储空间越小。那为什么设计师会觉得缓存命中率会很高呢?
这是由局部性原理决定的,在计算机学科的概念中,局部性原理分为时间局部性原理和空间局部性原理。
- 时间局部性:如果一个数据正在被访问,那么在近期它很可能还会被再次访问。
- 空间局部性:在不久的将来将用到的数据很可能与现在正在使用的数据在空间地址上是临近的。
基于以上的原理,就很容易理解为什么缓存会较高概率会命中了。
2.三级缓存的空间位置
缓存存在于内核和主内存中间,总共分为三级(一般情况),L1距离内核最近(准确地说,是L1直接与CPU的寄存器进行数据通信),每个内核分配一个,L3多核心共享,直接与主内存通信,而L2在两者之间,有时候是两个核心共享一个(现代计算机中基本都是多核CPU)。
缓存的存储空间较小,除了高效的要求外,还有个问题,就是制造成本,一般缓存是由SRAM的存储单元构成的,而主内存是由DRAM存储单元构成的。SRAM的储存单元成本要比RRAM高很多,为了读写高效,SRAM每个存储单元由6
个晶体管构成,而DRAM每个存储单元只需要1
个晶体管和1
个电容器。