高速缓存基础
现代计算存储器体系
在计算机体系里面,存储器的结构如下图所示(网上找的图):
越往上速度越快但存储空间越小;越往下速度越慢但存储空间越大。在计算机体系中,能够很大程度影响我们程序运行速度的层次主要在 L1~L3
之间。而我们本次主要讲的也就是这部分——高速缓存。
现代处理器
比如 i5
系列的处理器,它的架构里同样包含了三级高速缓存器,如下图示:L1
、 L2
、 L3
分别表示一级缓存、二级缓存、三级缓存。越靠近CPU的缓存,速度越快,容量也越小。L1缓存小但很快,并且紧靠着在使用它的CPU内核。分为指令缓存和数据缓存;L2大一些,也慢一些,并仍然只能被一个单独的CPU核使用;L3更大、更慢,并且被单个插槽上的所有CPU核共享;最后是主存,由全部插槽上的所有CPU核共享。
为什么需要高速缓存
我们来看看如果没有缓存器时, CPU
和主存 Main Memory
交换的方式:它们中间是通过一个数据总线相连,双方通过该总线进行交互,此外我们还能看到 IO
也和数据总线相关联。
多处理器之间通过 数据总线 来访问同一块内存,但是数据总线是和外部沟通的桥梁,如果频繁占用数据总线必然会提高系统延迟。
因此加入了高速缓存器,缓存的加入可以降低延迟,减少数据总线的压力:
相关概念
缓存行
缓存行 (Cache Line) 是 CPU
缓存中的最小单位,CPU缓存由若干缓存行组成,一个缓存行的大小通常是 64 字节(这取决于 CPU)。每当CPU去读取缓存时,不是仅读取需要的部分而是把所在数据的一整行都取出来。
缓存更新方式
Write-Through
:CPU
在向Cache
写入数据的同时,也把数据写入主存以保证Cache
和主存中相应单元数据的一致性。- 优点:简单粗暴
- 缺点:每次更新时,不仅要写入
Cache
还要写入主存,速度比较慢
Write-Back
:CPU
只向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
。