既然内核支持分页/虚拟内存,为什么 Linux 还要使用交换分区呢?

既然内核支持分页/虚拟内存,为什么 Linux 还要使用交换分区呢?

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

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

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

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

答案1

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

UNIX 和类 UNIX 系统更喜欢使用交换分区而不是页面文件的原因是,它们可以是连续的,与可能有碎片的页面文件相比,这可以减少寻道时间。

答案2

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

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

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

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

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

答案3

虚拟内存/分页功能允许内核将内存“虚拟化”到用户空间进程。内核可以从物理内存中取出页面,并通过分页排列它们,使它们对用户空间进程来说看起来是连续的。

可以对用户空间进程的内存设置限制,如果进程超出该限制,就会发生“页面错误”,从而导致 CPU 异常并反弹回内核。这可以防止用户空间程序在未经内核许可的情况下干扰分配给内核或其他程序的内存。

malloc()通常,用户空间程序要求内核通过定义良好的接口(例如由 C 函数调用)扩展此限制free()。内核负责跟踪程序分配了多少内存以及分配了哪些内存。

如果内核能够过度配置内存(Windows 和 Linux 都支持此功能),此“页面错误”机制还可以让内核将进程尝试访问的页面与磁盘中的页面进行交换,这就是它被称为交换的原因。如果内存访问确实无效(即进程试图访问它最初没有请求的内存),则通常会使用 SIGSEGV 终止该进程。

因此,“交换”是一个附加功能(在 Linux 中,如果您愿意,实际上可以完全禁用它),它依赖于虚拟内存/分页,但并不是因为 CPU 具有虚拟内存/分页而必需的。概念并不相同,但交换依赖于分页/虚拟内存才能存在。


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

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

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

答案4

一般来说,交换分区不等于虚拟内存。

进程可能需要比实际物理内存更多的内存,因此操作系统开发人员决定假设系统中有更多的内存,称为“虚拟内存”。

这个虚拟内存基本上就是物理内存和磁盘的一部分。Linux 中将磁盘的这一部分称为“交换”。

开发人员还建议,虚拟内存中位于硬盘上的部分的使用率必须尽可能低。为此,所有虚拟内存都被分成小部分,称为“页面”。许多页面的使用率很低,这些页面必须写入硬盘上的虚拟内存部分。此操作称为“换出”。操作系统必须跟踪哪些页面不在物理内存中,以便在需要时找到它们。当程序想要写入/读取被换出的内存部分时,就会发生页面错误。

回答您的问题:Linux 需要一个交换分区来换出一些内存页面,您可以使用以下命令查看虚拟内存使用情况的统计信息vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

“交换”列显示交换出和交换入的统计数据。此外此链接解释虚拟内存及其使用情况vmstat

相关内容