1.2 存储器层次结构与缓存策略
在计算机系统中,有一些和存储器相关的趣事:
● 人们对存储器容量的需求总是无法满足,而且存储器容量总是供不应求。每当存储器技术在容量(更快的存储器的容量)方面取得重大飞跃的时候,就会发现其实有一些技术已经为此等候多时。这些技术在理论上完全可行,只是需要等到拥有足够数量的物理存储器供其使用时才能够被真正实现出来。
● 存储器技术似乎是导致处理器性能障碍的主要原因。这被称为“处理器与存储器之间的速度鸿沟”(the processor-memory gap)。
● 存储器的访问速度与其存储容量成反比。通常来说,容量最大的存储设备的访问时间要比容量最小的存储设备多好几个数量级。
现在,我们从程序员、设计师和工程师的视角来简单地看一下整个系统。在理想情况下,我们希望系统能够以最快的速度访问所有可用的存储器,但其实我们都知道,这是不可能实现的。紧接着的一个问题就是:我们能否做些什么来改善这种情况呢?
一个细节让我们大可放心,那就是在实际情况下,系统并不总是使用所有的存储器,而仅仅是在某些时段内使用某一部分存储器。在这种情况下,我们只需为立即需要执行的程序预留最快的存储器,而让那些并非立即执行的代码或数据使用较慢的存储设备。当CPU从最快的存储器中获取计划立即需要执行的指令时,硬件设备会预测接下来会执行程序的哪一部分,并将这部分代码交给较慢的存储器,然后等待执行。在执行到存储在较慢存储器上的代码之前,这些代码会转存到较快的存储器中。这种策略称为“缓存”。
我们可以把缓存比作现实生活中一般家庭的食物供给。除非是生活在荒无人烟的地方,否则我们一般不会采购一整年所需的食物带回家。相反,我们通常会在家中安置一些比较大的存储设备(比如冰箱、食品储藏室和食品架),用来存放未来一到两周的食物。当意识到食物快吃完的时候,我们就会去食品杂货店采购恰好能够填满家中存储设备的食物。
程序的执行通常会受到一些外部因素的影响(用户设置只是其中之一),这让缓存机制的实现变得十分困难。程序执行流程(通过跳转和中断等指令的数量来衡量)的可确定性越高,缓存机制工作得越好。相反,若程序的执行流程发生变化,那么之前缓存的指令也就不再有效,因此这部分缓存的指令会被丢弃,而程序所需的那部分指令则需要重新从较慢的存储器中获取。
缓存策略的实现无处不在,横跨多个级别的存储器,如图1-2所示。
图1-2 存储器的缓存层次结构原理图