现代的计算机的CPU的频率比较高,相反硬盘的频率和CPU相比就差的太远了,CPU去硬盘上读取数据耗费的周期比较多,CPU访问核内的寄存器要比访问硬盘快多了,为了解决这样的矛盾,于是,就有了一个中介设备,来缓解CPU和硬盘之间的速度差异,这个中介就是我们常说的内存,CPU去硬盘读取数据时,这部分数据会存在内存中,下次cpu再去读取相同的数据时,直接从内存中读取,读取内存的速度要比读取硬盘的速度快,这样就缓解了CPU和硬盘之间的速度差异性。
但是CPU的速度还是比内存快,于是,就提出了高速缓存的处理机制,会把经常使用的数据或者指令放在高速缓存中,这样的话,当下次读取相同的数据或者指令时,直接从高速缓存中读取即可,cpu读取高速缓存的速度要比读取内存的速度快上几个量级。
从上面我们知道,存储器系统分为几个层级,请看下图:
L0 到 L6 代表着不同的层级,CPU访问L0到L6,速度是越来越慢,原理就是上一层缓存下一层的数据,主要是缓存访问频率较高的数据,高速缓存主要缓存内存中的数据,内存缓存硬盘中的数据。例如:当向cpu发出读取数据的指令时,cpu首先会检查L0层中是否有该数据的缓存,如果L0中没有,则L0会向L1层查询,如果L1中没有,则L1会向L2中进行查询,依此类推。
缓存哪些数据,主要是依靠一下两种的推断:
1) 时间局部性
就是假设刚刚访问的数据,有可能还会被访问到,对于这类数据会将其加入缓存。
2) 空间局部性
就是假设刚刚访问过的数据的相邻地方的数据有可能也会被访问,所以会将相邻的数据加入到缓存。
基于这两种特点,我们以后在编程中,尽量按照这两种特点进行编程。
例如:对于二维数组,我们在扫描的时候,按照行扫描会优于按照列扫描的代码。
数据在各个存储器层次之间传递时,是以快为单位进行的,数据总是在第i层和i+1 层之间来回进行复制,当cpu需要访问i+1层的数据m时,首先会先去第i层去查找是否有该m的缓存,如果在第i层查找到m时,则我们叫它缓存命中,如果没有查找到m,我们称为缓存没命中,于是,cpu就会从第i+1层将数据m取到,然后加入到i层的缓存中。
有人会问,那么数据在缓存中的格式是什么样的呢?下回进行分解,请关注我哦。