操作系统中的交换空间管理

2025年4月29日 | 8 分钟阅读

一台计算机虽然有足够的物理内存,但我们需要更多内存,因此我们大部分时间会将部分内存交换到磁盘上。交换空间是硬盘上用于替代物理内存的空间。它用作虚拟内存,其中包含进程的内存映像。每当我们的计算机物理内存不足时,它就会使用其虚拟内存并将信息存储在磁盘上的内存中。

虚拟内存与实内存之间这种数据交换称为交换,而磁盘上的空间称为交换空间。交换空间有助于计算机的操作系统模拟出比实际拥有的内存更多的 RAM。它也称为交换文件

虚拟内存是 RAM 和磁盘空间的总和,供正在运行的进程使用。交换空间是硬盘上虚拟内存的一部分,当 RAM 已满时使用。交换空间可以以以下几种方式帮助计算机:

  • 它可以作为一个单独的连续内存使用,从而减少读写文件的 I/O 操作。
  • 不常用或很少使用的应用程序可以保存在交换文件中。
  • 拥有足够的交换文件可以帮助系统始终保持一些物理内存空闲。
  • 由于交换空间而释放的物理内存空间可供操作系统用于其他重要任务。

Windows、Linux 等操作系统默认会提供一定量的交换空间,用户可以根据自己的需求进行更改。如果您不想使用虚拟内存,也可以轻松将其完全禁用。但是,如果您内存不足,内核将杀死一些进程以在物理内存中创建足够的空间,因此是否使用交换空间完全取决于用户。

什么是交换空间管理?

交换空间管理是操作系统另一项低级任务。虚拟内存使用磁盘空间作为主内存的扩展。由于磁盘访问比内存访问慢得多,因此使用交换空间会显着降低系统性能。设计和实现交换空间的主要目标是为虚拟内存系统提供最佳吞吐量。

不同的操作系统根据所使用的内存管理算法,以不同的方式使用交换空间。例如,实现交换的系统可能会使用交换空间来容纳整个进程,包括代码和数据段。分页系统可能只会存储已被从主内存中换出的页面。系统所需的交换空间量可能因物理内存量、它所支持的虚拟内存量以及其使用方式而异。它可以从几兆字节的磁盘空间到千兆字节不等。

请注意,高估所需的交换空间量比低估更安全,因为如果系统交换空间不足,可能会被迫中止进程或完全崩溃。高估会浪费可以用于文件的磁盘空间,但不会造成其他任何损害。一些系统建议分配给交换空间的量。例如,Solaris 建议将交换空间设置为虚拟内存超过可分页物理内存的量。以前,Linux 建议将交换空间设置为物理内存量的两倍,尽管现在大多数 Linux 系统使用的交换空间要少得多。目前,Linux 社区中关于是否应该分配交换空间存在很多争论。

包括 Linux 在内的一些操作系统允许使用多个交换空间。这些交换空间通常放在单独的磁盘上,以便分页和交换对 I/O 系统的负载可以分布在系统的 I/O 设备上。

交换空间的使用

不同的操作系统以各种方式使用交换空间。实现交换的系统可能会使用交换空间来容纳整个进程,包括映像、代码和数据段。

  • 交换是一种用于多道程序设计的内存管理技术,以增加共享 CPU 的进程数量。它是一种将进程从主内存中移除、将其存储到辅助内存,然后将其带回主内存以继续执行的技术。将进程从主内存移出到辅助内存的这种操作称为Swap Out。将进程从辅助内存移出到主内存的操作称为Swap In
  • 分页系统可能只会存储已被从主内存中换出的页面。系统对交换空间的需求可能从兆字节到千兆字节不等。不过,这也取决于物理内存量、它所支持的虚拟内存量以及它如何使用虚拟内存。

高估所需的交换空间量比低估更安全,因为如果系统交换空间不足,可能会被迫中止进程或完全崩溃。高估会浪费可以用于文件的磁盘空间,但不会造成其他任何损害。下表显示了不同系统使用交换空间量的情况。

序号System交换空间
1.Solaris交换空间等于物理内存量。
2.Linux交换空间是物理内存量的两倍。

Solaris 将交换空间设置为虚拟内存超过可分页物理内存的量。以前,Linux 建议将交换空间设置为物理内存量的两倍。如今,这一限制已消失,大多数 Linux 系统使用的交换空间要少得多。

包括 Linux 在内的一些操作系统允许使用多个交换空间,包括文件和专用交换分区。交换空间放置在磁盘上,因此分页和交换对 I/O 的负载将分布在系统的带宽上。

交换空间驻留在哪里?

交换空间可以驻留在以下两个位置之一:普通文件系统或单独的磁盘分区。

Swap-Space Management in Operating System

如果交换空间只是文件系统中的一个大文件,则可以使用普通文件系统例程来创建、命名和分配其空间。这种方法虽然易于实现,但效率不高。导航目录结构和磁盘分配数据结构需要额外的磁盘访问。

  • 外部碎片可能通过强制在读写进程映像期间多次寻道来大大增加交换时间。我们可以通过缓存物理内存中的块位置信息以及使用特殊工具为交换文件分配物理上连续的块来提高性能。但是,遍历文件系统数据结构仍然需要成本。
  • 或者,可以在一个单独的原始分区中创建交换空间,因为这个空间中没有文件系统或目录结构。相反,使用一个单独的交换空间管理器来从原始分区分配和释放块。此管理器使用为速度而不是存储效率优化的算法,因为交换空间的访问频率比文件系统高。
  • 内部碎片可能会增加,但这种权衡是可以接受的,因为交换空间中的数据生命周期通常比文件系统中的文件短得多。交换空间在启动时重新初始化,因此任何碎片都是短暂的。此方法在磁盘分区时创建固定量的交换空间。添加更多交换空间需要重新分区磁盘或在其他地方添加另一个交换空间。

有些操作系统很灵活,可以在原始分区和文件系统空间中进行交换,例如 Linux。策略和实现是分开的,允许机器管理员决定使用哪种类型的交换。权衡在于文件系统分配和管理的便利性与原始分区中的交换性能。

交换空间分配

管理设备根据设备的内存大小分配特定量的交换空间,并受可用磁盘空间的限制。

虚拟机所需的交换空间量是其 RAM 大小的两倍。此量提供了足够的空间来存放 RAM 不再需要的数据,并将其放置在交换空间中。此外,还有足够的空间用于 RAM 由于虚拟机监控程序的需求而需要清除的情况。

管理设备不能将数据磁盘的所有空间分配给交换空间,因为数据库需要空间。管理设备在分配交换空间时遵循一组特定条件。这些条件如下:

  1. 最多可以将 25% 的工作区分区分配给交换空间。
  2. 当管理设备增加交换空间大小时,每次增加的交换大小不超过 20%。每次最多增加 20% 使 Informix 和分析能够分配它们在启动过程中所需的磁盘空间。
  3. 您可以通过向管理设备添加新的数据磁盘来分配更多数据磁盘空间。
  4. 您可以通过遵循为设备增加代码磁盘大小的程序来增加代码磁盘的大小。

交换空间管理示例

传统的 UNIX 内核从将整个进程复制到连续磁盘区域和内存的交换开始。随着分页硬件的可用,UNIX 后来发展为交换和分页的结合。

Solaris 1 中,设计者更改了标准的 UNIX 方法以提高效率。

  • 当进程执行时,包含代码的文本段页面会从文件系统中读入,在主内存中访问,并在选择分页时丢弃。
  • 从文件系统中重新读取页面比将其写入交换空间然后再重新读取效率更高。
  • 交换空间仅用作匿名内存页面的后备存储,包括为堆栈、堆和未初始化的进程数据分配的内存。

Solaris 的后续版本进行了更多更改。最大的变化是 Solaris 现在仅在页面被强制从物理内存中换出时才分配交换空间,而不是在首次创建虚拟内存页面时。这种方案在现代计算机上提供了更好的性能,这些计算机比旧系统拥有更多的物理内存。

LinuxSolaris 系统几乎相似。在两个系统中,交换空间仅用于匿名内存或供多个进程共享的内存区域。在 Linux 系统中,可以建立一个或多个交换区域。

Swap-Space Management in Operating System
  • 交换区域可以是常规文件系统上的交换文件,也可以是专用文件分区。
  • 每个交换区域由 4KB 的页面槽组成,用于容纳交换的页面。
  • 与每个交换区域关联的整数计数器数组是与交换区域中的页面槽对应的交换映射
  • 如果计数器的值为 0,则表示相应的页面槽可用。
  • 如果值大于 0,则表示已被交换的页面占用了页面槽。
  • 计数器的值表示对已交换页面的映射数量。例如,值为 3 表示已交换的页面映射到 3 个不同的进程。