Cache结构图
Cache和主存被划分为很多块, 块(Cache Block ) 作为映射的最小单元,块大小(Cache Block size) 反应块内所包含的字节数。
以256byte大小Cache为例,其Cache Block size=4 byte,被划分为32块。
Cache地址相当于被划分为了2部分:块号(index)+块内地址/偏移量(offset)
主存的结构与Cache相同,Main Memory Block size = Cache Block size
直接映射
直接映射就是每个主存块只与一个缓存块相对应,映射关系为
i
=
j
m
o
d
C
i = j\;mod\;C
i=jmodC(其中
i
i
i为缓存块号,
j
j
j主存块号,
C
C
C为缓存块数)。
以4个Block的Cache与32个Block的主存为例 (Cache Block size = Main Memory Block size),这里假设每块含4字节,Main Memory中每4个Block为一组 (每组的Block数量 = Cache的Block数量) ,每组的第1块映射到Cache中的Cache Block[0],第2块映射到Cache Block[1]…
Cache index | Main Memory index |
---|---|
0 | 0,4,8…28 |
1 | 1,5,9…29 |
2 | 2,6,10…30 |
3 | 3,7,11…31 |
假设现在需要主内存中的地址为15H的数据,CPU首先会在Cache中查找,这就需要将主存中15H地址映射到Cache中。
15
H
=
0001
01
01
15H = 0001\;01\;01
15H=00010101,其中offset(01)表示在块内的偏移量,index(01)表示在Cache的块号。每一组相同index将映射到Cache中的同一块,因此需要一个tag来区分不同的组。
图上还有一个valid bit,这个是用来标记Cache Block是否有效的,当根据Main Memory地址映射到Cache所在块之后会先检查valid bit是否有效,只有在有效的情况下,比较tag才有意义。如果无效,直接判定cache缺失。当系统刚启动时,cache中的数据都应该是无效的,因为还没有缓存任何数据。
直接相连映射的优缺点
优点:简单易实现,硬件成本会比较低
缺点:不够灵活,Cache中的每个Block对应Main Memory中每组index相同的Block,一个一对多的关系,如果需要访问Main Memory每组index=1的Block,则Cache中只有index=0的Block会被使用,并且数据还会被不断替换,其他空闲位置无法使用,命中率降低。
全相联映射
全相联映射允许Main Memory中的每一个Block映射到Cache中的任何一个位置上面,只有当Cache中的Block全部被占用时,才考虑替换。
假设Cache被划分为4个Block,Main Memory被划分为32个Block,(Cache Block size = Main Memory Block size),假设此时需要地址为15H(00010101)的数据。CPU首先会查找Cache是否有存储,由于采用全相联映射,Main Memory中的Block可以映射到Cache中的任一一Block,因此需要逐一检验tag标签来判断。如下图所示在Cache中Block[1]的tag匹配成功。通过offset来确定该内容在Block中的位置。
全相联映射的优缺点:
优点:因为Main Memory中的Block可以映射到Cache中的任一一Block,不像直接映射一样,Main Memory中某一个Block映射到Cache中唯一的Block灵活,这种方式命中率更高,缩小了块冲突(只有当Cache全部Block都被占用才会冲突)。
缺点:直接相连映射定位到Cache中的Block之后,只需要检验一次tag标签即可,而全相联映射,需要逐一匹配Cache中每一个Block的tag标签,这种方式的硬件成本较高。
组相联映射
组相联映射是直接相连映射和全相联映射的一种折中方法。
直接相连映射是Main Memory中的任一Block只能映射到Cache中唯一的Block,而组相联映射则是映射到Cache中唯一的组(Group)(一组包含若干Block),映射规则为i
i
=
j
m
o
d
C
i = j\;mod\;C
i=jmodC(其中
i
i
i为Cache中的组号,
j
j
j为Main Memory的块号,C为Cache的组数)。
对于同一组,采用全相联映射,Main Memory中的Block可以映射到对应组中的任一一Block,通过逐一检查tag标签来定位。
假设Cache被划分为4个Group,每个Group有2个Block,Main Memory被划分为32个Block,现需要Main Memory中地址为15H的数据,CPU会先到Cache中寻找,15H = 0001 01 01,其中的index(01)确定为Group[1],然后逐一匹配Group[1]中所有Block对应的tag,最后确定15H在Cache所映射的位置。
可见直接相联映射和全相联映射都是特殊的组相联映射,直接相联映射是当Cache中每组只有一个Block情况下的组相联映射,而全相联映射则是Cache只划分一个组(即Cache所有Block作为一个组)情况下的组相联映射。
牙牙yyds