Cache与一致性

目录

  • 前言
  • 1 相关书籍分享
  • 2 高质量的网络资料分享
    • 2.1 一个高质量的知乎专栏
  • 3 知识点摘记
    • 3.1 VIPT Cache的歧义和别名问题
      • 3.1.1 VIPT Cache不存在歧义
      • 3.1.2 VIPT Cache的别名问题与解决方案
    • 3.2 编译屏障和内存屏障
  • 参考文献

前言

对于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与一致性_第1张图片

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

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

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

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

3.2 编译屏障和内存屏障

之前我写过一篇关于编译屏障和内存屏障的博客:浅析c程序中的屏障。由于当时对这个话题的认识比较浅薄,因此博客的内容也比较简陋,特别是内存屏障部分。与内存屏障关系密切的话题是内存一致性模型,内存一致性模型有多种,它们向软件开发者描述了硬件到底有着怎样的乱序行为,可以指导软件开发者正确的使用诸多屏障指令。有关内存一致性模型,这里分享一些比较好的博客:

  • 内存一致性模型
  • 内存一致性模型-TSO
  • 内存一致性模型-PSO

同时,也分享一些关于编译乱序编译屏障的博客:

  • 编译乱序(Compiler Reordering)

参考文献

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

你可能感兴趣的:(体系结构,硬件相关)