Atri Website

Back

cache 标记信息位小结#

在计算 Cache 总容量时,需考虑 Cache 行的数据部分和每行的标记信息,即:

Cache 总容量 == (每行标记信息位数 ++ 每行数据位数)×\times Cache 总行数

每行的标记信息通常包括:有效位(valid bit)、标记位(Tag 字段)、脏位和 LRU 替换位。其中,有效位和标记位是所有 Cache 必须包含的;脏位(dirty bit)仅在采用回写策略时存在;LRU 替换位仅在使用 LRU 算法时存在,其位数取决于组内行数。下图展示了不同映射方式下 Cache 各字段的组成与分布。

  • 有效位:指明该 cache 行存储的数据是否有效(可用)
  • 标记位:即 Tag 字段,不论是哪种映射,都需要它指明 cache 行存储的是哪一个主存块。用于进行匹配(match)
    • 在直接映射下,Tag 字段位数 t=nbct = n-b-c,其中 nn 为主存地址空间位数,bb 为块内地址位数,cc 为缓存行数
    • 在组相联映射下,Tag 字段位数 m=nkqm = n-k-q,其中 nn 为主存地址空间位数,kk 为块内地址位数,qq 为 cache 的组数(cache 划分为多少个 cache 组)
  • LRU 位:也称计数值,只在使用 LRU 替换算法时存在。大小为 log2nlog_2n,其中 nn 为组相联的组内 cache 行数
  • 脏位:也称修改位(dirty bit),只在使用回写法时存在。当脏位 =1= 1,则该 cache 已被修改,替换时需要回写入主存;脏位 =0=0,替换时可直接替换,不需要回写

例题一#

一个 word 等于 4B4B,则主存块大小 BS=4×4B=24BBS=4 \times 4B = 2^4 B\Rightarrow 块内地址位数 b=4b=4 。则 t+c=324=28t + c = 32-4=28\Rightarrow c=28tc=28-t;Cache 里的数据总容量为 4K4 K=4×210×22B=214B= 4 \times 2^{10} \times 2^2 B = 2^{14} B,Cache 行数为 2c=228t2^{c} = 2^{28-t},则有等式:数据总容量 == Cache 行数 ×\times 主存块大小(Cache 行大小)

214 B=228t×24 B2^{14} \ B = 2^{28-t} \times 2^4 \ B

解得 t=18c=10t=18,c = 10。则单行 Cache 标记信息位大小等于 Tag 字段 + 有效位 + 脏位 = 18+1+1 bit18+1+1\ bit,单行数据容量等于 24×23 bit2^4 \times 2^3 \ bit,Cache 行数为 210=1 K2^{10}=1\ K,Cache 总容量 =(20+27)×1K=148K=(20+2^7)\times 1K=148K答案为 C

例题二#

(1):Cache 总容量等于(单行数据部分比特位 ++ 单行标记信息比特位) ×\times 缓存行数量。由题,主存块大小为 26B2^6 B,则 b=6b=6;缓存行数为 232^3,则 c=3c=3;主存大小 228 B2^{28}\ B,则 n=28n=28;因此 Tag 字段位长 t=2863=19t=28-6-3=19即每行 cache 一共有 19 bit 的 Tag 字段。因此单行标记信息比特位大小为:Tag 字段 ++ 有效位(1 bit)== 2020 bit。数据部分比特位大小为:26×23 bit2^{6}\times 2^3\ bit ,即 512512 bit。

因此 cache 总容量 =(20 b + 512 b)×8=4256= (20\ b\ +\ 512\ b)\times 8 = 4256 bit

(2)注意,题目问的是:在主存地址空间里的地址为 3200 的数据单元,所在的主存块应存储在哪一个 cache 行里。如果问的是第 3200 个主存块存于哪个 cache 行,答案就不一样了。

一般问及主存地址,往往暗含着指的是数据单元的地址,不是主存块的地址。因为主存块地址叫做 “主存块编号”,没有“地址”这个称谓。

“地址”(主存物理地址):指的是具体的数据单元的地址,即主存里的每一个字节的住户“门牌号”

“编号”(主存块号):指的是主存块的编号(没有“主存块地址”这个术语),即主存里的“楼栋号”,一栋楼有多个住户。

  1. 先找出主存地址 3200 的数据单元在哪个主存块,题目按字节编址,因此主存块号 =3200/64=50=3200/64=50
  2. 由直接映射,得到 cache 行号:50 Mod 8=250\ Mod\ 8=2因此映射到 cache 的行号是 2

如果按照 2 路相联映射:可知 s=1q=2s=1,q=2,前文已知包含主存地址为 3200 的数据单元的主存块编号为 50,因此有 50 Mod 22=250\ Mod\ 2^2 = 2,此时主存块 50 应映射到组号为 2 的缓存组里,行号为 4 或 5。

(3):该访存地址为:0000 0001 0010 0011 0100 0101 0110t=19c=3b=6t=19,c=3,b=6,因此访存地址划分为:

0000 0001 0010 0011 010 为 Tag 字段,0 01 为 cache 行号,01 0110 为块内地址。访存过程如下:

  1. 根据 001 行号定位到 cache 2
  2. 根据访存地址的 Tag 字段 0000 0001 0010 0011 010 与 cache 2 里存储的主存块的 Tag 字段进行匹配;
    • 如果完全相等且有效位为 1,则缓存命中,将块内地址为 01 0110 的存储单元里的数据送入 CPU
    • 如果不等或这有效位为 0,则缓存缺失
  3. 缓存缺失下,访问主存目标数据单元 0123456 H,将目标主存地址的数据送入 CPU,同时把该数据单元所在的主存块调入缓存

例题三#

比较上题的命题:

这两题问的都是具体的主存地址,即包含了目标数据单元的主存块映射到哪一个 cache 组,关键点就是“按字节编址,且标识为单元”,指明了这是主存地址,不是 “主存块号”,老头最爱在这设坑。

此处可得一个术语:主存单元,其指的是主存数据单元,估计是缩写。

由题,计算主存 129 单元在哪个主存块:129/32=41129/32= 4 ··· 1,因此在主存块 4(第五个主存块)。Cache 可分为 8 组,由级相联规则,主存块 4 映射到 cache 组 4。所以 Cache 组号为 4

另一解法:由题,s=1s=116/2=8=2316/2=8=2^3,因此 q=3q=3b=5b=5。主存 129 号单元的二进制主存地址为 0···0 1000 0001(129 不断模 2 ),块内地址为 0 0001所以组号为 100,即组号为 4

计组:cache 标记信息位小结
Author Juyao Huang
Published at June 16, 2026
Comment seems to stuck. Try to refresh?✨