计算机组成原理存储体系 ------------ 主存与Cache的地址映射

基本含义

  • 主存–Cache地址映射(mapping)

把存放在主存中的信息按某种规则装入Cache中,并依此建立主存地址与
Cache地址的对应关系。

  • 主存–Cache地址变换(Cache检索)

程序运行时,根据地址映射把主存地址即MAR内容变换成Cache地址即
CAR内容。

  • 映射与检索的关系

不同的映射规则对应不同的地址变换过程。

  • 主要的三种主存映射方式:
    1. 全相联映射。格式:主存字块标志,块内地址
    2. 直接映射。格式:主存字块标志,cache字块标记,块内地址
    3. 组相联映射。格式:主存字块标志,组号,块内地址

全相联映射

全相联映射允许主存中的任一字块映射到Cache中的任何一块的位置上

优点: 十分灵活、命中率高,减少了块冲突率

缺点: 所需逻辑电路多且复杂,成本高

形式如下
在这里插入图片描述

  1. 标记与主存中块数的二进制位数相等,是因为我们要通过主存地址格式中的主存字块标记与cache中的标记位来进行比较来知道当前cache快中的数据是否是需要取的。

直接映射

先将主存按Cache大小分区,而后每个主存区某块只能放到Cache中与之
块号相同的位置;

映射过程:

主存地址高m位被分成了两部分:低c位指代Cache的字块地址,高t位指代主存字块标记。当缓存接到CPU送来的主存地址后,只需根据中间c位字段找到对应的Cache块,然后根据Cache块中的“标记”是否与主存地址的高t位相符来判断,若符合且有效位为1,表明Cache块已和主存的某块建立了对应关系,可根据b位地址从Cache中获取信息;若不符合或有效位为0,则从主存读入新的字块来代替旧的字块,同时修改Cache标记。

形式如下
在这里插入图片描述
有一个公式来通过主存的字块号来对应cache中的字块号:
每个主存块只与一个缓存块相对应,映射关系式为:$i = j \mod C $
其中,i为缓存块号,j为主存块号,C为缓冲块数。

这里解释一下为什么m = t + c:

  1. 首先c是如果来的呢,其实就是cache快数的二进制表示下的位数,意思就是我们将主存映射到cache中采用的是mod的运算来进行的,通常我们会把缓存块的数量设置成 2 的 N 次方。这样在计算取模的时候,可以直接取地址的低 N 位,也就是二进制里面的后几位。比如这里的 8个缓存块,就是 2 的 3 次方。那么,在对 21 取模的时候,可以对 21 的 2 进制表示10101 取地址的低三位,也就是 101,对应的 5,就是对应的缓存块地址在这里插入图片描述
  2. t:取Block地址的低位,就能得到对应的Cache Line地址,除了21号内存块之外,13号、5号等很多内存块的数据,都对应着5号缓存块。既然如此,假如现在 CPU 想要读取 21号内存块,在读取到 5 号缓存块的时候,我们怎么知道里面的数据,究竟是不是 21 号对应的数据呢?
    这个时候,在对应的缓存块中,我们会存储一个组标记(Tag)。这个组标记会记录,当前缓存块内存储的数据对应的内存块,而缓存块本身的地址表示访问地址的低N位。就像上面的例子,21 的低 3 位 101,缓存块本身的地址已经涵盖了对应的信息、对应的组标记,我们只需要记录 21 剩余的高 2 位的信息,也就是 10 就可以了。

直接映射的练习

在这里插入图片描述

  1. 首先我们根据寻址方式算出主存和cache的地址位数,如主存1MB就是以字节为基础的 2 20 2^{20} 220的大小,所以寻址空间为 20位,而cache已经指明了是字,依据题目一字 = 4 字节,所以cache有 11 位。
  2. 我们根据cache块长计算出cache中块的个数和主存中块的个数,这里cache 有 512 = 2 9 512 =2^9 512=29块,主存则是 2 20 / 2 2 = 2 18 2^{20} / 2^2 = 2^{18} 220/22=218块。
  3. 依据上边我所描述的,我们知道主存地址格式前边的标志的位数与主存的块数的二进制位数相同 ,所以总的为 18位,其中c = cache中块数的二进制位数,所以是 9,那么t = m - c = 9.
  4. 至于块内地址位数,就是块长与寻址长度的关系,这里块长为1字,寻址为一个字节,由1字 = 4 字节,所以需要两位。故最后主存格式如下
    在这里插入图片描述

这里所给的区号,其实就是我上边所描述的主存m为地址以cache块数的二进制位数c为分界线的高位,区内块号就是低位。

组相联映射

是全相联与直接映射的折中—
先将主存按Cache大小分区,而后各区(Cache相当于只有一个区)分组(组内有若干块);之后:

  • 组的映射按照直接映射规则进行;
  • 组内各块则按照全相联规则映射。

组相联映射是对直接映射和全相联映射的一种折中。它将Cache分成Q组,每组有R块,并有以下关系: i = j m o d    Q i = j \mod Q i=jmodQi为缓存的组号,j为主存的块号。某一主存块按模Q将其映射到缓存的第i组内。假设现在c = 5,q = 4,r = c - q = 1,它表示的意思是:缓存共有2 5 = 32个块,一共分成了2 4 = 16个组,每个组包含2 1 = 2个块,主存中的某一字块可以按模16映射到Cache某组中的任一字块。

上边关系式子对比直接映射的式子我们可以将cache分组后的每一个组当成一个新的块,我们需要将主存中的块通过mod 运算映射到cache的组号上来。

对于上边通过主存块号映射到cache中的组号

规则示意图
在这里插入图片描述

  1. 标志位数 + 组号位数 = 主存块数二进制位数。

综合习题

在这里插入图片描述

  1. 写出主存和cache的地址线位数分别为 2 19 和 2 12 2^{19} 和2^{12} 219212
  2. 依据块长,计算出主存和cache中的块数: 2 17 和 2 10 2^{17} 和2^{10} 217210,这里因为块长是4个16位字,而主存和cache存储单元都是16位,因此地址位数除以 4 = 2 2 4 = 2^2 4=22就得到块数。
  3. 对于直接映射,cache字块地址位数=cache块数二进制的位数,这里就是10,依据m = t + c,所以主存字块标记位数是 17 - 10 = 7 位,同时块内地址位数看,块中有4个存储单元,因此为2位。
  4. 全相联的话,只有两个部分,主存字块标志 = 17 ,后边的块内地址位数同上。
  5. 对于二路组相联映射,这个二路表示一组有2块,那么我们先求出组数 = 2 10 / 2 1 = 2 9 2^{10}/ 2 ^ 1 =2^9 210/21=29,所以组地址位数 = 9 ,主存字块标志位数 = 17 - 9 = 8位。三者结果如下图在这里插入图片描述

参考博客:

  • 12
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落春只在无意间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值