假设某个计算机的主存地址空间是256MB,按照字节编址,其数据Cache有8行,行长有64B.
从这道题目里要好好领悟Cache策略的优美之处。
1)不考虑用于Cache的一致性维护位和替换算法控制位,并且采用直接映射方式,则该数Cache的总容量是多少?
2)若该Cache采用直接映射方式,则主存地址为3200(十进制)的主存对应的Cache行号是多少?若采用二路组相连映射又是多少?
解: 首先,这类题目的考法再怎么变化其实都是很直接的。前提是,你真的理解了背后的设计思路。
1)不空谈,看第一道。
不管是直接映射还是组映射,Cache总容量的计算方法是一样的:存储容量加上标记容量。
存储容量几乎不用多计算,题目中已经给出来。主要是标记容量的计算:需要考虑不同映射方式的差别。
为什么标记?先看主要原因,一个主存块对应到哪一个Cache块,在主存地址结构中就体现出来了。比如直接映射,低位是块内地址,中间是Cache块号,剩下的是总的存储位数减去前面两个,也可以这样计算:低位的Cache号和块内位数可以索引Cache存储体的全部位置。而一个主存相当于多少个Cache呢?用主存的大小除以Cache总容量,得到数据可以解读为多少个Cache,换算成二进制,幂就是高位的数目了。
假设我们有很多个Cache服务于主存。Cache之和恰好是主存大小。那么,每一个Cache的存储地址高位—Cache块号都是一模一样的,具体的行内地址这个我们不用管,反正就是和主存低位一样即可。现在我们知道主存分成一段一段的,每一段对应一个存储Cache.
但现实是Cache,这每一段都共用一个Cache,没关系,除了需要标记一下是哪一段以外,其他都相同。
回到题目中,标记容量就是这样,主存高位用了一部分表示自己是哪个Cache块,这个标记要和谁比较才有用?
所以在Cache中必然需要提供这样一个标记:主存高位的块标记。
也即,我们需要从主存地址推导这个标记位数。
然后再看其他的Cache需要用到的标记:有效位,脏位,替换算法控制等。这一般会被告知,最起码的要有一个有效位。
这也是本题中说的:1位有效位。
理论说完,看运用。按字节编址,256MB = 2^8 * 2^20 = 2^28B ==》 28位主存地址
Cache块:64B=26B==>块内地址6位