Cache
SRAM
- 无需刷新: 持续供电即可保持稳态; 掉电数据丢失: 无持久性.
- 存储密度低: DRAM 使用 1 个晶体管, SRAM 使用 6 个晶体管.
Cache
- 目的: 根据程序局部性, 加快程序执行.
- 包含信息:
- 地址.
- 数据.
- Valid 位.
- 设计原则:
- 内存物理地址到 Cache 地址的地址映射关系.
- Cache 使用虚拟地址 or 物理地址.
- CPU 提供虚拟地址, Cache 虚拟地址无需让 MMU 进行 Page Table Walker, 加速查询.
- 两个 Cache 虚拟地址对应同一物理地址, 一致性有误.
- 一个 Cache 虚拟地址对应两个物理地址, Cache 只能保存一项.
- 薛定谔的地址?
- 控制位.
- 数据粒度.
Cache Line:
- 大小至少 4Byte, 使用一个 Valid 位控制.
- 若 Cache Line 过大, 可针对每 4Byte 或 8Byte 再设 Valid 位.
不允许 Cache 的内存地址: MMIO 外设, 如串口寄存器, 读写慢. 需要将内存地址分类为 Cached/Uncached.
- Cache 分类:
- L1 Cache: 多核 private, 分 Icache 与 Dcache.
- L2 Cache: 多核 private.
- L3 Cache: 多核 public.
内存物理地址到 Cache 地址的映射关系:
- 地址只允许被映射到一个位置.
- 地址允许被映射到多个位置.
全相联映射: 任何地址允许被映射到任何 Cache 的任何位置.
- Cache Line 大小为 4Byte: 地址前 30 位为 CT, 后 2 位为 CO.
条件:
- Valid 位为 1.
- CT 相同.
利用率高; 1024 路比较电路成本大, 硬件复杂, 延迟增加.
- 需要缓存替换算法.
直接映射: 主存按 Cache 大小分块, 地址对应映射.
- Cache 大小为 4KB: 地址前 20 位为 CT, 中 10 位为 CI, 后 2 位为 CO.
条件:
- CI 索引 Cache Line 位置.
- Valid 位为 1.
- CT 相同.
单路比较电路, 硬件简单; 利用率低.
- 无需缓存替换算法.
组相联映射: 结合全相联映射与直接映射, 相当于多路直接映射.
- Cache 写策略:
- Write back (绝大多数):
- 写分配:
- 先替换, 替换时 Dirty 写回主存, 替换后再写 Cache.
- 程序 load/store 仅对 Cache 进行, 程序视角满足一致性.
- 写分配:
- Write through (MMIO 内存 or 多核 CPU 的 TLB 更新):
- 写分配:
- 先替换, 替换后先写 Cache, 再写主存.
- 非写分配:
- 直接写主存.
- 写分配:
- Write back (绝大多数):
Cache 缺失:
- 必然缺失: 进程切换/首次访问.
- 容量缺失: 全相联映射.
- 冲突缺失: 直接映射/组相联映射.
- 无效缺失: 其他进程修改.
Cache 替换策略:
- RAND.
- FIFO.
- LRU.