组相联映像方式结合了直接映像和全相联映像的优点,通过将Cache和主存划分为“组-块”结构,在保证一定映射规则的同时提升了灵活性。具体而言,主存中的某一块只能映射到Cache中特定组内的任意位置,实现了组间直接映像、组内全相联映像的策略。例如,当Cache有16块、每2块为一组时,共分为8组;主存每个区也划分为8组,主存某区第i组的任意块只能加载到Cache的第i组中。
在Cache空间不足需要替换块时,常用的替换算法包括:
- 随机替换:随机选择组内一个块进行替换,实现简单但命中率不稳定;
- 先进先出(FIFO):按进入时间顺序替换最早载入的块,容易实现但未考虑使用频率;
- 近期最少使用(LRU):追踪访问历史,替换最久未被访问的块,命中率较高,是常用优化方案;
- 优化替换:基于程序运行前的统计信息进行预判,适用于可重复执行的循环程序,具有前瞻性但开销大。
Cache性能的核心评价指标是平均访问时间 $ t_a $,其计算公式为:
ta=Hc⋅tc+(1−Hc)⋅tm
t_a = H_c \cdot t_c + (1 - H_c) \cdot t_m
ta=Hc⋅tc+(1−Hc)⋅tm
其中 $ H_c $ 为Cache命中率,$ t_c $ 为Cache访问时间,$ t_m $ 为主存访问时间。提高命中率 $ H_c $ 或降低失效率能显著减少平均访问时间,从而提升系统整体性能。此外,Cache失效会打断指令流水线,导致停顿,因此减少失效次数是优化处理器效率的重要方向。
在组相联映像的Cache中,主存地址被划分为三个部分:标记位(Tag)、组索引位(Index) 和 块内偏移位(Offset)。这种划分方式用于定位数据在Cache中的具体位置,其原理如下:
1. 地址结构划分依据
假设:
- 主存和Cache以“块”为单位传输数据;
- 每个块大小为 $ B $ 字节,则需要 $ \log_2 B $ 位作为 块内偏移位(Offset),用于确定块内具体字节;
- Cache共有 $ S $ 组(由总块数除以每组的块数得出),则需 $ \log_2 S $ 位作为 组索引位(Index),用于选择对应的组;
- 剩余高位部分作为 标记位(Tag),用于区分映射到同一组的不同主存块。
2. 具体步骤与示例
示例参数:
- Cache总大小:16 KB
- 块大小:64 字节 → 每块有64字节
- 组相联度:2路组相联(即每组包含2块)
计算:
- 总块数 = $ 16\text{KB} / 64\text{B} = 256 $ 块
- 每组2块 ⇒ 组数 = $ 256 / 2 = 128 $ 组 ⇒ 需要 $ \log_2 128 = 7 $ 位作为 组索引(Index)
- 块大小64B ⇒ 块内偏移 = $ \log_2 64 = 6 $ 位 ⇒ Offset = 6位
- 若系统为32位地址,则剩余位数为标记位:
- Tag = 32 - 7(Index) - 6(Offset) = 19 位
因此,地址格式为:
| Tag (19位) | Index (7位) | Offset (6位) |
|---|
3. 工作过程
- CPU发出一个内存地址;
- 使用 Index 位 找到对应Cache组;
- 在该组的所有块中,比较各块的 Tag 是否与地址中的Tag匹配,且有效位为1;
- 若匹配 ⇒ Cache命中,使用Offset从块中取出数据;
- 不匹配 ⇒ Cache失效,需从主存加载对应块到该组中的某个空闲或替换位置;
- 替换时遵循LRU、FIFO等算法,在组内进行。
注意事项
- 直接映像 可看作 1路组相联,每组只有1块;
- 全相联 则相当于只有1组,无需Index位,整个地址除Offset外都是Tag;
- 标记位越多,能区分的主存区域越广,但存储开销也越大;
- 合理设计这三部分可平衡硬件成本与命中率。


1万+

被折叠的 条评论
为什么被折叠?



