2路组相联缓存命中与未命中判断方法技术咨询
2路组相联缓存命中/未命中判断逻辑详解
我来给你把这个逻辑掰得明明白白,结合你给出的参数一步步拆解,保证你看完就懂!
先明确已知参数
先把给定的条件列出来,方便后续分析:
- 缓存类型:2路组相联(每个缓存组里包含2个独立的缓存块)
- 缓存组数:4个
- 主存块数:2K = 2048块
- 每块字数:8字
先回顾地址格式(帮你衔接判断逻辑)
你已经掌握了地址格式,这里再快速梳理一遍,方便对应到判断步骤:
主存地址被拆成3个字段:
- 块内偏移(Offset):每块8字,8=2³,所以占3位——用来定位块内的具体某个字。
- 组索引(Set Index):缓存有4个组,4=2²,所以占2位——用来确定主存块要映射到缓存的哪一组。
- 标记(Tag):主存总字数=2048块×8字=16384=2¹⁴,所以主存地址共14位。标记位=14-2-3=9位——用来区分映射到同一组的不同主存块。
核心:命中/未命中的判断步骤
判断逻辑其实就是「找组→查标记+有效位」的两步走:
步骤1:定位目标缓存组
用主存地址里的组索引字段,找到对应的缓存组。比如组索引是二进制10,那就定位到缓存的第2组(注意是从0开始计数)。
步骤2:检查组内缓存块的标记和有效位
因为是2路组相联,每个组里有2个缓存块,我们需要逐个检查这两个块:
- 命中的条件:两个块中,至少有一个块的标记位和主存地址的标记字段完全相同,并且这个块的有效位(Valid Bit)为1(有效位是硬件里的一个标志,用来标记这个缓存块里的数据是有效的、可用的)。满足这两个条件,就说明要访问的数据已经在缓存里了——直接用块内偏移去这个缓存块里取数据就行。
- 未命中的情况:
- 两个缓存块的标记位都和主存标记不匹配;
- 有一个块的标记匹配,但有效位是0(说明这个块的数据是无效的,比如刚开机时缓存是空的,或者这个块已经被淘汰过);
出现以上任意一种情况,都属于未命中,这时候需要把主存里对应的块加载到这个缓存组里(如果组里有空位就放空位,没有空位就用替换算法,比如LRU最近最少使用算法,换掉组里最久没用到的块)。
举个具体例子更直观
假设主存地址是二进制:1010101010 01 101(对应9位标记、2位组索引、3位偏移):
- 组索引是
01,定位到缓存的第1组; - 检查第1组的两个缓存块:
- 缓存块1的标记是
1010101010,有效位是1 → 标记匹配+有效位有效,命中; - 如果两个块的标记分别是
0011001100和1100110011,不管有效位是啥,都和主存标记不匹配 → 未命中; - 如果有一个块标记匹配,但有效位是0 → 这个块的数据无效,也算未命中,需要重新从主存加载对应块。
- 缓存块1的标记是
补充:有效位的作用
很多初学者容易忽略这个点:有效位是用来标记缓存块的有效性的。比如刚启动系统时,所有缓存块的有效位都是0,这时候第一次访问任何主存块都会未命中,加载完成后才会把对应缓存块的有效位设为1。如果缓存块被替换掉,旧块的有效位也会被清0。
内容的提问来源于stack exchange,提问作者Mithu
相关产品推荐
相关产品推荐

