缓存地址映射如何工作?直接映射下同标签同组地址命中行为疑问
直接映射缓存中同Tag同Set地址的命中逻辑解析
嘿,我来帮你拆解这个问题,先从你给出的具体参数和地址入手:
首先,咱们先把两个地址按你设定的12位地址格式(5位Tag、2位Set、5位偏移量)拆解开:
- 地址
0x070(二进制0000 0111 0000):- Tag(前5位):
00000(十进制0) - Set(中间2位):
11(十进制3) - 偏移量(最后5位):
10000(十进制16)
- Tag(前5位):
- 地址
0x068(二进制0000 0110 1000):- Tag(前5位):
00000(十进制0) - Set(中间2位):
11(十进制3) - 偏移量(最后5位):
01000(十进制8)
- Tag(前5位):
接下来回到你的核心疑问:在直接映射缓存里,当两个地址的Tag和Set都匹配时会发生什么?
先回忆下直接映射缓存的核心规则:每个Set(组)里只有1个缓存块。Set号的作用就是直接定位到缓存里的某个块位置,而Tag是用来确认这个块里存的是不是我们要的数据。
那这两个地址Tag和Set都相同,说明啥?它们属于同一个缓存块——偏移量不同,只是块内的不同字节位置而已。
举个实际流程的例子:
假设我们先访问0x068,CPU会根据Set号3找到对应的缓存块位置,发现这个位置是空的(或者存的是别的Tag),就会从内存把包含0x068的整个缓存块加载进来,同时把Tag(0)标记在这个块上。
之后再访问0x070时,CPU同样定位到Set3的缓存块,对比Tag发现和当前地址的Tag完全一致(命中!),然后直接根据偏移量16从这个已经在缓存里的块中读取对应字节,根本不需要去内存加载新的块。
哦对了,这里提个小细节:你说块大小是16字节,但16字节只需要4位偏移量(覆盖0-15),你给出的5位偏移量对应的是32字节的块大小,可能是个小疏漏,但完全不影响咱们理解核心逻辑~
总结一下:这种情况根本不会出现缓存冲突,反而说明两个地址在同一个缓存块里,只要这个块已经被加载到缓存中,两个地址都会直接命中,读取块内对应偏移的字节就行。
内容的提问来源于stack exchange,提问作者Sara W
相关产品推荐
相关产品推荐

