主存与Cache间组相联映射计算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主存与Cache间组相联映射计算相关的知识,希望对你有一定的参考价值。

设32位计算机的主存容量为2GB,存储器按【字】编址,Cache容量256KB,每块16B,Cache按照4路组相联方式组织,则主存地址_______位,其中标记字段____位,Cache组地址____位,块内地址____位,主存地址4567H映射到Cache的____组。

先给个答案吧,追问你的话在给一点过程。

32位按字编址(四字节),2GB/4B=512M=2^29,那么主存地址29位。
cache:256KB/(4*16B)=4k=2^12 组地址为12位
块内地址:16=2^4 ,块内地址4位
主存标记=29-12-4=13 位
4567H=0100 0101 0110 0111

后四位是块内地址 前12位是组地址
映射到Cache为 0100 0101 0110= 456H 组
参考技术A 2GB/4B=512M=2^29,主存地址29位
cache组地址:256KB/(4*16B)=4k=2^12,cache组地址12位
cache块地址:4(路)=2^2,块地址2位
cache块内地址:16/4=2^2,cache块内地址2位(按字编址,每个单元4字节,不是1字节)
主存标记:2G/256K=8192=2^13,主存标记字段13位(13=29-12-2-2)
4567H=0100,0101,0110,0111B
右数第1-2位是块内地址,右数第3-4位是块地址,右数第5-16位是组地址
映射到Cache的组=0100,0101,0110B组=456H组
参考技术B 32位按字编址,那么主存地址256M位。
cache总块数就是256/16=16k块。他的高m位就是t+c=31+14=45位
组地址q=c-r=14-4=10
块内地址4位
4567H=0100 0101 0110 0111,这个计算好烦。。。

(计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射直接映射和组相连映射)

前面说过,Cache中实际保存的是主存中的数据副本,所以这里会涉及一个很重要的问题:Cache和主存是如何映射的?所谓地址映射是指把主存地址空间映射到Cache地址空间,也即把存放在主存中的信息按照某种规则装入Cache。
地址映射的方法有以下三种

  • 全相联映射(主存块可以放在Cache的任何位置)
  • 直接映射(每个主存块只能放到一个特定的位置,其位置由主存块号 % \\% %Cache总块数来确定)
  • 组内映射(将Cache块分为若干组,每个主存块可以放到特定分组中的任意一个位置,其中组号=主存块号 % \\% %分组数)

下面一个问题就是如何区分Cache中存放的到底是哪个主存块呢?其实,我们可以给每个Cache块增加一个“标记”,记录的是对应的主存块号,这些标记实则都是二进制信息,因此开始时会被初始化为0,同时我们还需要加上一个有效位,表示其是否生效,以免产生某些冲突

接下来我们采用下面的例子说明这三种方式的特点:

假设某个计算机的主存地址空间大小为256MB,按字节编址,Cache有8个Cache行(也即Cache块),行长(也即块大小)为64B。
这里,块大小为64B( 2 6 B 2^{6}B 26B),主存为256MB( 2 28 B 2^{28}B 228B), 那么主存块数= 2 28 2 6 = 2 22 \\frac{2^{28}}{2^{6}}=2^{22} 26228=222,因此主存块号编号范围为从0到 2 22 2^{22} 222-1,其中22位作为主存块号,6位作为块内地址,因此每个主存块的地址范围如下

一:全相联映射

全相联映射下,主存块可以放置在Cache任意位置
比如0号主存块,它就可以放置到Cache的3号位置,每行的标记号用于指出该行取自主存的哪一块,同时将对应的有效位置为1,后续主存块存放也是如此方式。

那么全相联映射下,CPU是如何访问主存的呢?以上图紫色主存块为例,其地址为1…1101001110。

首先会取上面的地址的前22位,也就是主存块号,来和Cache中每一行的标记进行对比

  • 若标记号=块号其有效位为1:说明Cache命中,也就是说此时访问的数据在Cache中是有副本的,因此接着只需访问后6位地址所定位的单元即可
  • 若标记号不匹配或匹配但是有效位为0:此时说明Cache未命中,则正常访问主存

二:直接映射

直接映射就是用主存块号 % \\% %Cache总块数来确定位置
比如0号主存储块,由于 0 % 8 = 0 0\\%8=0 0%8=0,因此它只能放到Cache的0号位置,如果此时再放入8号主存块,那么经计算它也要放到0号位置,因此这里就必须把之前的给腾空,相应的标记位也要修改

直接映射中我们可以对标记号进行一定的优化。仔细观察可以发现,Cache块数=8= 2 3 2^{3} 23,其指数部分为3,因此主存块号末尾的后3位就直接反映了它在Cache中的位置,比如上图中的0号和8号,其主存块号的后三位均为000,这也就正好对应了它们在Cache的第0行

因此标记可以直接取主存块号的前19位,相应地址形式变化为下面这样

那么直接映射下,CPU是如何访问主存的呢?以上图橙色主存块为例,其地址为0…01000001110

首先会根据主存块号的后三位确定Cache行,接着会判断前19位和标记号是否匹配并同时判断有效位是否为1,如果是则Cache命中,接下来根据块内地址操作即可,反之会访问主存。

三:组相连映射

组相连映射中每个主存块可以放到特定分组中的任意一个位置,其中组号=主存块号 % \\% %分组数

这里我们使用2路组相连映射(2块为一组,分为四组)。比如1号主存块,由于1 % 4 = 1 \\%4=1 %4=1,因此它会被放入第一组的任意位置,接着 2 22 2^{22} 222-3号主存块也会放入第一组,它会放到另一个空闲位置

和直接映射一样,分组数=4= 2 2 2^{2} 22因此主存块号后两位相同的会处于一组,所以标记号也只需取前20位即可,相应地址可以被划分如下

那么在组相连映射下,CPU是如何访问主存的呢?以上图橙色主存块为例,其地址为1…0100001110

首先会根据主存块号的后两位确定所属分组号,若主存块号的前20位与分组内的某个标记号匹配同时判断有效位是否为1,如果是则Cache命中,接下来根据块内地址操作即可,反之会访问主存。


因此这三种方式各有其优缺点

  • 全相联映射:优点就是Cache存储空间利用充分,命中率高;缺点就是查找慢,有时可能要比对所有行的标记
  • 直接映射:对于任意一个位置,只需对比一个标记,速度最快;缺点就是Cache存储空间利用不充分,命中率低
  • 组相连映射:是上述两种方式的折中,综合效果较好

以上是关于主存与Cache间组相联映射计算的主要内容,如果未能解决你的问题,请参考以下文章

(计算机组成原理)第三章存储系统-第六节2:Cache和主存的映射方式(全相联映射直接映射和组相连映射)

主存到Cache直接映射全相联映射和组相联映射

Cache与主存之间的全相联映射,直接映射和组相联映射的区别

cache中的数据是啥的映射

有一主存/Cache层次的存储器,其主要容量1Mb,Cache容量64Kb,每个数据块的大小16B若采用两路组相联映射方式

2016-05-I