现代计算机需要大约1000 个CPU 周期(1 微秒左右) 从RAM 获取数据。这种速度已很惊人,但与访问CPU 寄存器的时间相比仍然较慢。减少计算所需的RAM 操作次数,是计算机科学家追求的目标。
在两个面对面的人之间,声波传播需要大约10 微秒。
时间局部性与空间局部性
在尝试尽量减少对RAM 的访问时,计算机科学家开始注意到两个事实。
◎ 时间局部性:访问某个存储地址时,可能很快会再次访问该地址。
◎ 空间局部性:访问某个存储地址时,可能很快会访问与之相邻的地址。
因此,将这些存储地址保存在CPU 寄存器中,有助于避免大部分对RAM的“昂贵”操作。不过在设计CPU 芯片时,工业工程师并未找到可行的方法来容纳足够多的内部寄存器,但他们仍然发现了如何有效地利用时间局部性与空间局部性。接下来将对此进行讨论。
一级缓存
可以构建一种集成在CPU 内部且速度极快的辅助存储器,这就是一级缓存。将数据从一级缓存读入寄存器,仅比直接从寄存器获取数据稍慢。
利用一级缓存,我们将可能访问的存储地址中的内容复制到CPU 寄存器附近,借此以极快的速度将数据载入CPU 寄存器。将数据从一级缓存读入寄存器仅需大约10 个CPU 周期,速度是从RAM 获取数据的近百倍。
借由10 KB 左右的一级缓存,并合理利用时间局部性与空间局部性,超过一半的RAM 访问调用仅通过缓存就能实现。这一创新使计算技术发生了翻天覆地的变化。一级缓存可以极大缩短CPU 的等待时间,使CPU 将更多时间用于实际计算而非处于空闲状态。
二级缓存
提高一级缓存的容量有助于减少从RAM 获取数据的操作,进而缩短CPU 的等待时间。但是,增大一级缓存的同时也会降低它的速度。在一级缓存达到50 KB 左右时,继续增加其容量就要付出极高的成本。更好的方案是构建一种称为二级缓存的缓存。二级缓存的速度稍慢,但容量比一级缓存大得多。现代CPU 配备的二级缓存约为200 KB,将数据从二级缓存读入CPU 寄存器需要大约100 个CPU 周期。
我们将最有可能访问的地址复制到一级缓存,较有可能访问的地址复制到二级缓存。如果CPU 没有在一级缓存中找到某个存储地址,仍然可以尝试在二级缓存中搜索。仅当该地址既不在一级缓存、也不在二级缓存中时,CPU 才需要访问RAM。
目前,不少制造商推出了配备三级缓存的处理器。三级缓存的容量比二级缓存大,虽然速度不及二级缓存,但仍然比RAM 快得多。一级/ 二级/ 三级缓存非常重要,它们占据了CPU 芯片内部的大部分硅片空间。见图7-11。
使用一级/ 二级/ 三级缓存能显著提高计算机的性能。在配备200 KB的二级缓存后,CPU 发出的存储请求中仅有不到10% 必须直接从RAM获取。
读者今后购买计算机时,对于所挑选的CPU,请记住比较一级/ 二级/三级缓存的容量。CPU 越好,缓存越大。一般来说,建议选择一款时钟频率稍低但缓存容量较大的CPU。
第一级存储器与第二级存储器
如前所述,计算机配有不同类型的存储器,它们按层次结构排列。性能最好的存储器容量有限且成本极高。沿层次结构向下,可用的存储空间越来越多,但访问速度越来越慢。
在存储器层次结构中,位于CPU 寄存器与缓存之下的是RAM,它负责存储当前运行的所有进程的数据与代码。截至2017 年,计算机配备的RAM 容量通常为1 GB 到10 GB。但在许多情况下,RAM 可能无法满足操作系统以及所有运行程序的需要。
因此,我们必须深入探究存储器层次结构,使用位于RAM 之下的硬盘。截至2017 年,计算机配备的硬盘容量通常为数百吉字节,足以容纳当前运行的所有程序数据。如果RAM 已满,当前的空闲数据将被移至硬盘以释放部分内存空间。
问题在于,硬盘的速度非常慢,它一般需要100 万个CPU 周期(1 毫秒)a 在磁盘与RAM 之间传输数据。从磁盘访问数据看似很快,但不要忘记,访问RAM 仅需1000 个周期,而访问磁盘需要100 万个周期。RAM 通常称为第一级存储器,而存储程序与数据的磁盘称为第二级存储器。
标准照片在大约4 毫秒内捕捉光线。
CPU 无法直接访问第二级存储器。执行保存在第二级存储器中的程序之前,必须将其复制到第一级存储器。实际上,每次启动计算机时,即便是操作系统也要从磁盘复制到RAM,否则CPU 无法运行。
确保RAM 永不枯竭 在典型活动期间,确保计算机处理的所有数据与程序都能载入RAM 至关重要,否则计算机将不断在磁盘与RAM 之间交换数据。由于这项操作的速度极慢,计算机性能将严重下降,甚至无法使用。这种情况下,计算机不得不花费更多时间等待数据传输,而无法进行实际的计算。
当计算机不断将数据从磁盘读入RAM 时,则称计算机处于抖动模式。必须对服务器进行持续监控,如果服务器开始处理无法载入RAM 的数据,那么抖动可能会导致整个服务器崩溃。银行或收银机前将因此排起长队,而服务员除了责怪发生抖动的计算机系统之外别无他法。内存不足或许是导致服务器故障的主要原因之一。
外部存储器与第三级存储器
我们继续沿存储器层次结构向下分析。在连接到网络之后,计算机就能访问由其他计算机管理的存储器。它们要么位于本地网络,要么位于因特网(即云端)。但访问这些数据所需的时间更长:读取本地磁盘需要1 毫秒,而获取网络中的数据可能耗时数百毫秒。网络包从一台计算机传输到另一台计算机大约需要10 毫秒,如果经由因特网传输则需要200 毫秒到300 毫秒,与眨眼的时间相仿。
位于存储器层次结构底部的是第三级存储器,这种存储设备并非总是在线与可用的。在盒式磁带或CD 中存储数百万吉字节的数据成本较低,但访问这类介质中的数据时,需要将介质插入某种读取设备,这可能需要数分钟甚至数天之久(不妨尝试让IT 部门在周五晚上备份磁带中的数据……)。有鉴于此,第三级存储器仅适合归档很少访问的数据。
存储技术的发展趋势
一方面,很难显著改进“快速”存储器(位于存储器层次结构顶端)所用的技术;另一方面,“慢速”存储器的速度越来越快,价格也越来越低。几十年来,硬盘存储的成本一直在下降,这种趋势似乎还将持续下去。
新技术也使磁盘的速度得以提高。人们正从旋转磁盘转向固态硬盘(SSD),它没有动件,因而更快、更可靠且更省电。
采用SSD 技术的磁盘正变得越来越便宜且越来越快,但其价格仍然不菲。有鉴于此,一些制造商推出了同时采用SSD 与磁技术的混合磁盘。后者将访问频率较高的数据存储在SSD 中,访问频率较低的数据存储在速度较慢的磁盘中。当需要频繁访问原先不经常访问的数据时,则将其复制到混合驱动器中速度较快的SSD。这与CPU 利用内部缓存提高RAM 访问速度的技巧颇为类似。
小结本文介绍了一些基本的计算机工作原理。任何可计算的事物都能采用简单的指令来表示。为将复杂的计算命令转换为CPU 可以执行的简单指令,需要使用一种称为编译器的程序。计算机之所以能进行复杂计算,仅仅是因为CPU 可以执行大量基本操作。
计算机的处理器速度很快,但存储器相对较慢。CPU 并非以随机方式访问存储器,而是遵循空间局部性与时间局部性原理。因此,可以将访问频率较高的数据缓存在速度更快的存储器中。这一原则在多个级别的缓存中得到了应用:从一级缓存直到第三级存储器,不一而足。
本文讨论的缓存原则可以应用于多种场景。确定应用程序频繁使用的数据,并设法提高这部分数据的访问速度,是缩短计算机程序运行时间的最常用策略之一。
——本文选自《计算机科学精粹》