有关Cache的题目,需要理解Cache的工作原理,也即给出一个地址,要知道如何在Cache中寻找或者如何将其从主存中复制入Cache,同时理解Cache中具体是如何存储的,包含三种存储方式,分别是直接映射、全相联映射、组相联映射。下面我们就此进行探讨。
先看这张图,详细展示了Cache的工作原理:
接下来我们顺着思路来捋一捋。
CPU给出一个地址(不考虑虚实地址的转换),我们要根据这个地址在主存中找到数据,我们要直接根据这个地址在主存中找吗?当然不是,那要Cache何用,Cache的作用就是缓解CPU与主存之间的速度差异,因为CPU很快,访问主存很慢。
那么我们就先拿着这个地址去Cache中找一找,这个地址可以分为两部分——块号和块内地址(实际物理内存),关于块号页号等知识,请看我另一篇文章:【408精华知识】页、页面、页框、页帧、内存块、物理块、物理页面还傻傻分不清?,块内地址则是用于在一个块内给数据定位,毕竟一个块很大,我们要找的数据仅仅是一小部分,所以要有一个块内的具体定位。
这个块号还可以根据Cache映射方式再次进行划分,其中直接映射可以划分为标记位和块号,全相联映射的块号直接转为标记位,组相联映射可以划分为标记位和组号,为什么这样划分呢?我们知道,直接映射的块号是用原地址的块号除以总块数得到的余数,因此直接映射的块号是可以被“隐含”的,不需要再在标记位中“明示”的,组相联也是一样,其组号是是用原地址的块号除以总组数得到的余数,也是可以被“隐含”的,不需要再在标记位中“明示”的,但是全相联不一样了,全相联是用原地址中的块号去跟Cache中的块一个一个比对标记位,没有可以被“隐含”的部分。
得到标记位后,我们就可以去Cache中进行比对啦!
这里要说下Cache的存储结构,Cache中的一块包含以下几个部分:
- 有效位:占1位,表示一个块是否在Cache中。比如当电脑开机时,Cache一定是空的,因此有效位是0;
- 标记位:英文为Tag,来源于直接映射、全相联映射、组相联映射剔除被隐含的块号或组号的部分,是一个块的“名字”;
- 脏位:也称一致性维护位、修改位等,用于表明这个块有没有被修改过,取决于Cache写命中时的处理策略,如果是全写法(当 CPU 对 Cache 写命中时,必须把数据同时写入 Cache 和主存。当某一块需要替换时,不必把这一块写回主存,用新调入的块直接覆盖即可),脏位为0位,如果是写回法(当 CPU 对 Cache 写命中时,只需改 Cache 的内容,而不立即写入主存,只有当此块被换出时才写回主存),每个 Cache 行必须设置一个1位的脏位,以反映此块是否被 CPU 修改过。
- 替换控制位:采用直接映射为0位,在采用全相联映射和组相联映射方式时,从主存向 Cache 传送一个新块,当 Cache 中的空间被占满时,就需要使用替换算法置换 Cache行,其中随机替换算法的替换控制位为0位,LRU的替换控制位为 log2路数 位。
- 数据:就是在主存中取到的一块中的数据;
用目标地址的标记位与Cache中行的标记位进行比对,如果命中,直接根据块内地址将这行中块内对应数据输出给数据通路;如果没有命中,则要访存,将主存中对应数据输出给数据通路。
在未命中的情况下,输出主存数据给数据通路后,还要将输出块的数据复制到Cache中,因为它可能是常用数据,要判断Cache中是否已满,如果未满,则可装进;如果满了,则要根据替换策略进行替换,将块的内容装进Cache。
写在后面
这个专栏主要是我在学习408真题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。希望能给大家的学习带来一点帮助,共同进步!!!
参考资料
[1]王道408教材(2025版)
[2]王道课程资料