笨叔:ARM64体系结构与编程之cache必修课(下)

第三季视频课程ARM64体系结构与编程之cache基础知识(下)

重点教你如何看MESI状态图。看懂MESI协议状态图对我们实际工作有什么影响?

奔跑吧第二版卷1真快来了

自从2019年3月Linus宣布Linux 5.0正式发布那天开始,笨叔就致力于把蓝色奔跑吧Linux内核这本书重新更新到Linux 5.0。大家也许无法想象更新一本快1000页的书,要付出多少精力。这是一次全面和全新的修订,90%的内容和第一版不一样,90%的内容重新编写和编排,各中的汗水只有笨叔自己知道。和Linux相关的工程师,不要吝啬你的钱包,可以买一本看看,最新Linux 5.x内核全新、全面、深刻的解读。预计2020年双十二出版!

想提前看奔跑吧第二版目录的,可以点这里。奔2修订版 目录!爱在深秋!
第二版的奔跑吧有如下新特性:

  1. 基于Linux 5.0 + ARM64/x86_64架构

  2. 新增很多项目案例分析

  3. 新增死机宕机案例分析 - crash+kdump实战分析

  4. 新增ARM64体系架构介绍

  5. 新增很多插图和流程图

  6. 不再大段粘贴代码(之前有人抱怨,粘贴代码太多)

  7. 新增芯片安全漏洞分析

  8. 新增很多面试必考题,新版本的奔跑卷,面试前必看!

  9. 总结攻城狮常见的疑惑和陷阱

  10. 提供基于O0编译的Linux 5.0实验平台,理论+动手实践

    图片

    这也许不是最终版本的封面,不过奔2真的快来了

    奔跑吧第二版比本cache系列文章更精彩,更有趣!不信?你到时候买一本试试。^_^

为什么系统软件人员要深入了解cache?

在一个系统中,cache无处不在,对于一个系统编程人员来说,你无法躲藏。下图是一个经典的ARM64系统的架构图,由Corte-A72和Cortex-53组成了大小核架构,每个CPU核心都有L1 cache,每个cluster里共享一个L2 cache,另外还有Mali GPU和DMA外设。

对于系统软件人员,下面几个常常疑惑的问题:

  1. cache的内部组织架构是怎么样的?能否画出一个cache的layout图?什么是set,way?

  2. 直接映射,全关联和组相联之间有什么区别?优缺点是啥?

  3. 重名问题是怎么发生的?

  4. 同名问题是怎么发生的?

  5. VIPT会不会发生重名问题?

  6. 什么是inner shareability 和outer shareability?怎么区分?

  7. 什么是PoU?什么是PoC?

  8. 什么是cache一致性?业界解决cache一致性都有哪些方法?

  9. MESI状态转换图,我看不懂。

  10. 什么cache伪共享?怎么发生的,如何避免?

  11. DMA和cache为啥会有cache一致性问题?

  12. 网卡通过DMA收数据和发数据,应该怎么操作cache?

  13. 对于self-modifying code,怎么保证data cache和指令cache的一致性问题?

所以,Cache这个玩意,对我们系统编程人员来说,非常重要。Cache没有理解好,或者没有完全搞透了,对系统编程影响很大,有时候我们在编程的时候,一行代码小小的改动可能会影响整个系统的性能,所以,我是建议系统程序员有必要把cache这玩意好好系统的学一学。

笨系列文章主要源自第三季《arm64体系结构与编程》视频课程,大概会有上下两篇:

上篇:介绍cache相关的背景知识。笨叔:ARM64体系结构与编程之cache必修课(上)

中篇:主要介绍ARM特有的inner share和outer share的概念,以及神马是PoU和PoC,还有cache指令的格式。笨叔:ARM64体系结构与编程之cache必修课(中)

下篇:主要介绍MESI协议,怎么去看MESI协议状态图,DMA和cache之间的cache一致性问题,self-modifying code导致的I-cache和D-cache的一致性问题,cache伪共享等问题。

cache一致性协议

其实我们前面的文章已经讲过了,cache一致性产生的原因是因为:同一个内存数据在多个CPU核心的L1 cache中存在多个不同的副本,导致数据不一致。例如下面这个图,数据A在三个地方都同时存在数据的副本:内存,core0的cache,core1的cache里,那么这个系统有4个观察者(arm手册很喜欢用这个词,observer):Core0,Core1,DMA,GPU,那么他们4个观察内存A的数据,会是一致吗?有没有可能产生不一致的情况呢?这个就是cache一致性的问题:比如核与核之间的cache一致性,DMA和cache之间的一致性问题等。

图片

那怎么去做呢,怎么去保证多个cpu核心的cache一致呢?
其实维护cache一致性的关键是跟踪每一个cache line的状态,并根据cpu的读写操作和总线上相应的传输内容来更新所有CPU上的cache line的状态,这样就能保证cache一致性了。维护cache一致性有软件和硬件两种方式。不过现在大多数处理器架构采用硬件方式来维护它。在处理器中通过cache一致性协议来实现,这些协议维护一个状态机,根据存储器读写的指令或总线上的传输内容,进行状态迁移和相应的cache操作来维护cache一致性,这个是不需要软件介入的。

cache一致性协议主要有两大类别:一类是监听协议(snooping protocol),每个cache都要被监听或者监听其他cache的总线活动;另一类是目录协议(directory protocol),用于全局统一管理cache状态。

1983年,James Goodman提出Write-Once总线监听协议,后来演变成目前很流行的MESI协议。Write-Once总线监听协议依赖于这样的事实,即所有的总线传输事务对于处理器系统内的其他单元是可见的。总线是一个基于广播通信的介质,所以呢,可以由每个CPU的cache来进行监听。在最近十几年,大家提出了数十种协议,这些协议基本上都是Write-Once总线监听协议的变种。不同的协议需要不同的通信量,通信量要求太多的 会浪费总线带宽,因为它使总线争用情况变多,留给其他部件使用的带宽减少。所以,做芯片设计工程师需要在性能和带宽方面做一个折中,尝试将保持一致性协议所需要的总线通信量减少到最小,或者尝试优化某些频繁执行的操作。

神马是MESI协议?

目前,ARM或x86等处理器广泛使用MESI协议来维护高速缓存一致性。MESI协议的名字源于该协议使用的修改(Modified,M)、独占(Exclusive,E)、共享(Sharedÿ

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值