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所在的虚拟页分别映射到不同的物理页):
在这里插入图片描述

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

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

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

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

3.2 编译屏障和内存屏障

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

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

参考文献

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值