Cache-主存地址映射

一.涉及知识点

1.三种地址映射方式

直接映射
地址映象规则: 主存储器中一块只能映象到Cache的一个特定的块中。

  1. 主存与缓存分成相同大小的数据块。
  2. 主存容量应是缓存容量的整数倍,将主存空间按缓存的容量分成区,主存中每一区的块数与缓存的总块数相等。
  3. 主存中某区的一块存入缓存时只能存入缓存中块号相同的位置。
      图2.3.4示出了直接相联映象规则。 可见,主存中各区内相同块号的数据块都可以分别调入缓存中块号相同的地址中,但同时只能有一个区的块存入缓存。由于主、缓存块号相同,因此,目录登记时,只记录调入块的区号即可。在这里插入图片描述
    全相联映射
    在这里插入图片描述

组相联映射(行即块)

直接映射虽然简单方便,但是如果程序同时用到了对应于同一个cache行中的两个主存地址,那么就会发生冲突,结果就是导致这个cache行不停的进行替换操作。所以就有了组相联映射。

将这cache存储器中的256个行分为了4路,每路有64个cache行。这时根据组索引找到的 cache行不再是一个,而是同时找到 4个 cache行,所以才被称为组索引。每路中包含一个cache行。如下图12.7所示,便是一个组相联映射的cache。 因为现在每路中有 64 个 cache 行,所以组索引的宽度变成了6位,而标签域的标签宽度变成了12位。 直接映射中组索引一次只能对应一个cache 行,而现在组相联映射中组索引一次能对应4个cache行,所以现在主存中的一个地址可以存放到4个cache行中的任意一行。 而在直接映射中,主存中的一个地址只能存放到对应的一个cache行中。所以一个cache行被替换的概率减少为原来的四分之一。
在这里插入图片描述

2.主存储器中存储单元地址的分配

在这里插入图片描述
在这里插入图片描述

3.存储容量


我们所说的地址是指的存储单元的个数,即地址线可寻找的地址。关于存储容量的理解,可用下述例子理解:

假设有100个房间,一个房间住一个人,为了找到某个人,就要给这些房间编号,从0到100,那么房间的总容量就是’‘100间x1人’’。在找人的过程中,我们只关心房屋编号而不是里面住的人。这是一般的情况。
比较特殊的情况是,一个房间住了更多的人,比如四个。我们给一个房间标号,就可以找到四个人,可以在相同时间内找到更多的人,这时房间的总容量就是’‘100间x4人’’。
对应到存储容量中理解,一个人就是一个字节,现实系统中的机器,现在也是普遍采用字节编址的,这时地址成为字节地址。而四个人在一个房间,四个字节组成一个新的单位,叫做字,这时的地址就称为字地址。
我们只关心存储单元的个数也就是地址线数可以找到地址范围。不考虑是以字节为单位还是以字为单位。但需要在题目中找到,区分出我们求的是字节地址还是字地址。
如果我们明确按字编址,那就用字地址;没有说明的时候,根据题目给出的容量表述单位,一般采用字节编址。不附加说明的话主要看存储器的容量表达形式。如存储器容量为521KB,就是以字节为单位编码;主存容量为512Kx16位,就是以字长为16位的字编码。

二.例题解答及分析

题目一

在这里插入图片描述
题目解析
题目可得信息:未指明为字编码,同时主存容量表示为512KB,可确定本题采用字节编码形式。在本题中将字节看成最小单位,不可再分。

(1)Cache地址为4K(K大写),不用考虑字节B;
可容纳多少块即求块数,有三种求法:
总块数 =总容量/一个块中的总容量= 总字数/一个块中的字数 = 总字节数/一个块中的字节数;(主要就是统一单位,位/字节/字)

(2)同(1)

(3)关于直接映射,由于i=j mod C(C为Cache的块数) ,映射到第几块,要看余数,余数为5的被放到第五块,故第一个就是5。答案就是kC+5(K=0,1…),有多少个?为了保证主存的地址都可以映射到Cache中,个数主存容量/Cache容量。

(4)分别求出如下的地址位数,对于直接映射。
在这里插入图片描述
字块内地址:按字节编码,一个字块的总字节的地址位数=log2总字节数
16*32/8=64,log64=6;需要六位,其中高4位是字编码,表示16个字,低2位是字节编码,共32/8=4个字节。
在这里插入图片描述
Cache字块地址:地址可以理解为个数,也就是字块个数。(1)中方法。
主存字块标记:可以用标记区分Cache中不同的主存地址位置,通过标记对应唯一的地址表示。就是主存地址长度与Cache地址长度之差。
这三部分共同构成了主存地址
参考答案
在这里插入图片描述

题目二

在这里插入图片描述
题目解析
(0) 分析题目:

  • 本题为四路组相联,每组内有四块。
  • 未指明为字编码,同时主存容量表示为16MB,可确定本题采用字节编码形式。

(1)确定主存地址个段的位数
在这里插入图片描述
需要先求的值:主存和Cache的地址位数,Cache中的块数和组数
组数=总块数/4;
主存24位,Cache13位,块数213/8/(32/8)=210个,组数=28
字块内地址(每个字块的字节大小)和题目一的计算方法相同;
8x(32/8)=25,5位
组地址:即组数;28/22=26;6位
主存字块标记:主存地址位数=字块内地址位数-组地址位数,24-5-6=13位
(2)

  • 每块8个字,对主存和Cache的访问以字为单位;
  • 对主存块的调入是以块为单位的。
  • 第一循环的所有字一定从Cache中找不到,要到内存中调入。
  • Cache中的块数213/8/(32/8)=210个,完全可以同时装下100个字,所以在之后的9次循环中,都会命中。
    在这里插入图片描述
    (3)速度之比等于时间的反比,提高的倍数 不等于 提高后是之前的多少倍,所以不能忘了-1。
    (4)在这里插入图片描述
    参考答案
    在这里插入图片描述

回答juanjuan的问题:
为啥直接和全相联主存字块标记是主存地址减去cache地址,组相联还要减去块内地址?
主存字块标记的作用是为了判断所读的信息是否已在缓存中,根据Cache地址定位主存地址。
子块内地址是为了给所存信息标号。和Cache块内地址总是一一对应,和我们寻找块号无关。
直接映射的Cache字块地址是为了给每个子块内的字位置编号。已知Cache字块地址就可以确定此地址会映射到某一个块的确切位置,它要么在,要么不,而这就由标记确定,从而实现一一对应。
全相联映射,其实因为地址在块上的位置是随机的,所以需要剩下全部的标记索引。
无论组成主存地址有几部分,任何一部分都可以用完整主存地址位数—其余部分的主存地址位数表示,这样就可以实现Cache地址和主存地址一一对应。
该问题有、奇怪。。。

参考于Cache与主存之间的全相联映射、直接映射和组相联映射的区别
里面讲的适合理解原理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值