Cache与一致性

前言

对于CacheCache一致性内存一致性内存屏障原子操作等话题,涉及到很多处理器体系结构的细节,比较难懂。本文不会系统的分析这些问题,一是水平有限,二是工作量太大,三是目前已经有相关的高质量书籍和网络资料。所以本文着力收集一些相关话题的高质量的资料,并分享出来。同时,在浏览相关资料时,对于部分知识点会做一些摘记。

1 相关书籍分享

perfbook,经典书籍,无需多说。这本书全名为Is Parallel Programming Hard, And, If So, What Can You Do About It?,中文译本为深入理解并行编程,如果英文阅读有困难,可以参照中译本看。

2 高质量的网络资料分享

2.1 一个高质量的知乎专栏

高速缓存与一致性专栏索引。该专栏的系列文章对Cache及相关话题的讲解和分析非常好,并配有大量的图示,强烈推荐!

3 知识点摘记

3.1 VIPT Cache的歧义和别名问题

3.1.1 VIPT Cache不存在歧义

不妨设32位地址线,物理页的大小为4KB,则将Tag选为物理地址的bit[31:12]。现在进程1进程2虚拟地址A分别映射到不同的物理地址(说明虚拟地址A所在的虚拟页分别映射到不同的物理页):
Cache与一致性

3.1.2 VIPT Cache的别名问题与解决方案

不妨设物理页为4KB,Cache采用多路组相联的结构。

对于VIPT Cache,并不是总存在别名问题,先说不存在别名问题的情况:一路缓存的大小不超过物理页的大小。因为此时index必然位于bit[11:0],这部分的物理地址和虚拟地址是相等的,即VI==PI,进而VIPT==PIPT,因此这种情况不存在别名问题。

那么,为什么一路缓存的大小超过物理页大小就会引发别名问题呢?我们用一个具体的例子来说明:不妨设一路缓存8KB,共512组,即每个cache line16字节。如下图所示:
Cache与一致性
现在,有虚拟地址A虚拟地址B,它们映射向相同的物理内存,也就是说A和B所在的虚拟页映射向同一个物理页。由于物理地址相同,因此Tag是相同的。此时是否会产生别名问题,关键看index,更确切的说,关键看index的最高位,即虚拟地址的bit12,具体用下图说明:
Cache与一致性
现在,别名问题的产生搞清楚了。接下来就说一说如果采用VIPT Cache,且一路缓存的大小超过物理页的大小时,如何避免别名。其实从上图就可以知道,这种情况不一定会产生别名,没有别名的两种情况很容易让人联想到一个词:对齐。没错了,解决方案就是分配地址时,返回的虚拟地址按照一路内存的大小对齐,对于本例来说就是按照8KB对齐。此时,虚拟地址A虚拟地址Bindex是相等的,又因为映射到相同的物理地址,所以Tag也是相等的,当然也就没有别名问题了。

参考文献

参考文献即为上文中提到的书籍和网络资料。