我们从这个简单的例子中看到的很重要的一点是,系统花了大量时间来把信息从一个地方移动到另一个地方。hello程序里的机器指令最初保存在硬盘上。当程序被加载的时候,它们被复制进内存中。当处理器运行程序的时候,指令又从内存复制进处理器中。相似的,数据字符串“hello,world\n”,最开始保存在硬盘上,然后复制进内存中,最后又从内存中复制到显示设备。从程序员的角度来看,这些复制使程序的实际工作变慢了。因此,系统设计者的主要目标就是让这些复制操作尽可能地快。
因为这个物理规律,大的存储设备比小的存储设备慢,快的存储设备比小的存储设备贵。例如,在一个典型的系统里,硬盘可能比主存大一千倍,但读取速度可能比主存慢一千万倍。
相似的,一个典型的寄存器文件只能存储几百字节信息,而主存却可以存储几十亿字节信息。但是寄存器文件的读取速度比主存快一百倍。更麻烦的是,随着半导体技术这些年的进步,处理器和主存间的差距在持续增加。让处理器跑得更快比让内存更快更容易也更便宜。
为了拉近处理器和主存之间的差距,系统设计者们引入了相对内存更小但是也更快的存储设备——缓存,它存储着处理在不久的将来会用到的信息。Figure 1.8显示了在一个典型系统中的缓存。处理器芯片上的一级缓存能存储数万字节的信息,而且访问速度接近寄存器文件。二级缓存能存储数十万到数百万字节的信息,有一个特殊的总线连接着二级缓存和处理器。二级缓存的访问速度可能比一级缓存慢5倍,但依旧比主存快5到10倍。一级缓存和二级缓存是通过一种叫做static random access memory
(SRAM)的硬件技术实现的。更新更强大的系统甚至有三个级别的缓存:一级缓存,二级缓存和三级缓存。缓存背后的思想是,通过本地化(程序访问离自己最近的数据和代码),系统能同时获得存储器既大又快的效果(Hadoop的数据本地化设计理念似乎在这儿找到了原型)。通过把处理器可能经常访问的数据放进缓存,我们能用缓存来执行大部分内存操作。
本书的目标之一就是,让那些关注缓存的程序员利用缓存来提高他们的程序的执行效率。你将在第六章学到更多关于这些设备以及如何使用这些设备的知识。