虚拟缓存和物理缓存
虚拟缓存使用虚拟地址寻址
物理缓存使用TLB转换,然后再寻址。
VIVT架构cache
VIVT (Virtual Index Virtual Tag) 是一种缓存架构设计,其特点是同时使用虚拟地址的索引和标记部分进行缓存操作。
VIVT架构的工作原理
- CPU发出虚拟地址后,该地址 直接 送到缓存控制器
- 缓存控制器使用虚拟地址的索引和标记部分查找缓存
- 如果命中(cache hit),则直接从缓存返回数据,无需地址转换
- 如果未命中,则将虚拟地址发送到内存管理单元(MMU),转换为物理地址,然后从主存中读取数据
VIVT架构的优点
- 访问速度快:命中时无需地址转换,减少了访问延迟
- 设计简单:实现相对简单直接
- 不需要TLB查询:缓存命中时不需要访问TLB
VIVT架构的缺点
歧义问题(Ambiguity/Homonym)
- 不同进程中相同的虚拟地址可能映射到不同的物理地址
- 解决方案:使用进程标记符(PID)增大缓存地址标记的宽度,或在上下文切换时刷新缓存
别名问题(Aliasing/Synonym)
- 不同的虚拟地址可能映射到相同的物理地址
- 这会导致缓存中存在多个相同数据的副本,造成数据一致性问题
由于这些缺点,现代处理器通常采用PIPT或VIPT架构来设计缓存系统,以规避VIVT架构的问题。
虚拟地址直接送到cache控制器,如果cache hit,直接从cache返回数据,否则就把虚拟地址发往MMU,转为物理地址,根据物理地址从主存读数据
PIPT架构cache
PIPT (Physical Index Physical Tag) 是一种缓存架构设计,同时使用物理地址的索引和标记部分进行缓存操作。
PIPT架构的工作原理
- CPU发出的虚拟地址经过MMU转换成物理地址
- 物理地址发往cache控制器查找确认是否命中
- 如果命中,则从缓存返回数据
- 如果未命中,则从主存中读取数据并更新缓存
PIPT架构的优势
- 物理地址是唯一的:不会产生歧义和别名两个问题
- 一致性管理简单:因为缓存行与物理地址直接对应
- 多核处理器友好:简化了多核系统中的缓存一致性协议
PIPT架构的缺点
- 访问延迟增加:不管是否cache命中,都会经过TLB转换地址
- 流水线加深:TLB查询成为关键路径的一部分
- 分支预测惩罚增大:延迟可能影响分支预测性能
- load指令延迟增加:影响整体系统性能
VIPT架构cache
VIPT (Virtual Index Physical Tag) 是一种混合缓存架构设计,结合了虚拟索引和物理标记的优点。
VIPT架构的工作原理
- 使用虚拟地址的索引位查找cache(不需等待地址转换)
- 同时将虚拟地址发送到MMU转换成物理地址
- 当MMU转换完成,同时cache控制器也查找完成
- 比较cache line对应的物理tag和转换后物理地址的tag域,判断是否命中
VIPT架构的优势
- 并行操作:地址转换与缓存查找同时进行,减少延迟
- 物理tag唯一:避免了VIVT架构中的歧义问题
- 速度接近VIVT:在命中情况下性能接近VIVT
- 一致性管理简化:相比VIVT架构更容易维护缓存一致性
VIPT架构的限制
- 直接映射缓存大小限制:直接缓存映射不能大于页面大小,否则会出现别名问题
- 相联度要求:为支持更大的缓存需要增加相联度
- 硬件复杂度增加:比VIVT略复杂,需要精心设计
- 仍可能存在别名问题:在某些特定情况下需要额外处理
VIPT中的别名问题解决方案
- 限制缓存大小:确保每个缓存索引集的大小不超过页面大小
- 增加相联度:通过提高缓存的相联度来支持更大的缓存
- 使用页着色(Page Coloring):操作系统可以通过页着色技术避免别名问题
- 硬件别名检测:某些处理器实现了硬件机制来检测和处理潜在的别名
