虚拟内存和交换空间有什么区别?

91

请问有没有人能够向我解释一下虚拟内存交换空间的区别?

为什么我们说对于32位机器,最大可访问的虚拟内存只有4GB?


1
https://dev59.com/SHI-5IYBdhLWcg3wwbZL#1689119 - starblue
@startblue,你提供的链接如何回答我的问题? - algo-geeks
1
@algo-geeks - 确实这不是一个答案,但我认为它链接到一个可能对这个主题非常有用的答案。而且它是在评论中写的,恰好应该在那里,我个人认为。 :) - Muhamed Huseinbašić
5个回答

122

superuser上有一篇关于虚拟内存的详细解释。

简单来说,虚拟内存是运行进程可以使用的RAM和磁盘空间的结合。

交换空间是虚拟内存中位于硬盘上的部分,当RAM已满时会被使用。

至于为什么32位CPU限制为4GB虚拟内存,这里有很好的解释:

按定义,32位处理器使用32位来引用每个字节的内存位置。2^32=42亿,这意味着32位长的内存地址只能引用42亿个唯一位置(即4GB)。


3
实际内存等于虚拟内存减去交换空间吗? - user48956
7
这个答案完全错误。一个人可以将一个1GB的文件映射到内存中100次,在只有1GB RAM的机器上使用100GB虚拟内存。无法通过增加RAM和磁盘空间来获得正在使用的100GB虚拟内存。 - David Schwartz
1
@Felix,你错了。当你说它“不会将其加载到内存中”时,你使用的是“内存”这个词来表示物理内存,也就是RAM。我们正在谈论虚拟内存,而不是物理内存。虚拟内存通常在需要时创建,而不像物理内存一样从固定池中获取。 - David Schwartz
@Felix 看起来Linux top命令将mmap包含在虚拟内存中。 - jinawee
我非常认同@DavidSchwartz的观点,特别是在我们生活的“容器世界”中。只需使用-m 100m命令在Java Docker镜像中运行“sh”,然后检查swapon(通常为1GB),现在用java -Xmx10g -Xms10g HelloWorld运行一个非常简单的HelloWorld.java程序。它的交换空间是1GB + 100MB = 10GB吗?当然不是! - Eugene
显示剩余2条评论

67
关于虚拟内存这个术语存在一些混淆,实际上它指的是以下两个非常不同的概念:
1. 使用磁盘页面来扩展计算机具有的概念上的物理内存量 - 正确的术语实际上是“分页”。 2. 各种操作系统/ CPU使用的抽象概念,用于创建每个进程在单独的连续地址空间中运行的幻觉。
另一方面,交换空间是用于在未使用时存储额外RAM页面的磁盘部分的名称。
一个重要的认识是,前者由于后者的硬件和操作系统支持而自动实现。
为了更好地理解所有这些,您应该考虑CPU和操作系统如何支持“虚拟内存”(如定义2所述)。
假设您有一个32位指针(64位指针类似,但使用稍微不同的机制)。启用“虚拟内存”后,处理器将此指针视为由三部分组成。
- 最高的10位是页目录项 - 接下来的10位是页表项 - 最后12位构成页偏移 现在,当CPU尝试访问指针的内容时,它首先查询页目录表 - 一个由1024个条目组成的表(在X86体系结构中,其位置由CR3寄存器指向)。 10位页目录项是此表中的索引,它指向页表的物理位置。这又是另一个表格,每个表格都是指向物理内存的指针和几个重要的控制位。 (我们稍后再回到这些)。找到页面后,最后12位用于在该页面中查找地址。
还有更多细节(TLB、大页面、PAE、选择器、页面保护),但上面的简短解释捕捉了事情的要点。
使用此翻译机制,操作系统可以为每个进程使用不同的物理页面集,从而使每个进程产生拥有所有内存的幻觉(因为每个进程都有自己的页目录)。
在这个虚拟内存之上,操作系统还可以添加分页的概念。前面讨论过的一个控制位允许指定一个条目是否“存在”。如果不存在,则尝试访问该条目将导致页面错误异常。操作系统可以捕获此异常并采取相应措施。支持交换/分页的操作系统因此可以决定从交换空间加载页面,修复翻译表,然后再次发出内存访问。
这里涉及到两个术语的结合,支持虚拟内存和分页的操作系统可以通过将页面(交换)进出交换区来使进程产生比实际存在更多内存的幻觉。
至于你最后一个问题(为什么说32位CPU的虚拟内存受限于4GB),这指的是定义2中的“虚拟内存”,是指针大小的直接结果。如果CPU只能使用32位指针,则只有32位可以用于表示不同的地址,这给您可寻址内存量提供了2 ^ 32 = 4GB。
希望这让事情变得更加清晰。

15

我的看法是把交换空间的概念当做虚拟内存等同于非常具有误导性的。虚拟内存是一个比交换空间更为普遍的概念。在其他方面中,虚拟内存允许进程在执行期间引用虚拟地址,这些地址通过硬件和页表的支持被转换成物理地址。因此,进程不必关心系统有多少物理内存,或指令或数据实际上驻留在物理内存层次结构的哪里。虚拟内存允许进行这种映射。所引用的项(指令或数据)可能驻留在L1、L2、RAM或最终的磁盘中,在这种情况下,它将被加载到主内存中。

交换空间只是二级存储器上的一个位置,用于存储页面处于非活动状态时。如果没有足够的RAM,操作系统可能会决定将进程的页面换出,以腾出其他进程页面的空间。处理器从来不会直接从交换空间中执行指令或读写数据。

请注意,在没有虚拟内存的系统中也可以有交换空间。也就是说,直接访问物理地址的进程仍然可以在磁盘上有一部分。


6
尽管这个帖子很旧,并且已经有了答案。我仍然想分享这个链接,因为这是我迄今为止找到的最简单的解释。下面的链接有更好的可视化图表。
区别:虚拟内存是主存的抽象,通过将内容RAM的非活动部分存储到磁盘上来扩展计算机的可用内存。每当需要该内容时,它会将其取回到RAM中。交换内存或交换空间是硬盘驱动器的一部分,用于虚拟内存。因此,两者也可以互换使用。
虚拟内存与物理内存有很大不同。程序员可以直接访问虚拟内存而不是物理内存。虚拟内存是主存的抽象,用于隐藏系统真实物理内存的信息。通过将RAM内容的非活动部分存储到磁盘上,它扩展了计算机的可用内存。在需要该内容时,它会将其取回到RAM中。虚拟内存创建了一个以零开头的地址空间的幻觉。它主要因其优化功能而受欢迎,通过减少空间需求来实现。它由可用的RAM和磁盘空间组成。
交换内存通常称为交换空间。交换空间指作为临时存储位置保留的虚拟内存部分。当可用RAM无法满足系统内存需求时,会利用交换空间。例如,在Linux内存系统中,内核将每个页面定位在物理内存或交换空间中。内核还维护一个表,其中包含有关已交换出的页面和物理内存中的页面的信息。
长时间未访问的页面被发送到交换空间区域。该过程称为交换出。如果需要相同的页面,则通过交换不同的页面将其交换到物理内存中。因此,可以得出结论,交换内存和虚拟内存是相互关联的,因为交换内存用于虚拟内存技术。

虚拟内存和交换内存之间的区别


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - coatless
谢谢,已经改进了帖子。 - ram619

-1
“虚拟内存”是一个通用术语。在 Windows 中,它被称为分页或页面文件。在 Linux 中,它被称为交换空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接