- Cache使用地址判断是否命中,地址使用的是物理地址还是虚拟地址呢?
1. VIVT(Virtually Indexed Virtually Tagged)
- 虚拟高速缓存:以虚拟地址作为查找对象。
- 首先虚拟地址给cache,如果命中,则返回数据给cpu,如果未命中,则将虚拟地址通过MMU转化为物理地址,根据物理地址从主存中读取数据。
- 优点
- 不需要在查找cache过程将虚拟地址翻译成物理地址,节省了MMU转换的时间,提高访问cache的访问速度。
- 缺点
- 引入软件使用上的问题,歧义(ambiguity)和别名(alias)。
2. 歧义
- 歧义是指数据在cache中有相同的tag和index。
- 发生情况:不同进程,相同的虚拟地址映射不同的物理地址。
- 可能出现A进程地址a映射的数据为b,而B进程地址a映射的数据为c,当A进程运行时,访问地址a会将数据b加载到cache上,而进程B运行时,访问地址a时命中了并将数据b返回给CPU,但是实际上B进程应该把数据c给CPU。
- 解决方法:切换进程,flush cache,主要有两种。
- 使主存储器有效:首先将主存置为有效,将cacheline上已经修改的数据写回主存上,避免修改的数据丢失。
- 使高速缓存无效:首先将cacheline都置为无效,保证切换时不会有进程误命中上一进程的数据。
- 所以对于VIVT来说,每次进程切换时,都可能出现大量的cache缺失,且只要切换进程就需要flush cache,导致性能的缺失。
3. 别名
- 发生情况:不同虚拟地址映射到相同物理地址。
- 可能出现物理地址A对应的虚拟地址为B和C,index值B<C,那么当程序想要修改物理地址A对应的数据时,采用写回策略,对B进行修改,且修改的值没有同步到主存中,当程序想要访问虚拟地址C时,命中,但是取出的数据是未修改的。
- 解决方法
- (1)采用nocache映射,不通过cache映射,CPU直接去主存读写数据。既适用于不同进程共享数据也适用于相同进程共享数据。
- (2)不同进程共享数据,可以选择在进程切换时,flush cache,(主要因为存在一个向主存写数据的过程)。
- (3)同一进程共享数据,
4. PIPT(Physically Indexed Physically Tagged)
- 物理高速缓存:为了解决VIVT歧义和别名的问题,tag和index都取自物理地址,对于物理地址来说tag和index都是唯一的。
- 实现过程
- CPU发出的虚拟地址首先经过MMU转化为物理地址,给到cache控制器观察是否命中。如果未命中,将去主存中根据物理地址取出数据。
- 缺点
- 硬件设计较VIVT要复杂很多,需要等待MMU转换之后才可以查cache。
- 为了加快MMU转换速度,硬件上也会加一块TLB,虚拟地址和物理地址转换可以这篇博客。
- 很多CPU都使用PIPT高速缓存。
5. VIPT(Virtually Indexed Physically Tagged)
- 物理标记的虚拟高速缓存: