有一个处理器,主存容量1MB,字长1B,Cache容量16KB,块大小32B。
1.采用全相连映射方式,写出内存的地址格式。
2.采用直接映射方式,请写出内存的地址格式
3.采用组相连映射方式(每组有4行),请写出内存的地址格式
4.设Cache初态为空,CPU依次从内存第1000,1001,1002,…,1499号单元读出500个字(主存一次读出一个字),并重复按此次序读8次,问命中率
话不多说,看题干可以知道
主存:1MB = 2^20字
缓存:16KB = 2^14字
前三问都是写出地址格式
已经知道一共有20位
一共20位 |
---|
(2)直接映射方式(先说第二问,别问为啥懂的都懂)
标记 | 字块地址 | 字块内地址 |
---|---|---|
s-r | r | w |
块大小=行大小=2^w字
2^w = 32B =2^5 得出 w=5
标记 = 主存 - 缓存
s-r=20-14=6,这样就只剩字块地址r,一共20位,已经知道5+6位,所以r=9(当然你也可以通过计算来求出r)
标记 | 字块地址 | 字块内地址 |
---|---|---|
6位 | 9位 | 5位 |
到这里如果还不太明白那就再去看遍书吧(我无能为力了)
(嘘,偷图小能手)
(1)全相连映射方式
标记 | 字块内地址 |
---|---|
s | w |
首先介绍一下全相连映射方式
在全相连映射中,将主存的一个块的地址与块的内容一起存于cache的行中,其中块地址存于cache行的标记部分。也就是说在全相连映射中的标记等于直接映射的标记加字块地址(懂了吧)
所以这就好办了
标记 | 字块内地址 |
---|---|
15位 | 5位 |
(3)组相连映射方式
先看图
我认为组相连映射其实是直接映射的一种延伸,组相连映射(2路组相连)其实就是把直接映射的字块0和字块1拼接成一个新的字块0,我们把这个新的字块叫做组。
标记 | 组地址 | 字块内地址 |
---|---|---|
s-d | d | w |
字块内地址不变,我们不用管。组地址呢就是我上面所说的(其实就是由直接映射的一列字块变成了组相连映射的两列映射 、、、可能不太严谨管他呢会做题就行了)所以我们把直接映射的字块地址直接除以2就行了(四路组相连就除以4)标记也就出来了。
标记 | 组地址 | 字块内地址 |
---|---|---|
8位 | 7位 | 5位 |
(4)可算是到第四问了
命中率 = 命中cache的次数/(命中cache次数+命中主存的次数)
咳咳补充一下:CPU与cache之间的数据交换是以字为单位的,cache与主存之间的数据交换是以块为单位的,当CPU读取内存中的一个字时,便发出此字的内存地址到cache和主存,若此字在cache中,则cache命中,若不在则用主存读周期把此字从主存中读出来送到CPU,(重点来了)与此同时,把含有此字的整个数据块送到cache中
进入正题,题目说一开始cache为空,而且要读8次,所以说我们只要算出第一次cache命中的次数就行了,后面7次的数据已经在cache中,必中。
第一次:CPU读1000,去cache找,没有,再去主存中去找,好的找到1000了,这时候就要用到补充的重点了,我们要把1000所在的整个数据块送到cache中,块大小32B(题目给出了),所以从1000、1001、1002…1031都被送到cache中,当CPU读1001时,1001已经在cache中了,一直到1032,cache中没有了,再重复之前的步骤。从1000、1001、1002…1499共500字一共需要去主存16次(500/32大于15小于16 我们要取16)再套用给出的公式就OK了,等等这个16是读主存的次数,别带错了。
完结,好累
如果文章中有什么错误,大哥们就告诉我吧,小弟立马去更正