当内核无论如何都支持分页/虚拟内存时,为什么 Linux 使用交换分区?

Joh*_*mBF 23 memory linux operating-systems virtual-memory paging

据我了解分页和交换,它们是完全不同的概念。而交换意味着,一个进程要么完全在物理内存中,要么在硬盘驱动器上,进程的分页部分可以在物理内存中,其他部分可以在硬盘驱动器上。

但是为什么 linux 需要一个交换分区呢?如果物理内存满了,一些进程会外包给硬盘,新的进程会从虚拟内存映射到物理内存。

我只是不明白为什么需要一个交换分区(或一般的交换)呢?

或者这只是一个术语问题swap partition == virtual memory

小智 25

是的,这只是一个术语问题,在许多情况下,交换分区用作虚拟内存。

UNIX 和类 UNIX 系统更喜欢交换分区而不是页面文件的原因是它们可以是连续的,与可能碎片化的页面文件相比,这导致查找时间较短。

  • 最早的 UNIX 仅具有交换功能,没有分页功能,并且只能交换到专用分区。分页在硬件支持后立即实施,但名称“交换分区”卡住了。对文件进行分页是更新的,并且具有更高的操作系统开销以及碎片化的风险,因此仍然不鼓励这样做。 (13认同)
  • 这样,在 Linux 安装之间共享单个交换分区也更容易。 (6认同)
  • 通常一个页面文件是在第一次启动时完全创建的,所以它不会被碎片化(嗯……还有一些可能性……) (4认同)

Gil*_*il' 14

我不知道你从哪里得到“交换意味着,一个进程要么完全在物理内存中,要么在硬盘驱动器上”的概念。这个意思已经有几十年没有使用了。引用维基百科

从历史上看,交换是指在称为滚入/滚出的方案中一次从/向二级存储移动整个程序。在 1960 年代,在引入虚拟内存的概念后(以两种变体形式,使用段或页),术语交换分别用于在磁盘和内存之间移动段或页。今天,虚拟内存主要基于页面,而不是段,交换成为分页的一个相当接近的同义词,尽管有一个区别。 [可疑 - 讨论]

事实上,在任何涉及 Linux(或其他 unix 系统)的上下文中,分页交换几乎是同义词。两者都是指使用虚拟内存,其中页面的数据可以存储在 RAM 中或磁盘上。(在您可能会遇到的任何设备上,页面都是 4kB。)使用内存页面的程序并不关心甚至不知道数据存储在哪里,它只是继续使用虚拟地址。内核在 RAM 和磁盘之间传输数据并更新MMU表,这样虚拟地址的条目要么指向内存中的物理页,要么包含一个特殊值,使处理器执行某些内核代码这将从磁盘加载适当的数据。

分页指的是这个通用过程。交换是指磁盘上的数据位于专用区域中的情况:交换区(交换分区或交换文件)。分页也可以在 RAM 和文件之间完成,在这种情况下,它通常不称为交换。例如,当你执行一个程序时,代码必须被加载到内存中才能被执行;如果代码页需要从 RAM 中清除以腾出空间用于其他内容,则无需将此页写入交换区,因为它可以从程序文件中加载回来。(这可以用于所有只读数据,而不仅仅是程序代码。)

如果物理内存(几乎)已满,内核会在 RAM(不是整个进程)中查找最近未使用的页面。如果该页面再现了磁盘文件的内容(内核中有一些表格可以表明这一点),则可以回收该页面。如果不是,则将页面写出以进行交换,然后回收。无论哪种方式,内核都会更新进程的虚拟内存表(在进程执行时它变成 MMU 表)中的条目以将其标记为不在 RAM 中,然后可以将物理页重用于其他内容(不同的程序,或同一个程序)。


Law*_*ceC 9

虚拟内存/分页工具让内核将内存“虚拟化”给用户空间进程。内核可以从物理内存中获取页面,并通过分页排列它们,使它们对用户空间进程看起来是连续的。

可以对用户空间进程的内存设置限制,如果进程超出它,则会发生“页面错误”,这会导致 CPU 异常返回内核。这可以防止用户空间程序在未经内核许可的情况下弄乱分配给内核或其他程序的内存。

典型地,用户空间程序请求内核延伸通过明确定义的接口该极限(由C函数调用malloc()free()例如)。内核负责跟踪程序分配了多少内存。

这种“页面错误”机制还可以让内核交换进程试图访问的页面与磁盘中的页面,如果内核能够过度配置内存(Windows 和 Linux 都支持这一点),因此它被称为交换。如果内存访问确实无效(即进程试图访问它没有首先请求的内存),那么通常该进程将被 SIGSEGV 杀死。

因此,“交换”是一个附加功能(在 Linux 中,您实际上可以根据需要完全禁用它),它取决于虚拟内存/分页,但并非仅仅因为 CPU 具有虚拟内存/分页就需要。概念不一样,但交换取决于分页/虚拟内存的存在。


此外,在更仔细地阅读您的问题之后,“分页”有时用作“交换”的同义词-但我从未听说过“交换”意味着整个过程的内存被换出与“分页”仅表示部分它被换掉了。

但是为什么 linux 需要一个交换分区呢?如果物理内存满了,一些进程会外包给硬盘,新的进程会从虚拟内存映射到物理内存。

“虚拟内存”物理内存,只是“重新映射”。MMU 硬件不能直接映射到任何存储设备。MMU 可以抛出一个错误,告诉内核一个进程试图访问它不应该访问的内存 - 内核可以使用这种机制来查看一个进程想要从磁盘取回它认为在内存中的东西,然后执行“交换”。关键是操作系统决定将页面保存到磁盘,以便它可以将这些页面用于其他进程,而不是硬件。