Cache与主存的地址映射

Cache结构图

Cache和主存被划分为很多块, 块(Cache Block ) 作为映射的最小单元,块大小(Cache Block size) 反应块内所包含的字节数。
Cache结构图
以256byte大小Cache为例,其Cache Block size=4 byte,被划分为32块。
Cache划分例子
Cache地址相当于被划分为了2部分:块号(index)+块内地址/偏移量(offset)
Cache地址

主存的结构与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 indexMain Memory index
00,4,8…28
11,5,9…29
22,6,10…30
33,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

  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值