内存层次结构
现代计算机系统可以同时运行数十个甚至数百个不同的应用程序。由于内存是一种有限的资源,随着越来越多的应用程序消耗它,性能可能会下降,甚至完全停止。这就是虚拟内存发挥作用的地方。图 1 显示了内存层次结构,包括高速缓存、主内存和虚拟内存。
图 1. 内存层次结构
如图 1 所示,虚拟内存的存在是为了增加系统的内存容量。这是通过将磁盘
驱动器的一部分分配为专用内存块来完成的,对于任何可能需要它的应用程序来说,该内存块“看起来”就像主内存。
为了防止磁盘访问降低速度性能,主内存充当虚拟内存的完全关联缓存,存储近访问的磁盘位置。因此,通过使用虚拟内存,主内存成为高速缓存层次结构中的另一层。
虽然详细信息超出了本文的范围,但应该注意的是,虚拟内存是通过计算机
操作系统和
处理器的内存管理单元 (MMU) 之间的交互来管理和控制的。
缓存与分页
回想一下,高速缓存将物理内存地址分解为多个字段。这样做是为了识别正在存储近访问的数据的缓存条目。对于完全关联的缓存,这些字段是缓存标记和字节偏移量。缓存条目由匹配标签和包含数据的缓存块组成。
如果未找到匹配的标签,则称为高速缓存未命中。
图 2. 缓存术语
虚拟内存的工作原理类似,但使用虚拟地址的概念。
虚拟地址由虚拟页号和页偏移量组成。虚拟地址用于定位内存中称为页框的项目,通常大小为 4kB。
页框包含页框号和实际数据,简称为页。
页偏移用于访问 4kB 页内的单个字。如果虚拟地址未指向物理内存中的位置,则会发生页面错误,系统必须前往磁盘驱动器获取所请求的数据。当发生页面错误时,磁盘上的页面将移动到内存中的页面框架。在主内存和磁盘之间移动页面称为分页(或交换)。
图 3. 分页命名法
由于虚拟内存用于扩展系统内存的容量,因此需要一种既考虑磁盘上的位置又考虑主内存中的位置的寻址方案。这就是虚拟地址发挥作用的地方。
虚拟地址跨越磁盘驱动器和主内存,导致虚拟地址多于物理内存地址。因此,在访问页面中的数据之前,系统必须确定该数据是驻留在物理内存还是虚拟内存中。这是通过地址转换完成的。
图 4. 虚拟地址映射到虚拟内存和物理内存