早期的计算机存储器层次结构只有简单的三层:CPU寄存器组,DRAM主存储器和磁盘存储。不过随着时间的发展,CPU和主存之间的速度差距逐渐增大,系统设计者被迫在CPU寄存器文件和主存之间插入一个容量小但速度快的SRAM高速缓存存储器,我们一般称之为cache。
简单的抽象图如下,一定注意哦,这只是为了方便理解的灵魂抽象图。
cache工作的原理:
程序运行的空间局部性和时间局部性。空间局限性指的是当一条指令正在被执行,在很短的时间内,这条指令周围的指令也会有很大的概率被执行。时间局部性指的是当一条指令正在被执行,在很短的时间内,这条指令将有很大的概率被重复执行。
Cache命中
当CPU需要访问内存的一个数据时,这个数据已经缓存在Cache中,则则称为Cache命中。
Cache不命中
当CPU需要访问内存的一个数据时,这个数据没有缓存在Cache中。
Cache的工作方式
当CPU执行一条读内存数据的指令时,它首先向Cache请求这个字,如果Cache中含有这个数据(Cache命中),cache会将该数据返回给cpu;若Cache中没有该数据,则Cache向内存请求包含该数据的块,将此块缓存到Cache中,然后Cache从它的缓存里找到cpu所需的数据并返回给cpu。
Cache的三种组织方式
为了更好的理解Cache的三种组织方式,我们先建立一个通用的Cache组织结构。
考虑一个计算机系统,其中每个存储器地址由m位,形成M=2的m次方(他喵的,幂次方不会打)个不同的地址。其Cache被组织成一个有S=2的s次方个高速缓存组的数组。每个高速缓存组包含E个高速缓存行。每个行是由一个B=2的b次方字节的数据块组成的,一个有效位指名这个行是否包含有意义的信息,还有t=m-(b+s)个标记位(是当前块的内存地址的位的一个子集),它们唯一的标识存储在这个高速缓存行中的块。
参数S和B将m个地址位分成了三个字段,如上图所示 。地址中的s个组索引位用来找到数据在cache中的组,b个索引位是找到数据在块中的偏移量,而标记位用来指示数据在cache相关组中的哪个行里。当且仅当设置了有效位并且该行的标记位与数据地址的标记位相匹配时,组中的一行才包含这个字。一旦我们由组索引标识的组中定位了由标号所标识的行,那么b个块偏移位给出了在B个字节中的数据块的偏移量。
直接映射高速缓存
根据每个组的高速缓存行数E,高速缓存被分为不同的类。每个组只有一行(E=1)的高速缓存称为直接映射高速缓存,如下图所示。
组相联高速缓存
组相联高速缓存中,每个组中存在多个行,类似于上述的通用模型(E>1)。
全相联高速缓存
全相联高速缓存是由一个包含所有高速缓存行的组组成的。结构图如下:
全相联高速缓存,将内存地址空间只分为两部分,因为只有一个组,所以不再需要组索引位寻找组,只需要分为t位标记位和b位块偏移位。
有关写的问题
如果向cache中更新了某些数据,什么时候将这些数据写回到内存中呢?
直写法:立即将更新的数据写回内存。
写回法:当被更新的块被换出时写回内存。