引用centos.org 的部署指南那是,
交换空间在 Linux 中,当物理内存 (RAM) 已满时使用。
然后维基百科还说,
术语“交换”用于描述在 RAM 和磁盘之间移动内存页的行为,以及存储页面的磁盘区域。
那么,为什么在某些情况下,交换空间中的数据比我的物理内存中的数据还多呢?我认为,当系统需要的内存多于物理可用内存时,内核会换出较少使用的页面,并将内存提供给立即需要内存的当前应用程序(进程)。因此,交换空间中存储的数据一定不能大于 RAM。
这就是我来自的地方,请参阅下面提供的屏幕截图。
答案1
您误解了虚拟内存。程序和操作系统始终在虚拟内存中运行。如果您 malloc 10 个字节、1000 万个字节或 100 亿个字节,则您正在分配虚拟内存。您的代码、堆栈空间(自动存储、alloca 等)、全局存储(如果有)也都位于虚拟内存中。如果您获取某个对象的地址,例如&myVariable
,则结果是一个虚拟地址。在虚拟内存操作系统下,您“从不”使用物理内存地址。
操作系统所需的虚拟地址空间加上你正在运行的所有程序的总和将例行公事甚至在当今的系统上,内存使用量也超过了 RAM 的大小。对于单个程序来说,情况也是如此。因此,单个进程的 RAM 使用量 +“交换空间”很容易超过 RAM。
哎呀,虚拟内存的全部意义 - 嗯,其中一个重要意义 - 是允许您编写需要比 RAM 更多的“内存”(无论是用于代码、数据还是其他什么)的代码。
正如其他人在评论中所说,操作系统将决定总虚拟地址空间(用于操作系统 + 所有进程)的哪一部分保存在 RAM 中,哪一部分保存在磁盘上(在“交换”空间中)。如果您引用虚拟地址空间中不在 RAM 中的某个页面(在 x86/x64 系统上通常为 4 KB),则操作系统会为您“将其交换”(我们也说“将其分页”或“将其错误地交换”,因为这是由“页面错误”引起的)。一段时间后,操作系统可能会认为 RAM 不足,并可能从 RAM 中删除一些最旧引用或最不经常引用的内容。如果这些内容自上次放入 RAM 后进行了修改,则必须将修改后的版本保存在磁盘上 - 这就是将内容放入“交换空间”(或用 Windows 术语来说,页面文件)的原因。
顺便说一句,如果虚拟内存内容不在 RAM 中,那么页面文件/交换文件/交换空间远非唯一保存虚拟内存内容的地方。映射文件(通常包括每个代码文件)是另一个地方。代码在 RAM 中时很少被修改,因此通常只会被换入,而不会被换出。如果必须从 RAM 中丢失它,它就会被丢弃,如果再次需要,可以从它最初来自的同一文件换回。