目录
1.根据访存地址在Cache中查找数据
2.如果在Cache中命中
3.如果没有命中
4.数据送CPU
5.做几道题:
主要厘清思路,中间细节需自行补充!
1.根据访存地址在Cache中查找数据
① 访存地址的结构会根据Cache和主存之间的映射方式不同而改变。映射方式有三种:直接映射,全相联映射和组相联映射(这里不细讲,还不清楚的可以到主页搜关键词或者回看书)。
注意:
第一点:
Cache只是保存了主存的一部分副本,主存会将某些主存块复制到Cache中,也就是Cache行中。也就是Cache行的大小等于主存块的大小。所以不能把Cache行想象为一行一行的结构,因为里面包含很多个存储单元。
第二点:
在直接映射中,有下面的关系图,可能会有人误解,Cache是由Cache行号和块内地址组成的,不是这样的。
这里这样画的原因:
Cache的块数(行数)比主存块数小很多,所以表示Cache块的位数肯定比表示内存块的位数小。这里的位数差就可以反映Cache和主存的容量差。(例如,主存块为16块(2^4),Cache块为4块(2^2),那么2^4/2^2=4,主存容量就是Cache容量的4倍)。
假设主存块号为13,Cache总行数为4(也就是只拷贝了主存的4个主存块)。那么其Cache行号=13%4=1。主存块号用二进制表示出来是1101。这里的01,和上面作余求出来的结果是一样的。所以用主存块号的低位就可以计算出Cache的行号,具体用低几位?
那就要看Cache的总行数,例如上面Cache行为4,那么用2位(2^2)就可以表示Cache行号了。
那么主存块号的高位用来作什么呢?主存块号的高位,我们称之为"标记位"。在Cache行中也有相应的标记位。将主存地址的高位的标记位与Cache中的标记位进行匹配。如果匹配成功,且Cache的有效位置"1"。那么就表示"命中"。也就是CPU想要的数据可以在Cache中找到,不需要访存了。
所以Cache数据区的容量比主存小很多,小多少可以看两者位数的差值(差的位数),而两者的差值正好对应tag的位数。例如:根据主存容量是 Cache 容量(当然是数据部分Cache)的 4096 倍。那么tag位就有12(2^12)位。
结论:tag位数=log2(主存大小/Cache数据区大小)
第三点:
那么Cache的真正结构是什么呢?
上面反复提到了Cache的数据区。首先我们要明白,我们常说的Cache块的大小和主存块大小相同实际指的是数据Cache(Cache的数据部分)。例如下图,主存块大小为64B,那么Cache的数据部分就是64B。
相对于主存块,Cache还有额外的标记项,上面的标记项忽略了脏位和替换控制位,实际的Cache行标记项:
在组相联映射中将每组各行的标记项排成一行,将各组从上到下排列,构成一个二维的标记阵列。查找 Cache时就是查找标记阵列的标记项是否符合要求。二路组相联的标记阵列如图
2.如果在Cache中命中
以直接映射为例,首先会根据访存地址的主存块号的低位找到相应的Cache行,接着对比这个Cache行对应的标记位,如果标记位相同,且有效位为"1",则命中。这时根据访存地址的块内地址,在Cache行中存取信息即可。
3.如果没有命中
则需要到主存中找读数据,这就需要将逻辑地址转换为物理地址(涉及操作系统--内存管理内容),并且根据物理地址,在主存中查找相应的数据。
以页式存储管理为例:
拿个题举例:
一分页存储管理系统中,逻辑地址长度为16位,页面大小为4k,现有一逻辑地址为2F6AH(十六进制),页号对应块号如下表,求逻辑地址2F6AH对应的物理地址。
① 将十进制转换为二进制为0010 1111 0110 1010 页号 页内地址
② 由于页面大小(内存块大小)为4K,那么页内地址位数:4K=2^2*2^10=2^12。那么页号位数就是16-12=4位。页号(0010)=2,对应块号是7(0111)。
③ 物理地址:
块号+页内地址:0111 1111 0110 1010 块号 页内地址
④ 最后将这个地址写为16进制就行。
其他的,具有快表的地址变换机构,以及其他的内存管理方式(段式存储管理,段页式存储管理)可以看这篇:(计算机组成原理和操作系统这两部分一定要结合起来学)
http://t.csdnimg.cn/C6fw7
4.数据送CPU
在主存中找到相应数据后,还需要将数据送到Cache行中。将标记设为地址的高位,有效位置"1"
同时将该地址的内容送CPU。
直接映射:对于直接映射,主存中的每一块只能装入Cache的对应行(主存块号%Cache总行数)。所以将数据送到对应Cache行中即可。
全相联映射:将数据送到Cache的任意空闲行中。
组相联映射:送到相应的Cache组内的任意空闲行中。
注意:即使CPU要找到数据对应存在于主存的某个存储单元中,但是CPU还是会读出这个存储单元所在的内存块的一整块信息送到对应的Cache行中。
5.做几道题:
地址映射表,即标记阵列,指的是Cache的标记项(有效位,脏位,替换控制位,标记位),由于这里忽略了脏位和替换控制位,所以只需要考虑有效位(1位)和标记位:
标记位有多少位呢?
根据主存容量是 Cache 容量的 4096 倍。那么tag位就是12位(2^12)。所以标记项就是12+1=13位。
又因为Cache有64块,所以地址映射表大小:64*13bit
这里的有效容量指的就是Cache的数据部分,每块16B,那么Cache行大小=主存块大小=16B=2^4。
① Cache中总共有多少Cache块:2^7*2^10=2^17 2^17/2^4(16B)=2^13
② 总共有多少cache组:2^13/2^3(8路组相联)=2^10
③ 主存地址:标记(剩余部分)+组号(10位)+块内地址(4位)
1234567H=0001 0010 0011 01 00 0101 0110 0111
00010010001101转化为16进制,答案C。
直接映射方式:主存地址:标记+行号+块内地址
① 主存容量(2^20)是Cache容量(2^4*2^10=2^14)的2^6倍,所以标记位为6位。
② 每字32位,块内地址为5位(2^5)
③ 主存地址:0011 0101 0011 0000 0001
010011000换算为十进制:152
组相联映射中,主存地址的组成:标记+组号+块内地址
主存块大小和Cache块大小都增加一倍,那么块内地址位数+1(自己想一下2^2=4是2^1=2的一倍)。
n路组相联表示每组中包含n个Cache行,Cache的总容量不变,Cache的大小增加一倍,那么Cache行数减少一倍,组数自然减少一倍(试想一下,8行2路,则有4组,现在4行2路,则只有2组)。块内地址和组号一增一减,tag位数不变。
直接带选项,拿B选项举例:
直接映射:
① 主存按字节编址,块大小是16B,所以先要计算主存单元在哪个主存块中:
由于主存单元从0开始编号,则48号主存单元,其实是第49个主存单元:49/16=3.065。则存放在第4个主存块中,主存块号是3
② 主存块号是3,再余Cache行数,3%16=3。则存放在3号Cache行。
另一个同理,308/16=19 19%16=3。
组相联映射:
48号存储单元主存块号是3,余Cache组号(8组):3%8=3。
另一个同理:19%8=3。
都存放在3号Cache组中,所以可能发生冲突。
采用全相联映射,主存地址:标记+块内地址
主存块大小为1个字(32位)=4B,所以用2位表示即可。剩余30(32-2)位为标记
Cache容量=存储容量+标记阵列容量
① 题目中已经告知存储容量为32K字数据:2^5*2^10*2^5=2^20
② 题目中采用回写法(脏位1)随机替换策略(不需要替换控制位)。所以每个Cache行的标记项组成:
有效位(1)+脏位(1)+标记位(30)=32
③ Cache块可以存放32K字数据,主存块大小=Cache块大小=1个字。所以Cache块数为
2^15(32K=2^5*2^10)
④ 所以Cache容量:2^20+(1+1+30)*2^15=2^10(1024+1024)=2048K