一、背景
在现代处理器中,处理器的访问速度已经远远超过了主存储器的访问速度,比如一条加载指令需要上百个时钟周期才能从主存储器读取数据到处理器内部的寄存器中,这会导致使用该数据的指令需要等待加载指令完成才能继续执行, 处理器处于停滞状态, 严重影响程序的运行速度。
为了解决这个问题,在CPU和内存之间添加一个高速内存, 这个高速内存容量小,只用来存储CPU执行时常用的指令。既保证了硬件成本,又提高了CPU的访问速度。这个高速内存就是高速缓存。
二、工作原理
在处理器内部设置一个缓冲区,该缓冲区的速度与处理器内部的访问速度匹配。当处理器第一次从内存中读取数据时,也会把该数据暂时缓存到这个缓冲区里。这样,当处理器第二次读时,直接从缓冲区中取数据,从而大大地提升了第二次读的效率。同理,后续读操作的效率也得到了提升。
这个缓冲区的概念就是高速缓存。第二次读的时候,如果数据在高速缓存里,称为高速缓存命中(cache hit);如果数据不在高速缓存里,称为高速缓存未命中(cache miss)。
三、物理结构
高速缓存一般是集成在CPU处理器内部的 SRAM(Static Random Access Memory), 相比外部的内存条,它造价昂贵,因此,高速缓存的容量一般比较小,成本高,但是访问速度快。
如果一个程序的高速缓存命中率比较高,那么还不仅能提升程序的运行速度,还能降低系统功耗。因为高速缓存命中时就不需要访问外部的内存模块,从而有助于降低系统功耗‘’
通常,在一个系统的设计过程中,需要在高速缓存的性能和成本之间权衡,因此现代处理器系统都采用多级高速缓存的设计方案。 越靠近 CPU 内核的高速缓存速度越快, 成本越高, 容量越小。具体如下图所示
一个经典的 ARM64 体系结构处理器系统包含了多级的高速缓存
四、缓存一致性
缓存会引发数据的一致性问题。如图所示,数据 A 在三个地方——内存、 CPU0 的高速缓存、 CPU1 的高速缓存。这个系统有 4 个观察者(observer)——CPU0、 CPU1、 DMA 缓冲区以及 GPU,那么在 4 个观察者眼中, 内存 A 的数据会是一致的吗?有没有可能产生不一致的情况呢?这就是缓存一致性的问题,包括了核与核之间的缓存一致性、 DMA 缓冲区和高速缓存之间的一致性等
解决方案:
在多核里实现一个 MESI 协议,实现一种总线侦听的控制单元,例如 ARM 的 SCU。对于系统级别的缓存一致性,需要实现一种缓存一致性总线协议。在 2011 年, ARM 公司在 AMBA 4 协议里提出了 AXI 总线缓存一致性扩展(AXI Coherency Extension, ACE)协议。
参考: