You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

2路组相联缓存命中与未命中判断方法技术咨询

2路组相联缓存命中/未命中判断逻辑详解

我来给你把这个逻辑掰得明明白白,结合你给出的参数一步步拆解,保证你看完就懂!

先明确已知参数

先把给定的条件列出来,方便后续分析:

  • 缓存类型:2路组相联(每个缓存组里包含2个独立的缓存块)
  • 缓存组数:4个
  • 主存块数:2K = 2048块
  • 每块字数:8字

先回顾地址格式(帮你衔接判断逻辑)

你已经掌握了地址格式,这里再快速梳理一遍,方便对应到判断步骤:
主存地址被拆成3个字段:

  1. 块内偏移(Offset):每块8字,8=2³,所以占3位——用来定位块内的具体某个字。
  2. 组索引(Set Index):缓存有4个组,4=2²,所以占2位——用来确定主存块要映射到缓存的哪一组。
  3. 标记(Tag):主存总字数=2048块×8字=16384=2¹⁴,所以主存地址共14位。标记位=14-2-3=9位——用来区分映射到同一组的不同主存块。

核心:命中/未命中的判断步骤

判断逻辑其实就是「找组→查标记+有效位」的两步走:

步骤1:定位目标缓存组

用主存地址里的组索引字段,找到对应的缓存组。比如组索引是二进制10,那就定位到缓存的第2组(注意是从0开始计数)。

步骤2:检查组内缓存块的标记和有效位

因为是2路组相联,每个组里有2个缓存块,我们需要逐个检查这两个块:

  • 命中的条件:两个块中,至少有一个块的标记位和主存地址的标记字段完全相同,并且这个块的有效位(Valid Bit)为1(有效位是硬件里的一个标志,用来标记这个缓存块里的数据是有效的、可用的)。满足这两个条件,就说明要访问的数据已经在缓存里了——直接用块内偏移去这个缓存块里取数据就行。
  • 未命中的情况:
    1. 两个缓存块的标记位都和主存标记不匹配;
    2. 有一个块的标记匹配,但有效位是0(说明这个块的数据是无效的,比如刚开机时缓存是空的,或者这个块已经被淘汰过);
      出现以上任意一种情况,都属于未命中,这时候需要把主存里对应的块加载到这个缓存组里(如果组里有空位就放空位,没有空位就用替换算法,比如LRU最近最少使用算法,换掉组里最久没用到的块)。

举个具体例子更直观

假设主存地址是二进制:1010101010 01 101(对应9位标记、2位组索引、3位偏移):

  1. 组索引是01,定位到缓存的第1组;
  2. 检查第1组的两个缓存块:
    • 缓存块1的标记是1010101010,有效位是1 → 标记匹配+有效位有效,命中;
    • 如果两个块的标记分别是0011001100和1100110011,不管有效位是啥,都和主存标记不匹配 → 未命中;
    • 如果有一个块标记匹配,但有效位是0 → 这个块的数据无效,也算未命中,需要重新从主存加载对应块。

补充:有效位的作用

很多初学者容易忽略这个点:有效位是用来标记缓存块的有效性的。比如刚启动系统时,所有缓存块的有效位都是0,这时候第一次访问任何主存块都会未命中,加载完成后才会把对应缓存块的有效位设为1。如果缓存块被替换掉,旧块的有效位也会被清0。

内容的提问来源于stack exchange,提问作者Mithu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:36:40