【IT168 技术】高速缓存(Cache Memory)在计算机系统中起着关键作用。事实上,所有现代计算机系统,包括台式电脑、公司数据中心的服务器和基于云的计算资源,都有少量非常快的静态随机存取内存(SRAM),位置非常靠近中央处理器(CPU),这种内存称为高速缓存内存。
尽管与主内存(RAM)或二级内存(存储资源)相比,缓存内存的大小比较小,但是它对系统的总体性能有很大的影响。
什么是高速缓存?
计算机系统有硬盘驱动器(HDD)或固态驱动器(SSD)来提供高容量、进行长期的数据存储,以及RAM, RAM用于存储中央处理器正在使用或即将需要的数据和程序代码。RAM比HDD或SSD存储快得多。它通常由动态随机存取内存(DRAM)组成,而DRAM的每GB价格也更昂贵。
但是CPU的工作速度要比RAM快得多,所以有时它不得不等待从RAM中读取指令或数据后才能继续处理,这降低了计算机系统的整体性能。
为了防止这种情况发生,计算机系统通常都配备了高速缓存内存:一小部分DRAM,速度非常快,但是非常昂贵,而且非常靠近CPU。
这种高速缓存存储了CPU可能不久就要使用的数据或指令。因为这样可以防止CPU长时间等待,这就是为什么使用缓存来提高读取性能。
高速缓存和性能
高速缓存增加了计算机的性能。高速缓存内存非常靠近CPU,要么就在CPU芯片上,要么在CPU附近的主板上,由专用数据总线连接。因此,与普通RAM相比,指令和数据可以更快地从中读取(并写入)。
这意味着CPU就不太会一直等待,或者等待时间将大大缩短。其结果是,非常少量的高速缓存可以显著提高计算机的性能。
高速缓存的工作原理
高速缓存的工作原理是在RAM中的某些内存地址获取数据或指令,并将它们复制到高速缓存中,同时记录下这些指令或数据的原始地址。
这将产生一个包含少量RAM内存地址的表,以及这些RAM内存地址包含的指令或数据的副本。
高速缓存“命中(Hit)”
当处理器需要来自给定RAM内存地址的指令或数据时,在从RAM检索这些指令或数据之前,它会检查高速缓存是否包含对该RAM内存地址的引用。如果是这样,那么它将从高速缓存中读取相应的数据或指令,而不是从RAM中读取。这就是所谓的“缓存命中”。由于高速缓存内存比RAM更快,而且它更靠近CPU,因此它可以更快地获取和开始处理指令和数据。
当需要将数据或指令写入内存时,执行相同的过程。然而,在这种情况下,还有一个额外的步骤,因为如果任何东西被写入高速缓存,那么它最终也必须被写入RAM。
如何做到这一点取决于缓存的写策略。最简单的策略称为“write-through”:使用该策略,任何写入高速缓存的内容都可以直接写入RAM。
另一种策略是“write-back”。使用“write-back”策略,写入高速缓存的数据也会立即写入RAM。任何写进高速缓存的东西都被标记为“dirty”,这意味着它不同于从RAM中读取的原始数据或指令。当它从高速缓存中删除时,才会写入RAM,替换原始信息。
中间策略允许将“dirty”信息排队并成批地写回RAM,这比多个单独的写操作更有效。
高速缓存“未命中(miss)”
如果在高速缓存中没有找到给定RAM内存地址的数据或指令,那么这就是所谓的“高速缓存未命中”。在这种情况下,当从RAM检索信息时,CPU只好被迫等待。
事实上,数据或指令从RAM中检索并写入高速缓存,然后发送到CPU。原因是最近使用的数据或指令很可能在不久的将来再次需要,所以CPU从RAM请求的任何东西都会被复制到高速缓存中。
(有一个例外,一些很少重复使用的数据类型可以标记为不可缓存。这可以防止数据不必要地占用有价值的高速缓存空间。)
这就引出了一个问题:如果缓存内存已经满了,会发生什么情况?答案是,必须“清除”高速缓存中的一些内容,以便为需要写入其中的新信息腾出空间。
如果需要做出决定,那么高速缓存将通过“替换策略”来决定哪些信息被删除。
有许多可行的替换策略,最常见的策略之一是最近最少使用(LRU)策略。该策略的原则是,如果最近没有使用某些数据或指令,那么在不久的将来,它们比最近需要的数据或指令更不可能被需要。
高速缓存的关键价值
高速缓存被用来减少RAM和CPU之间的性能瓶颈。它的使用类似于将RAM用作磁盘缓存。在这种情况下,存储在二级存储系统(如HDD或SSD)上的常用数据被临时放在RAM中,CPU可以更快地访问这些数据。
由于RAM比二级存储更昂贵(但更快),所以磁盘缓存比HDD或SSD更小。由于SRAM比DRAM更昂贵(但更快),因此高速缓存比RAM更小。
高速缓存的类型
·主缓存。大多数高速缓存内存与CPU本身在物理上位于同一个晶粒上,最靠近CPU核心的部分,有时称为主缓存,不过这个术语现在已经不常用了。
·二级缓存。这通常指的是另一块高速缓存,它位于靠近CPU的主板上的一个独立芯片上。这个术语也不常用,因为大多数高速缓存现在位于CPU 晶粒本身上。
高速缓存等级
现代计算机系统有不止一块高速缓存,这些高速缓存的大小和与处理器核心的距离不同,因此速度也不同,存在不同的等级。
最小和最快的高速缓存被称为一级缓存,或L1缓存,下一个是L2缓存。现在大多数系统都有L3缓存,自从推出Skylake芯片以来,英特尔也在一些处理器上增加了L4缓存。
1级
L1高速缓存是内置于CPU本身的高速缓存,以与CPU相同的时钟速度运行。它是最昂贵的高速缓存,所以大小非常有限。但是因为它非常快,所以是处理器查找RAM中缓存的数据或指令的第一个地方。
事实上,在大多数现代CPU中,L1缓存被分为两部分:数据部分(L1d)和指令部分(L1i)。它们分别保存数据和指令。现代CPU的缓存大小近似于每个核心32 KB L1i和L1d。
2级
L2高速缓存也可能位于CPU芯片中,尽管它不像L1高速缓存那样靠近核心。或者更少见的是,它可能位于靠近CPU的单独芯片上。L2缓存比L1缓存更便宜、更大,因此L2缓存的大小往往更大,每个核心的大小可能为256 KB。
3级
3级缓存往往比L1或L2缓存大得多,但在另一个重要方面也有所不同。L1和L2缓存对处理器的每个核心都是私有的,而L3则是所有核心都共享的缓存。这使得它能够在数据共享和核心间的通信中发挥重要作用。L3缓存的大小可能是每个核2 MB。
缓存映射
高速缓存,正如前面所讨论的,是非常快的——这意味着它可以非常快地读取。
但它存在一个潜在的瓶颈:在从高速缓存中读取数据之前,必须先找到它。处理器知道要读取的数据或指令的RAM内存地址。它必须搜索高速缓存,以查看其中是否有对该RAM内存地址的引用,以及相关的数据或指令。
有很多方法可以将RAM中的数据或指令映射到高速缓存中,这些方法直接影响找到它们的速度。但是有一个权衡:最小化搜索时间也会最小化缓存命中的可能性,而最大化缓存命中的机会则会最大化搜索时间。
常用的缓存映射方法如下:
直接映射
使用直接映射缓存,高速缓存中只有一个地方可以存储RAM中的给定数据块。
这意味着CPU只需要查看高速缓存中的一个位置,就可以查看它正在寻找的数据或指令是否存在,如果存在,就会很快找到。直接映射缓存的缺点是,它严重限制了可以存储在高速缓存中的数据或指令,因此缓存命中的次数很少。
关联映射
也称为完全关联映射,这与直接映射相反。使用关联映射方案,RAM中的任何数据块或指令都可以放在任何高速缓存块中。这意味着CPU必须搜索整个高速缓存,以查看它是否包含要查找的内容,但是缓存命中的几率要高得多。
组相联映射
这两种映射类型之间的折衷是组相联映射(set-associative mapping),它可以将一个RAM块映射到有限数量的不同高速缓存块。
2路相联映射系统允许将RAM块放在高速缓存中两个位置中的一个,相比之下,8路相联映射系统允许将RAM块放在8个高速缓存块中的任意一个。
2路系统的搜索时间是直接映射系统的两倍,因为CPU必须在两个位置而不是一个位置进行搜索,但是缓存命中的几率要大得多。