大多数程序员仍然需要了解的组成原理科普:
每个程序员基本迟早都得了解存储的层次体系(memory hierarchy) :寄存器(register) 、缓存(cache)、主存(main/primary memory) 、辅存(secondary memory) ,即便大多数语言完全不区分其中的种类,但是对实际质量影响太大了做不到全部无视。
但仍然应该注意通用语言不鼓励你强行区分实现细节,所以讲 memory ,程序员首先需要理解可能是以上的任何一种——即便 main memory 是主流实现的最常接触的 memory ,也不应该混同。
memory 比较正常的翻译就是“存储”( storage:存贮)。对面的“记忆体”也还行。“内存”是个很差的翻译,本义是在线存储(online memory),指 secondary memory 前的 hierarchy 。但是约定俗成对应 memory 也罢了。对应的“外存”是指离线(offline) 存储。离线是指能力(capability) ,而不是指状态,所以你硬盘就算一直加电联机也叫外存。内存和外存指一般用途,是和存储体系并列的分类。
另一种分类关于物理特性。最主要的大类是易失(volatile)/非易失(non-volatile)。外存要求使用易失存储实现。具体元件分为锁存器 /SRAM/DRAM/ROM 等等,这些和存储体系不完全正交,但属于另外的分类。
大多数情况下,主存是使用 DRAM 实现的物理内存。这是操作系统或者独立(freestanding)实现(或称为 bare-metal )的应用会看到的主存视图。对应用,典型情况使用虚拟内存空间,即经过被支持地址翻译(通过 MMU )的体系结构地址翻译映射的空间。这些空间实际来自于物理内存以及辅存中的交换空间(swap)。有些实现,如 IBM system i 直接使用 128-位地址空间,把主存和辅存都编址到同一个地址空间提供给应用。大部分常见实现都仍然不支持以相同的方式访问主存和辅存。
值得一提的是,辅存可能不是外存。虽然罕见,辅存也可能是易失存储并作为内存,例如 NDS 的 Slot-2 扩展 RAM 卡。使用这类扩展内存通常需要一些特殊的编程技术。
@
seanzxx 这个图虽然罗列了不少要点,但是都放在一起技术上并不正确。另外,一些实现其实会按驱动类(driver class)区分设备,而并不对应图中的具体分类。这种分类下设备可能是虚拟的。
把主存叫做运行内存技术上不算错,但根本是冗余的。