高速缓存基础

现代计算存储器体系

在计算机体系里面,存储器的结构如下图所示(网上找的图):
20180526173631209.png
越往上速度越快存储空间越小;越往下速度越慢存储空间越大。在计算机体系中,能够很大程度影响我们程序运行速度的层次主要在 L1~L3 之间。而我们本次主要讲的也就是这部分——高速缓存。

现代处理器

比如 i5 系列的处理器,它的架构里同样包含了三级高速缓存器,如下图示:
mac_cpu_cache_info.png
L1L2L3 分别表示一级缓存、二级缓存、三级缓存。越靠近CPU的缓存,速度越快,容量也越小。L1缓存小但很快,并且紧靠着在使用它的CPU内核。分为指令缓存和数据缓存;L2大一些,也慢一些,并仍然只能被一个单独的CPU核使用;L3更大、更慢,并且被单个插槽上的所有CPU核共享;最后是主存,由全部插槽上的所有CPU核共享。

为什么需要高速缓存

我们来看看如果没有缓存器时, CPU 和主存 Main Memory 交换的方式:它们中间是通过一个数据总线相连,双方通过该总线进行交互,此外我们还能看到 IO 也和数据总线相关联。
5fd8996d7d9c0806f73753f8.png
多处理器之间通过 数据总线 来访问同一块内存,但是数据总线是和外部沟通的桥梁,如果频繁占用数据总线必然会提高系统延迟。
因此加入了高速缓存器,缓存的加入可以降低延迟减少数据总线的压力
🏳‍🌈自顶向下 - 高速缓存 - 图4

相关概念

缓存行

缓存行 (Cache Line) CPU 缓存中的最小单位,CPU缓存由若干缓存行组成,一个缓存行的大小通常是 64 字节(这取决于 CPU)。每当CPU去读取缓存时,不是仅读取需要的部分而是把所在数据的一整行都取出来。

缓存更新方式

  • Write-ThroughCPU 在向 Cache 写入数据的同时,也把数据写入主存以保证 Cache 和主存中相应单元数据的一致性。
    • 优点:简单粗暴
    • 缺点:每次更新时,不仅要写入 Cache 还要写入主存,速度比较慢
  • Write-BackCPU 只向 Cache 写入,并用标记加以注明,直到 Cache 中被写过的块要被新的数据块取代时,才一次性写入主存
    • 优点:CPU执行效率提高
    • 缺点:实现复杂

https://www.geeksforgeeks.org/write-through-and-write-back-in-cache/

缓存命中

CPU 想要取的数据正好在缓存器中,则称为“缓存命中”。缓存命中可以大大提高 CPU 速度。举个例子,如果 CPU 读取缓存的命中率非常高(大多数CPU可达90%左右),则 CPU 下一次要读取的数据90%都在缓存中,大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。

高速缓存带来的问题

凡事都有利弊,引入高速缓存并不是一件十分完美的事,它还伴生着许多问题,其中最重要的一个问题就是“缓存一致性问题”。
目前不同的处理器架构、不同的内存访问方式,有不同的解决方案。最常见的处理器架构就是 SMP(对称多处理系统) ,它的内存访问方式为统一内存访问(UMA),针对这种处理器架构,提出了基于嗅探技术的缓存一致性协议—— MESI