[408计算机组成原理] 加深理解 (更新中)

Cache容量、位数、缺失损失、命中率等相关计算总结与例题

深入研读Cache存储的计算

假设某个计算机的主存地址空间是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位主存地址
image
OK,Cache也需要用19位作主存块的标记。加上一块用一个有效位。
image
2)这种告诉主存地址求解Cache行号的问题是最有趣的。
直接映射:主存地址告诉我们以后,马上想:这是按照字节编址的,3200,就是对应着主存的第3201B的位置,因为是从0B开始编号的嘛。然后就开始想,直接映射中,主存块和Cache块对应,相邻的主存块是存在不同的Cache块中的。
而一个主存块是好几个字节,那么直接拿3201B/64B=50.01,取整即可得到这是主存块号为50的。马上去对应Cache的块号:50mod8=2,即:对应在Cache的行号为2.
二路组相连映射:道理相同。但是需要强调的是,划分好主存块后,需要注意,相邻的主存块不同组!
比如这里50mod4=2即可,表示,二路组相连以后,只剩下4组,那么拿50除余即可。有时候会脑洞大开:将主存块打包成组,共25组,然后不伦不类的去映射组,就犯了一个错误:让相邻的主存块映射到了同一个组!
特别注意,当我们去对一个数取余数的时候,表示编号是从0开始。比如对8取余,表示编号是从0到7,对4取余表示编号从0到3。这里很容易一个不小心就取51而不是50,所以每一步都要思考这是编号还是总数目的问题。50块可以存储3200B(0~3199), 所以用0~49块存储。第3201B(编号3200)用的是编号50的主存块。这样的思考轨迹,可以确保思路是正确的。结果也是最准确的。

计组+OS | 【Cache】Cache容量、位数、缺失损失、命中率等相关计算总结与例题

Cache的标记和有效位是如何在硬件上实现的,储存于哪个位置?

tag和有效位存储在“片内sram”里。访存时cpu首先访问片内sram,具体做法是根据地址的某几位开启sram中对应的cache line(注意,全相联结构使用CAM电路,CAM可以同时对所有cache line进行比较,因此没有“开启”这一步),然后确认cache line是否有效并比较cache line的tag,如果cache line有效且tag吻合,就可以取出数据;如果条件不满足,cpu会转而通过总线访问片外dram内存芯片。

posted @ 2023-07-19 21:24  泥烟  阅读(101)  评论(0编辑  收藏  举报