Cache中地址查找问题

247 阅读2分钟

背景简介

cache查找缓存中的数据,过程如下,通过地址中的set_index在组相联的cache每一路中进行并行查找,每路中cache分为tag区和data区,set_index索引到的tag后,内容和地址(这里先不区分物理地址的tag还是虚拟地址的tag)中的tag进行比较,如果tag匹配,并且这条查找到的block是valid(图中未画出valid bit位),则cache命中,从cache中读出数据,否则需要去下一级cache进行查找。那么查找过程,用的是虚拟地址,还是物理地址,还是虚拟和物理地址的结合?

image.png Cache查找缓存内数据的方式有3种:

VIVT

此方法全称为virtual index virtual tag,所以直接使用虚拟地址进行查找。 image.png 优点:无需经过MMU,查找速度快

缺点:会有重名(Homonyms)和别名(aliasing)的问题。

重名问题

“重的是虚拟地址的名”,也就是说同一个虚拟地址会对应不同的物理地址。影响就是利用虚拟地址查数据,可能查到的不是期望的物理地址的数据,如OS中不同的线程,同一块虚拟地址的情况。解决方法就是线程切换时需要invalid掉所有数据,有一定代价

别名问题

“别的时虚拟地址的名”,不同的虚拟地址可能对应同一个物理地址。也就是同一个物理地址,可能因为不同的虚拟地址,放入cache中2份。这样修改一个的值时,另外一个就没有同步修改。会产生资源浪费和内容不同步问题。

那么VIVT什么时候会引入别名问题? 1)cache为组相连或全相连映射,也就是cache的set num > 1,这种情况下不同vtag的虚拟地址(对应同一物理地址的话),一旦放入不同的set(只需set_index不同)。 2)cache同一set内的容量大小大于1个页面大小,此时不同offset的虚拟地址就有对应同一物理地址的可能了,并且cache同一set查找中,用的就是offset

PIPT

physical index physical tag

image.png 优点:没有重名和别名的问题

缺点:查找必须经过MMU翻译之后才能开始,延迟大

VIPT

virtual index physical tag,使用虚拟地址index索引,同时MMU翻译物理地址得到物理tag,之后物理tag比对。

image.png

优点:相比PIPT快,并且相比VIVT,不同set间同一路不会出现别名问题

缺点:set内容量大于一个页面大小,同一set内仍会有别名问题

也就是说,想要增加cache容量,在set内容量大小满足一定程度后,只能增加相联度了?TO BE CONTINUE....