CPU 只能从内存中加载指令,因此执行程序必须位于内存。通用计算机运行的大多数程序通常位于可读写内存,称为内存(main memory),也称为随机访问内存(Random Access Memory,RAM)。内存通常为动态随机访问内存(Dynamic Random Access Memory,DRAM),它采用半导体技术来实现。
计算机也使用其他形式的内存,如我们已经提到的只读内存(ROM)和电可擦可编程只读内存(EEPROM)。由于 ROM 不可修改,因此只能将静态程序(如引导程序)存在其中。ROM 的不可变性对游戏盒来说还是有用的。EEPROM 可以修改,但是不能经常修改,因此可以保存大多数的静态程序,例如,智能手机采用 EEPROM 来存储工厂安装的程序。
所有形式的内存都提供字节数组,每个字节都有地址。交互通过针对特定内存地址,执行一系列 load 或 store 指令来实现。指令 load 将内存字节或字保存到 CPU 寄存器,而指令 store 将寄存器内容保存到内存。除了明确使用 load 和 store 外,CPU 还会自动加载内存指令以便执行。
在冯•诺依曼体系结构(von Neumann architecture)上执行时,一个典型的指令执行周期是,首先从内存中获取指令,并存到指令寄存器(instruction register)。接着,该指令被解码,也可能会从内存中获取操作数据并且存到内部寄存器。在指令完成对操作数据的执行后,结果也可存到内存。
注意,内存单元只能看到内存地址的流,而并不知道它们如何产生(通过指令计数器、索引、间接、常量地址或其他方式)或它们是什么样(指令或数据)的地址。相应地,我们可以忽略程序如何产生内存地址,而只关注由程序运行所生成的地址序列。
在理想情况下,程序和数据都应永久驻留在内存中。由于以下两个原因,这是不可能的:
因此,大多数的计算机系统都提供外存(secondary storage)来扩充内存。外存的主要需求是,能够永久存储大量数据。最为常用的外存设备为硬盘或磁盘(Hard Disk Drive,HDD),它能存储程序和数据。大多数程序(系统与应用)都保存在磁盘上,当要执行时才加载到内存。许多程序都使用硬盘作为它们处理的起点和终点。因此,磁盘存储的管理是否适当,对计算机系统来说十分重要(这将在后续章节中加以讨论)。
从更广意义上来说,以上所述的存储结构(由寄存器、内存和磁盘组成的),仅仅只是多种存储系统的一种。除此之外,还有高速缓存、CD-ROM、磁带等。每个存储系统都可存储与保存数据,以便以后提取。各种存储系统的主要差异是速度、价格、大小和易失性。
根据速度和价格,各种不同的存储可按层次来分类(图 1)。层次越高,价格越贵,速度越快。从高到低,每个层次的价格通常会降低,而访问时间通常会增加。这种折中是合理的,如果一个给定存储系统比另一个更快更便宜,而其他属性一样,那么就没有理由使用更慢更昂贵的存储。
事实上,许多早期存储设备,如纸带和磁心存储器,之所以现在已经进入博物馆,就是因为磁带和半导体内存(semiconductor memory)已变得更快更便宜。图 1 中上面四层存储通常由半导体内存构成。
除了不同的速度和价格,存储系统还分为易失的和非易失的。当电源切断时,正如前面所讲,易失存储(volatile storage)会丢失内容。如果没有昂贵的电池和发电后备系统,那么数据应写到非易失存储(nonvolatile storage)以便安全保管。在图 1 所示的层次中,固态磁盘之上的存储系统为易失的,而之下的为非易失的。
固态磁盘(solid-state disk)有多种类型,一般来说都比磁盘要快,也是非易失的。一种类型的固态磁盘在运行时将数据保存在一个大的 DRAM 数组上,它有一个隐藏磁盘和一个作为备份电源的电池。当外部电源被中断时,固态磁盘控制器将数据从 RAM 复制到磁盘。当外部电源恢复后,控制器将数据复制到 RAM。
另一种固态磁盘是闪存,它在照相机、个人数字助理(Personal Digital Assistant,PDA)和机器人中很受欢迎,并越来越多地作为通用计算机的存储。闪存比 DRAM 慢,但是无需电源以便保存内容。
另一种非易失性存储器是 NVRAM,即具有备用电池的 DRAM。这种存储与 DRAM 一样快,且是非易失的(只要电池有电)。
完整存储系统的设计应当平衡所有以上讨论的各种因素:它应只使用必需的昂贵存储,而提供尽可能便宜的、非易失的存储。当两个存储组件的访问时间或传输速率具有明显差异时,可以通过高速缓存来改善性能。