cache 映像机制详解
2022-04-19 11:09:21

高速缓冲器cache的原理
cpu的速度远远快于内存,因此如果cpu只是从内存中读取数据,那么会花费较多的时间在等待数据上,我们希望有一种方法解决【从内存中读数据慢】的问题,于是有了高速缓存。

对于数据的读取基于两个猜想,假设我们读取内存地址x处的数据,那么有

内存地址x处的数据在短时间内容易被再次访问
内存地址x周围的数据在短时间内容易被再次访问
当一个数据要从cache中读,L1没有就要去L2,以此层层向下。如果在所有层上都没有找到则访问主存,从主存中取数据送到cpu,此时取出的数据从 主存------》 cache --------》 cpu, 如果cache已满则用置换算法换出一块给这个数据挪位,数据读到了cache中以便下次查找。

由此引出:

hit 命中 —— 在cache中找到了想要的数据

miss 不命中 —— cache中没有找到想要的数据

但是命中(hit)的方式有多种,为什么呢?这是因为cache内部的结构问题,这里必须要说一些cache的工作原理。

cache和主存储器之间以块为单位进行数据交换,而块的大小以在主存储器的一个周期内能访问到的数据长度为限,而这个数据长度并不一定只是一个字哦,如果是主存储器采用并行或者地址交叉存取,则在主存周期内可以访问多个字。

因此,既然是以块为交换单位,所以将cache和主存储器都划分成大小相同的块。
主存地址:块号B+块内地址W
cache地址:块号b+块内地址w

这时,CPU要访问cache时,CPU要的主存地址放在了主存地址寄存器中,通过cache-主存的地址变换部件,将寄存器要求的主存地址转成cache中的地址,如果能在cache中找到则命中,如果不能则miss。

而主存和cache之间怎么变换的呢?其实只要映射块号地址,主存块号B-----》cache中的块号b,块内地址不变,解决。

要想通过主存地址找到cache地址,其实是有个表来记录的。

命中(hit)
我们在访问一个内存地址的时候,先查看高速缓存里面有无该地址的数据。如果有就直接从高速缓存中读取数据,这个行为我们叫做hit,即缓存命中

未命中(miss)
如果高速缓存中没有数据,我们需要从内存中读取数据,这个行为叫做miss。值得注意的是,我们一次读取不是读取一个内存单元的数据,而是读取一个【cache行】的数据,这意味着目标地址及其附近区域的一些数据会被读到高速缓存中,如果下次访问邻近的数据,就不会miss。(cache容量一般为64字节)

 

直接映像

假设有4个cache行,每行16字节,那么主存中

0-15字节被映射到cache行1
16-31字节被映射到cache行2
32-47字节被映射到cache行3
48-63字节被映射到cache行4

64-79字节被映射到cache行1 这里循环往复,以4个16字节为循环长度,上图中不同颜色的连线表示了这种循环映射

我们对内存中的地址,直接模除64(4*16=64),看结果,如果模除结果是在0-15,那么cache行1。

cache地址: 块号 +块内地址
主存地址: 区号(按照组划分)+ 块号(按照块划分) +块内地址


例:设主存容量为1MB,高速缓存容量为16KB,块的大小为512字节。采用直接地址映像法。
写出主存地址格式。
写出Cache地址格式。
块表的容量是多大。
画出直接方式地址映像及变换示意图。
解:
Cache块数=16KB/512B=32块
则主存每区为32块,共1MB/16KB=64区
所以主存地址为6位区号(共64区)+5位区内块号(共32块)+9位块内地址(块容量512B,按字节编址)
所以Cache地址为5位区内块号,9内块内地址(相当于主存的一个区)
自然的,块表的容量为32*6位(表示Cache32个块中分别存了第几区的主存块)

示例
假设每次访问的都是映射到同一行的内存块,那么会不断的miss,因为就一块cache,大家一起用,互相覆盖,造成miss率高


优点是电路搭建简单,成本低。缺点是miss率很高

全相联映像
全连接映射顾名思义,谁都能映射。任意内存块,可以被映射到任意cache行。可以将cache看作一个list,只要list未满,就载入最前的一个空cache行,直到cache满,然后淘汰掉旧行,载入新行。

示例:

全连接映射hit率很高,因为大家公用所有cache,而不是像直接映射一样大家共用一个cache行。缺点是硬件实现很复杂,成本非常高(有n个cache行,就要有n个地址的比较电路来判断地址是否在行内)

多路组相联映像
组映射将cache分组,一个cache组包含多个cache行,而内存块以直接映射的形式,先映射到对应的组上,然后再以全连接映射的方式,再组内寻找对应到的cache行。

 

 

根据上面的图:我们知道cache被分为了8组,每组又分为了2块,右边主存部分被分成了256个区,每个区8块,每个区的8块与cache中的8组不是巧合,而是为了实现组间直接映射,然疑问来了,当主存的某一块按直接映射方式规则进行映射后到了cache中相应的组,而此时在cache中每组有两块,这时候就是实行组内全映射。

前面我说过组相联映射是直接映射和全相联映射的一个折中形式,那么必然也就存在下面俩种特殊的形式:

当cache中每组内的块数变为1时,这就变成了直接映射;
当cache中只有一组时,这就变成了全相联映射。
组相联映射相对应的主存地址格式(和直接映射方式很像,只是块号变成了组号):


优缺点:综合了上述两种映射,暨能做到组间直接映射,又能做到组内全连接映射,在成本和效率上有所折中,是折中的平衡方案。

下面以一道例题为例:

某计算机按字节寻址,主存有2K个块,每块32个字节。 Cache由64个块组成,每组8块(8路组相联)。请表示主存地址格式。给内存地址为A21FH和C028H两个地址对应的标记、组号和字号。

我的解法思路是:
字号:每块32个字节,即 32=2^5,故字号5位。
组号:Cache由64个块组成,每组8块,即64/8=8=2^3,故组号3位。
区号标记:主存有2K个块,又因为我们知道组间是直接映射(所以把cache中的组数看作直接映射中的块),即2k/8=2^8,故区号8位。
所以,主存格式为:区号8位、组号3位、字号5位。
又A21FH=1010001000011111B
故对应的标记:10100010,组号:000,字号:11111
同理C028H=1100000000101000B
故对应的标记:11000000、组号:001、字号:01000

组相联映射总结:
优点:块的冲突概率比较低,块的利用率大幅度提高;
缺点:实现难度和造价要比直接映射高。
————————————————
版权声明:本文为CSDN博主「李昕羽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54494937/article/details/120843738

本文摘自 :https://www.cnblogs.com/


更多科技新闻 ......