浅谈主存和Cache间的地址映射
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈主存和Cache间的地址映射相关的知识,希望对你有一定的参考价值。
参考技术A最近在学计算机架构,正好学到主存与Cache间的地址映射,记录一下,方便以后复习回顾。
学一个东西要弄清楚这个东西有什么用,发明它的目的是什么。Cache和主存的地址映射则主要是为了加快CPU的处理速度,因为如果CPU每次都要从主存(如4GB)中找数据的话就太慢了,但是如果在Cache(如64K)中有对应主存的数据,这样就很快了。下面的地址映射方式都是想判断主存中某个数据在不在Cache中,只不过效率不同而已。
首先指明基础单位,简单来说,有4个基础单位: Bit , Byte , Block , Word
其中
在主存和Cache间的地址映射过程中,都是使用 Block 作为基本单位来交换数据,因为这样更加高效
主存和Cache有三种地址映射方式
全相连映射大概如下图所示:
Cache和 Main Memory(MM) 都被分为一定数量的 Block ,即图中的b(0), b(1), ...
由图可知,Cache被分为 C/B-1 个 Block ,Main Memory被分为 M/B-1 个 Block (C是缓存大小,如64k=2^16 Bytes,同理B和M分别是 Block 和MM大小)
全相连映射方式比较简单,其思想是MM中的任意一个Block可以存在Cache中任意一个Block中,寻址方式如下图:
BTW:Associative Memory(相联存储器)的列数和Cache的列数一致
例题1:
Assume that cache capacity is 64KB in a computer system, data block size is 16 bytes, main memory capacity is 4MB, fully associative mapping is used.
直接相连映射与全相连映射的不同之处在于它将MM中的Block分成了一个个Area,每个Area的大小都和Cache相同,并且每个Area中的Block只能存在Cache中对应位置的Block,例如:MM中Area0的b(0)只能存在Cache中的b(0),Area1的b(0)也只能存在Cache中的b(0),以此类推。因此它也要求MM的大小必须是Cache大小的整数倍。
Ei是Area编号,Bi是Area中的Block编号,bi是Cache中Block编号,Block Address是Block中的地址
首先,由Bi选出Directory Table中对应的Block,该Block存着Area编号,将这个编号和MM Address的Ei比较一下,相同的话就说明在Cache中找到了对应MM中的数据(Hit),然后直接把MM Address的Bi和Block Address当做Cache Address去Cache找。
例题2:
Assume that cache capacity is 64KB in a computer system, data block size is 16 bytes, main memory capacity is 4MB, direct associative mapping is used.
组相连映射的思想相当于结合了前两种映射思想,在已经分好Area的基础上再进一步地分Group,每个Areaz里面有若干个Group,与直接相连映射不同的是,组相连映射要求的只是每个Group必须一一对应,而Group里面的Block则是随意对应(即全相连映射)
Gi是Group的编号,其余同直接相连映射
同理,先由Gi选出Directory Table中对应的Group,再把Ei和Bi与其内容作比较,相等就说明Cache中存在MM中的数据,然后直接把Directory Table中的bi和MM Address中的Gi当成Cache Address去Cache中找数据
例题3:
Assume that cache capacity is 32KB in a computer system, data block size is 64 bytes, main memory capacity is 1MB, set associative mapping is used and the group count is 128.
最后,总结一下三种映射方式,当组相连映射中的Group数量减少到1时,组相连映射变成全相连映射,当Group数量增加到Block总数时,组相连映射变成直接相连映射。
(计算机组成原理)第三章存储系统-第六节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间的地址映射的主要内容,如果未能解决你的问题,请参考以下文章