据我了解分页和交换,它们是完全不同的概念。交换意味着进程要么完全在物理内存中,要么在硬盘上,进程的分页部分可以在物理内存中,而其他部分可以在硬盘上。
但是,为什么Linux需要交换分区呢?如果物理内存已满,则某些进程将外包给硬盘驱动器,并且新进程将从虚拟内存映射到物理内存。
我只是不明白为什么需要一个交换分区(或一般交换)?
还是这仅仅是术语问题swap partition == virtual memory
?
据我了解分页和交换,它们是完全不同的概念。交换意味着进程要么完全在物理内存中,要么在硬盘上,进程的分页部分可以在物理内存中,而其他部分可以在硬盘上。
但是,为什么Linux需要交换分区呢?如果物理内存已满,则某些进程将外包给硬盘驱动器,并且新进程将从虚拟内存映射到物理内存。
我只是不明白为什么需要一个交换分区(或一般交换)?
还是这仅仅是术语问题swap partition == virtual memory
?
Answers:
是的,这只是术语问题,在许多情况下,交换分区用作虚拟内存。
UNIX和类似UNIX的系统更喜欢交换分区而不是页面文件的原因是它们可以是连续的,与可以分段的页面文件相比,它们可以缩短查找时间。
我不知道您的想法是“交换意味着,一个进程完全在物理内存中还是在硬盘驱动器中”。几十年来一直没有使用该含义。引用维基百科:
从历史上看,交换是指一种称为转入/转出的方案,一次将整个程序从辅助存储中移入或移出。在1960年代,在引入虚拟内存的概念(使用段或页的两种变体)之后,术语交换被用于分别在磁盘和内存之间移动段或页。如今,由于虚拟内存主要基于页面而不是段,因此交换已成为页面调度的相当近似的同义词,尽管有一个区别。
实际上,在涉及Linux(或其他UNIX系统)的任何上下文中,分页和交换都是同义词。两者都涉及对虚拟内存的使用,其中页面数据可以存储在RAM或磁盘上。(在您可能会遇到的任何设备上,一个页面的大小为4kB。)使用内存页面的程序不在乎甚至不知道数据的存储位置,它只是在使用虚拟地址。内核在RAM和磁盘之间传输数据并更新MMU表,以使虚拟地址条目指向内存中的物理页面,或者包含使处理器执行某些内核代码的特殊值。这将从磁盘加载适当的数据。
分页是指此通用过程。交换是指磁盘上数据位于专用区域中的情况:交换区域(交换分区或交换文件)。也可以在RAM和文件之间进行分页,在这种情况下,通常不将其称为swapping。例如,当您执行一个程序时,必须将代码加载到内存中才能执行。如果需要将代码页从RAM中逐出以腾出空间来容纳其他内容,则无需将该页写到交换区域中,因为可以从程序文件中将其加载回去。(这可以针对所有只读数据,而不仅仅是程序代码。)
如果物理内存(几乎)已满,则内核会在RAM中查找最近未使用过的页面(不是整个进程)。如果该页面复制了磁盘文件的内容(内核中有表表明这一点),则可以回收该页面。如果不是,则将该页面写出以便交换,然后回收。内核通过两种方式更新进程的虚拟内存表(在进程执行时变为MMU表)中的条目,以将其标记为不在RAM中,然后可以将物理页重用于其他内容(不同的程序或内存的另一页)。相同的程序)。
虚拟内存/分页功能使内核可以“虚拟化”用户空间进程的内存。内核可以从物理内存中获取页面,并通过分页来安排它们,以便它们看起来与用户空间进程相邻。
可以在用户空间进程的内存上设置限制,如果进程超出该限制,则会发生“页面错误”,这将导致CPU异常并弹回内核。这样可以防止用户空间程序在未经内核许可的情况下弄乱分配给内核或其他程序的内存。
典型地,用户空间程序请求内核延伸通过明确定义的接口该极限(由C函数调用malloc()
和free()
例如)。内核负责跟踪程序分配了多少内存。
如果内核能够过多地提供内存(并且Windows和Linux都支持),那么这种“页面错误”机制还可以让内核交换该进程正尝试从磁盘访问的页面,因此将其称为交换。如果内存访问确实是无效的(即进程正在尝试访问它不首先请求的内存),则通常该进程将被SIGSEGV杀死。
因此,“交换”是一项附加功能(在Linux中,您可以根据需要完全禁用它)取决于虚拟内存/分页,但并不是仅因为CPU具有虚拟内存/分页才需要。概念不同,但是交换取决于是否存在分页/虚拟内存。
另外,在更仔细地阅读了您的问题之后,有时将“分页”用作“交换”的同义词-但我从未听说过“交换”,这意味着整个过程的内存都被交换掉了,而“分页”则只是其中的一部分它被换出。
但是,为什么Linux需要交换分区呢?如果物理内存已满,则某些进程将外包给硬盘驱动器,并且新进程将从虚拟内存映射到物理内存。
“虚拟内存” 是物理内存,只是“重新映射”。MMU硬件无法直接映射到任何存储设备。MMU可能会引发错误,告诉内核进程试图访问它不应该访问的内存-内核可以使用这种机制来查看进程是否希望从磁盘中返回一些它认为在内存中的东西,然后执行“交换”。关键是操作系统决定将页面保存到磁盘,以便可以将这些页面用于其他进程,而不是硬件。
通常,交换分区不等于虚拟内存。
进程可能需要比实际物理内存更多的内存,因此OS开发人员决定假定系统中有更多的内存,称为“虚拟内存”。
该虚拟内存基本上是物理内存,是磁盘的一部分。磁盘的这一部分在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
。