1. 引言

内存管理关注的是计算机系统如何处理主存储器的使用。 简而言之,主存保存着可被处理器直接访问的资源(如指令和数据),处理器可以利用这些资源来执行不同的进程。然而,主存的管理是一项复杂的任务,多年来人们提出了多种不同的策略来应对。

在本文中,我们将重点探讨随机存取存储器(RAM)的管理。首先,我们会介绍操作系统中的内存管理器及其核心职责;接着,简要回顾程序在主存中的映射策略;最后,我们将详细分析不同的内存管理方案,包括早期系统中使用的方案以及基于虚拟内存的现代方案。

2. 内存管理器

操作系统的内存管理器主要负责管理计算机的主存,尤其是RAM。为了使处理器能够访问代码和数据并执行进程,内存管理器需要完成一系列关键任务。以下是其主要职责:

  • 请求验证:检查内存请求是否合法,以及请求者是否有权限进行内存分配
  • 分配:寻找满足内存请求的空闲区域,并进行分配
  • 释放:回收已终止或空闲进程占用的内存
  • 碎片整理:重新排列内存中的内容,以形成更大的可用连续空间

内存管理器所采用的策略和策略会根据所使用的内存管理方案而有所不同。 不同的内存管理方案在性能(内存管理操作的执行时间)与效率(内存利用率)之间存在权衡。早期的方案可能执行速度快,但内存利用率低;而现代方案虽然更复杂,执行效率可能稍低,但能更高效地利用内存资源。

3. 内存映射

内存映射指的是程序在主存中的分配策略。在早期系统中,程序通常被直接映射到主存中的连续物理地址空间中,也就是说,程序访问的地址就是实际的物理地址。

随着程序规模的扩大,很多程序的大小超过了系统可用的物理内存容量。这就使得将整个程序一次性加载到内存并进行直接映射变得不可行。

为了解决这个问题,虚拟内存(Virtual Memory)应运而生。在虚拟内存机制下,程序可以被划分为多个块,映射到虚拟地址空间中。 这些程序块可以按需加载到物理内存中,并将虚拟地址动态映射到物理地址。

下图展示了早期系统与支持虚拟内存系统的内存分配方式对比:

MemoryAllocation3

4. 内存管理方案

内存是计算机系统中的关键资源。 可用内存总量及其数据处理速度直接影响系统性能。除了硬件特性外,逻辑层面的决策也会影响内存的使用方式,从而影响系统整体性能。

在内存管理中,一个关键的逻辑决策就是内存管理方案。接下来,我们将探讨几种典型的内存管理方案,并分析内存管理器在每种方案下的行为。

4.1. 早期系统的内存管理方案

早期计算机系统的内存管理相对简单。以下是几种常见的早期管理方案:

  • 单用户连续分配(Single User Contiguous)
    这是最简单的一种方案,内存管理器将全部可用内存分配给一个程序。只有在前一个程序释放内存后,才能加载下一个程序。

  • 固定分区(Fixed Partitions)
    将内存划分为若干固定大小的分区,每个分区可独立加载一个程序。分区在系统启动时确定,运行期间不可更改。内存管理器通过分区表来记录每个分区的状态和分配情况。

  • 动态分区(Dynamic Partitions)
    分区大小在运行时动态确定,避免内存浪费。同样使用分区表,但该表的内容可以在系统运行期间动态更新。

这些基于分区的方案需要选择合适的分配策略来决定程序放入哪个分区:

  • 首次适应(First Fit):将程序放入第一个找到的足够大的分区
  • 最佳适应(Best Fit):将程序放入最小的合适分区(固定分区)或留下最大空闲空间的分区(动态分区)

⚠️ 所有这些早期方案的共同问题是:必须将整个程序加载到内存中,无法运行比可用物理内存更大的程序。 这推动了基于虚拟内存的新方案的发展。

4.2. 基于虚拟内存的内存管理方案

虚拟内存的引入使得程序可以按需加载到内存的非连续区域。由此衍生出以下几种管理方案:

  • 分页内存管理(Paged Memory)
    将程序划分为等大小的页(pages),主存也被划分为页框(page frames)。内存管理器在加载程序前,需要确定程序的页数及对应的页框。虽然程序仍是一次性加载,但不再需要连续的内存空间。管理器使用页表来跟踪页与页框的映射关系。

  • 请求分页(Demand Paging)
    与分页机制类似,但程序页可以按需加载。这意味着程序无需一次性全部加载到内存中。页表中增加了状态标志(如是否已加载、是否被修改、最近是否使用等),以支持按需加载和页面置换。

  • 分段内存管理(Segmented Memory)
    程序被划分为不同大小的段(segments),每个段代表程序的逻辑结构(如代码段、数据段、堆栈段等)。内存管理器使用段表来管理段的分配和释放。

  • 分段请求分页(Segment Demand Paged)
    将分段与请求分页结合,先将程序分段,再将每个段划分为等大小的页。这样既能保留程序的逻辑结构,又便于内存管理。

⚠️ 使用按需加载机制的方案会频繁地在内存中替换页或段,因此需要引入页面置换策略(Page Replacement Policies)来决定哪些页可以被替换出去。

5. 总结

本文我们探讨了计算机系统中的内存管理机制。从内存管理器的基本职责出发,分析了内存映射方式的演变,最后介绍了从早期到现代的各种内存管理方案。

选择合适的内存映射策略和管理方案,直接影响着系统的性能(如处理器等待内存操作的时间)和内存的使用效率(是否浪费内存)。因此可以说,高效的内存管理是现代计算机系统不可或缺的核心组成部分。


原始标题:Memory Management