Cache – 主存的地址映射及相关计算问题

在开始本篇博文之前,首先来介绍下问题背景,以便于初学者能更好的理解(当然其实我也是个小白),如果大家已经了解问题背景,直接跳过下面两段,不用听我多BB。


对于Cache,即高速缓存,是用来解决主存与CPU速度不匹配问 题,Cache的出现使得CPU可以不直接访问主存而直接与高速Cache交换信息。由于程序访问的局部性原理可以很容易设想只要将 CPU近期要用到的程序和数据提前从主存送到Cache,那么就可以做到CPU在一定时间内只访问Cache,这样CPU与高速Cache进行通信,就大大提高了计算机的运行速度。
在Cache – 主存的地址映射之前,首先要将主存与Cache都分成若干块,每块又包括若干个字,并使得它们的大小相同(即快内的字数相同)。在划分好块后,下面要做的就是将主存块与Cache块形成映射就行了。而这里的映射则是通过块的地址形成映射关系。对于地址映射,首先将主存地址分成两块,高n1位为主存的快地址,低n2位为快内地址。Cache同理也是这样划分。这里我原来一直有一个误区,就是认为字块中存放的是数据地址,其实不然,字块中存放的就是真正使用的数据,只是映射时使用地址来映射。在一切准备就绪后,就可以进行映射了,下面开始本篇博文的正文。
Cache – 主存的地址映射方式有很多,有直接映射,全相联映射,组相联映射。

1.直接映射

在这种映射方式下,每个主存块至于一个缓存块相对应,映射关系为:
i=j mod C 或 i=j mod 2c
其中,i为缓存块号,j为主存块号。在这种取模方式下,很容易就知道每个缓存块对应若干个主存块。
不废话直接上图:
这里写图片描述
下面针对该映射方式,举一个小例子:
当缓存接收到CPU发送来的主存地址后,只需根据中间c位字段(假设为00…01)找到缓存块1,然后根据字块1的”标记”是否与主存地址的高t位相符合,若符合且有效位为1(这里的有效位用来识别Cache存储块中的额数据是否有效,因为有时Cache中的数据是无效的,例如,在初始时刻Cache中的额内容为空,是无意义的),则表示该Cache块已和主存中的某块建立了对应关系,则可根据b位块内地址从Cache块中取得对应的字,即找到CPU发来的主存地址在缓存中所对应的信息;若不符合,或者有效位为”0”,则主存读入心得字块来代替旧的字块,同时将信息送往CPU,并修改Cache“标记”位。如果有效位为”0”,还得将有效位置为 “1”。
小结:直接相联映射方式的缺点是不灵活,每个主存块只能按照取模固定地映射到某个缓存块,即使缓存内其他块空着,也不能用来映射。因而如果程序恰好要重复地使用对应同一缓存块的不同主存块,那么久需要不同的替换,这样会降低命中率。

2.全相联映射

为了解决直接相联映射不灵活的问题,出现了全相联映射。全相联映射不是通过字块号来寻找字块,而是将主存地址中的标记与缓存中每个字块的标记进行比较,如果找到与之相同标记的缓存块,则表明所访问的主存地址在缓存中,之后在Cache中找到缓存块后,再根据主存地址的低b位找到快内地址,这样就找到对应的字,也就是需要的数据。因而在这种映射方式下,主存地址中只需要主存字块标记和字块内地址就行。具体的映射和主存地址格式如下:
这里写图片描述
小结:全相联映射允许将主存中的每一字块映射到Cache中的任意一块位置上。显然这种映射方式相对于直接映射,更加灵活,因而命中率也更高,缩小了块冲突。
由于需要将主存地址中的标记与每一个缓存块的标记进行比较,也就使其具有了”按内容寻址”的特点。同时也因为这个特点,所需的逻辑电路较多,成本也比较高,实际的Cache还要采用各种措施来减少比较次数。

3.组相联映射

针对上述直接映射和全相联映射出现的问题,现在出现一种折中的映射方式,即下面介绍的组相联映射。该映射方式将所有Cache分为Q组,每组有R块,则有以下关系:
i =j mod Q
其中i,j的含义与直接映射中的含义一致。上述表达式意思即为某一主存块按模Q将其映射到缓存的第i组内,具体步骤即主存地址格式如下:
这里写图片描述
这里之所以说组相联映射是直接映射和全相联映射的折中,是因为按照直接映射中取模的方式,某个主存块映射到Cache中的组是固定的,但是在组内,又按照全相联映射原则,”按内容寻址”,即通过主存字块标记可以映射到该组中任意一块Cache块。
这样就更好理解了该映射方式下主存的地址格式,首先通过组地址找到Cache块所在的组,之后按照全相联映射方式,通过和组内的每一块比较主存字块标记来寻找需要的具体字块,最后通过字块内地址在Cache块中找到有效的物理地址。
这里看似主存地址很复杂,其实只要知道Cache一共有多少组即可确定组地址的位数,之后字块内地址与前面两种映射方式所说的一致,最后通过总位数减去组地址位数和字块内地址位数即得主存字块标记位数。
有个需要记住的小知识点:若每组内有n块Cache块,则该种映射方式又称为n路组相联。
其实这里有个转化方式,当r=0,即每组内有 2r=20=1 块,那么此时组相联即变为直接相联,同理,r=c,每组内有 2r=2c 块,即所有的Cache字块都在一组,那么此时组相联即变为全相联映射。


空口吹谁都会,下面将通过两个例子更加详细和直观地介绍下主存地址格式(这两题都是唐朔飞老师《计算机组成原理》中的题目,我将用自己的语言平实简单表达出来,希望大家更好的理解):
例1.假设主存容量为512KB,Cache容量为4KB,每个字块为16个字,每个字为32位。问:
(1).Cache地址为多少位?可容纳多少块?
(2).主存地址为多少位?可容纳多少块?
(3).在直接映射方式下,主存的第几块映射到Cache中的第五块(设起始字块号为1)
(4).画出直接映射方式下主存地址字段中各段的位数。

答:
(1).这里没有说按照字还是字节编址,那么按照其给的容量的格式,可以得出其默认按照字节编址。那么根据容量的计算方法:地址数*字长,则Cache的4KB可得地址数为4K,即 212 个数据单元,每个数据单元为8位,即一个字节B,那么就可以得到地址为12位,每块有16*32位,则4KB的Cache可容纳的块数为:4KB/(16*32位)=64块。
(2).同一理可得到主存地址为19位,可容纳 213 =8192块.
(3).Cache共有64块,则按照主存块号按照64取模为5的主存块都会映射到Cache中的第5块,则满足要求的主存块号为 5,64+5,264+5,......,21364+5
(4).要求主存地址格式,首先可以求字块内地址,由于按照字节编址,即按照字节访存,则最小数据单元为字节,那么每个字块内有 1632/8=64 个最小访存单元,每个单元有一个地址,那么字块内就有64个地址,这样的话字块内地址就需要6位,即在直接映射下主存地址中b=6,由于Cache共有64个字块,所以需要6位即有 26 地址才能访问到每个Cache块,即c=位,所以最终 主存字块标记位数=主存地址数-字块地址数-字块内地址数,即t=19-6-6=7位,所以得到主存地址格式为:
这里写图片描述


例2.假设主存容量为512K*16位,Cache容量为4096*16位,块长为4个16位的字,访存地址为字。
(1).在直接映射下,设计主存的地址格式。
(2).在全相联映射下,设计主存的地址格式。
(3).在二路组相联映射方式下,设计主存的地址格式。
(4).若主存容量为512K*32位,块长不变,在四路组相联映射下,设计主存的地址格式。

答:
(1).按照例1中,用容量除以块大小得到块的个数,个数为:(4096*16位)/4*16位=1024= 210 ,所以Cache块地址位数为10,即c=10,由于这里按照字访存,主存地址也很容易得到为19位,对于字块内地址,字块内共有4*16位/16位=4个访存单元,所以就有4个字块内地址,所以字块内地址就有2位,即b=2,所以最后求得主存字块标记有19-10-2=7位,得到主存字块地址格式:
这里写图片描述

(2).在全相联映射下,主存地址仅由字块内地址和主存字块标记构成,而字块内地址在(1)中求得为2位,所以这里的字块内地址为19-2=17位。此时的主存地址格式为:
这里写图片描述

(3).在二路组相联映射中,每组有两个字块,所以一共有 210/2=29 组,故组地址有9位,即q=9,由于每个字块到这里都是没有变化的,所以字块内地址仍为2位,即b=2,所以主存字块标记为19-9-2=8位,故得到主存地址格式为:
这里写图片描述

(4).主存容量为512K*32位,即双字宽存储器,即每次可以访问两个字(最小访存单元),这里的访存地址单元仍为字没有变,并且块长仍为4个16位的字,所以字块内地址仍为2位,而主存容量可以转为512K*32位=1024K*16位,这样就可以得到共有1024K个字,即 220 个数据单元,地址数为 220 ,所以主存地址有20位。同时,这里改为四路相联组映射,即每个Cache组内有4个Cache块,所以共有 210/4=28 组,所以组地址为8位,即q=8,这样得到主存字块标记有20-8-2=10位,得到如下主存字块地址格式:
这里写图片描述

总结:
1.直接映射为固定的映射关系,不灵活。
2.全相联映射为灵活性映射关系,通过主存字块标记,以按内容寻址的方式查找缓存块。
3.组相联映射为上述两种的折中,主存块被分配到固定组的任意一个缓存块。
4.在求主存地址格式时,要找好各字段的位数,尤其要注意访存地址单元是字还是字节。

PS:不得不说虽然最近复习组成原理,操作系统,计算机网络,复习到头大,不过也确实让我的新博客也有了更多的素材,这才使得我的博客稍微热闹起来。这篇博客算是讲的比较详细了,因而相对于大神来说废话也比较多,其实是比较照顾比我还小白的小白,所以小白可以好好看看,大神可以点过赞之后直接绕道,哈哈~总之,祝大家复习好运~

  • 211
    点赞
  • 550
    收藏
    觉得还不错? 一键收藏
  • 45
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值