cpu高速缓存

CPU Cache  

CPU Cache(CPU 高速缓存)。CPU Cache 用的是一种叫作 SRAM(Static Random-Access Memory,静态随机存取存储器)的芯片

在 CPU 里,通常会有 L1、L2、L3 这样三层高速缓存。每个 CPU 核心都有一块属于自己的 L1 高速缓存,通常分成指令缓存数据缓存,分开存放 CPU 使用的指令和数据

L1 的 Cache 往往就嵌在 CPU 核心的内部,L2 的 Cache 同样是每个 CPU 核心都有的,不过它往往不在 CPU 核心的内部。所以,L2 Cache 的访问速度会比 L1 稍微慢一些。而 L3 Cache,则通常是多个 CPU 核心共用的,尺寸会更大一些,访问速度自然也就更慢一些

内存DRAM

内存用的芯片和 Cache 有所不同,它用的是一种叫作 DRAM(Dynamic Random Access Memory,动态随机存取存储器)的芯片,比起 SRAM 来说,它的密度更高,有更大的容量,而且它也比 SRAM 芯片便宜不少

硬盘

SSD(Solid-state drive 或 Solid-state disk,固态硬盘)是基于 NAND 芯片的高速硬盘、HDD(Hard Disk Drive,硬盘)这些被称为硬盘


下面是一张价格和速度对照表



缓存命中策略 - 局部性原理(Principle of Locality)

时间局部性(temporal locality)

如果一个数据被访问了,那么它在短时间内还会被再次访问

空间局部性(spatial locality)

如果一个数据被访问了,那么和它相邻的数据也很快会被访问

LRU(Least Recently Used)缓存算法

我们把访问过的数据,加载到缓存中,一旦缓存里面放不下了,我们就把最长时间没有在缓存中被访问过的数据,从缓存中移走

缓存命中率(Hit Rate/Hit Ratio)

也就是访问的数据中,可以在缓存中找到的,占有多大比例


高速缓存

CPU高速缓存里的单位是缓存行(Cache Line),我们日常使用的 Intel 服务器或者 PC 里,Cache Line 的大小通常是 64 字节

一个 long 类型的数据需要 8 个字节,所以我们一下子会加载 8 个 long 类型的数据

现代 CPU 进行数据读取的时候,无论数据是否已经存储在 Cache 中,CPU 始终会首先访问 Cache。

只有当 CPU 在 Cache 中找不到数据的时候,才会去访问内存,并将读取到的数据写入 Cache 之中。当时间局部性原理起作用后,这个最近刚刚被访问的数据,会很快再次被访问。而 Cache 的访问速度远远快于内存,这样,CPU 花在等待内存访问上的时间就大大变短了。


内存地址与高速缓存对应

直接映射 Cache(Direct Mapped Cache)

而直接映射 Cache 采用的策略,就是确保任何一个内存块的地址,始终映射到一个固定的 CPU Cache 地址(Cache Line)。而这个映射关系,通常用 mod 运算(求余运算)来实现

在对应的缓存块中,我们会存储一个组标记(Tag)。这个组标记会记录,当前缓存块内存储的数据对应的内存块,而缓存块本身的地址表示访问地址的低 N 位

除了组标记信息之外,缓存块中还有两个数据。一个自然是从主内存中加载来的实际存放的数据,另一个是有效位(valid bit)。啥是有效位呢?它其实就是用来标记,对应的缓存块中的数据是否是有效的

总结一下,一个内存的访问地址,最终包括高位代表的组标记、低位代表的索引,以及在对应的 Data Block 中定位对应字的位置偏移量


而内存地址对应到 Cache 里的数据结构,则多了一个有效位和对应的数据,由“索引 + 有效位 + 组标记 + 数据”组成。如果内存中的数据已经在 CPU Cache 里了,那一个内存地址的访问,就会经历这样 4 个步骤:

1.根据内存地址的低位,计算在 Cache 中的索引

2.判断有效位,确认 Cache 中的数据是有效的

3.对比内存访问地址的高位,和 Cache 中的组标记,确认 Cache 中的数据就是我们要访问的内存数据,从 Cache Line 中读取到对应的数据块(Data Block)

4.根据内存地址的 Offset 位,从 Data Block 中,读取希望读取到的字

如果在 2、3 这两个步骤中,CPU 发现,Cache 中的数据并不是要访问的内存地址的数据,那 CPU 就会访问内存,并把对应的 Block Data 更新到 Cache Line 中,同时更新对应的有效位和组标记的数据

除了直接映射 Cache 之外,我们常见的缓存放置策略还有全相连 Cache(Fully Associative Cache)、组相连 Cache(Set Associative Cache)。这几种策略的数据结构都是相似的,理解了最简单的直接映射 Cache,其他的策略你很容易就能理解了

现代 CPU 已经很少使用直接映射 Cache 了,通常用的是组相连 Cache(set associative cache),想要了解组相连 Cache,可以参考:计算机组成与设计:硬件 / 软件接口


上一篇: 虚拟化技术
下一篇: 缓存一致性-MESI协议
作者邮箱: 203328517@qq.com