“虚拟内存”和“交换空间”有啥区别?

Posted

技术标签:

【中文标题】“虚拟内存”和“交换空间”有啥区别?【英文标题】:What's the difference between "virtual memory" and "swap space"?“虚拟内存”和“交换空间”有什么区别? 【发布时间】:2011-06-25 14:52:35 【问题描述】:

谁能告诉我虚拟内存交换空间有什么区别?

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

【问题讨论】:

***.com/questions/1688962/… @startblue 你给出的链接如何回答我的问题.. @algo-geeks - 实际上这不是一个答案,但我认为它链接到一个可能对该主题非常有用的答案。并且写在评论中,正是它应该在的地方,恕我直言。 :) 【参考方案1】:

superuser 上对虚拟内存有很好的解释。

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

交换空间是硬盘上虚拟内存的一部分,在 RAM 已满时使用。

至于为什么 32bit CPU 限制为 4gb 虚拟内存,解决的很好here:

根据定义,32 位处理器使用 32位来指代的位置 每个字节的内存。 2^32 = 4.2 十亿,这意味着一个内存地址 那是32位长只能指 42 亿个独特的位置(即 4 GB)。

【讨论】:

那么 actual RAM = virtual - swap 吗? 这个答案是完全错误的。一个人可以内存映射一个 1GB 的文件 100 次,并在一台只有 1GB 内存的机器上使用 100GB 的虚拟内存。无法添加 RAM 和磁盘空间来获得 100GB 的可用虚拟内存。 @DavidSchwartz 不是真的。内存映射文件不会将其加载到内存中。因此,简单地将 1GB 文件映射 100 次将不会使用 100GB 的任何内容。 @Felix 你错了。当您说它“不将其加载到内存中”时,您是在使用“内存”一词来表示物理内存,即RAM。我们谈论的是虚拟内存,而不是物理内存。虚拟内存通常在需要时根据需要创建,而不是像物理内存那样从固定池中获取。 那么这只是一个报告问题?甚至计算映射了多少内存是否有意义?因为你永远不会真正使用那么多,无论是在 RAM 中还是在交换中。【参考方案2】:

关于虚拟内存这个术语有些混淆,它实际上是指以下两个非常不同的概念

    使用磁盘页面来扩展计算机物理内存的概念数量 - 正确的术语实际上是 分页 各种操作系统/CPU 使用的一种抽象,用于创建每个进程在单独的连续地址空间中运行的假象。

交换空间,OTOH,是磁盘部分的名称,用于在不使用时存储额外的 RAM 页面。

一个重要的认识是,由于后者的硬件和操作系统支持,前者是透明的。

为了更好地理解这一切,您应该考虑 CPU 和操作系统如何支持“虚拟内存”(如定义 2)。

假设您有一个 32 位指针(64 位指针类似,但使用的机制略有不同)。一旦启用了“虚拟内存”,处理器就会将此指针视为三个部分。

最高 10 位是页面目录条目 以下 10 位是 页表条目 最后 12 位构成 页面偏移量

现在,当 CPU 试图访问指针的内容时,它首先会查阅 Page Directory 表——一个由 1024 个条目组成的表(在 X86 架构中,它的位置被指向由 CR3 寄存器)。 10 位的Page Directory Entry 是该表中的一个索引,它指向Page Table 的物理位置。这又是另一个包含 1024 个条目的表,每个条目都是物理内存中的一个指针,以及几个重要的控制位。 (我们稍后会回到这些)。找到页面后,最后 12 位用于在该页面中查找地址。

还有许多更多细节(TLB、大页面、PAE、选择器、页面保护),但上面的简短说明抓住了要点。

使用这种转换机制,操作系统可以为每个进程使用一组不同的物理页面,从而给每个进程一个拥有所有内存的错觉(因为每个进程都有自己的页面目录)

在这个虚拟内存之上,操作系统还可以添加分页的概念。前面讨论的控制位之一允许指定条目是否“存在”。如果它不存在,则尝试访问该条目将导致 Page Fault 异常。操作系统可以捕获此异常并采取相应措施。因此,支持交换/分页的操作系统可以决定从 交换空间 加载页面,修复转换表,然后再次发出内存访问。

这是两个术语结合的地方,支持虚拟内存和分页的操作系统可以通过分页(交换)页面进出交换区域,使进程产生比实际内存更多的错觉。

关于您的最后一个问题(为什么说 32 位 CPU 仅限于 4GB 虚拟内存)。这指的是定义 2 的“虚拟内存”,是指针大小的直接结果。如果 CPU 只能使用 32 位指针,那么您只有 32 位来表示不同的地址,这给您 2^32 = 4GB 的可寻址内存。

希望这能让事情更清楚一点。

【讨论】:

【参考方案3】:

恕我直言,使用交换空间的概念等同于虚拟内存是非常误导的。 VM 是一个比交换空间更通用的概念。除其他外,VM 允许进程在执行期间引用虚拟地址,这些虚拟地址在硬件和页表的支持下被转换为物理地址。因此,进程不关心系统有多少物理内存,也不关心指令或数据实际驻留在物理内存层次结构中的什么位置。 VM 允许这种映射。引用的项(指令或数据)可能驻留在 L1、L2 或 RAM 中,或者最终在磁盘上,在这种情况下它被加载到主内存中。

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

请注意,在没有 VM 的系统中可能会有交换空间。也就是说,直接访问物理地址的进程仍然可以在 磁盘。

【讨论】:

【参考方案4】:

虽然线程很老并且已经被回答。仍然想分享这个链接,因为这是迄今为止我找到的最简单的解释。下面的链接有图表以便更好地可视化。

主要区别:虚拟内存是对主内存的抽象。它通过将内容 RAM 的非活动部分存储在磁盘上来扩展计算机的可用内存。每当需要内容时,它就会将其取回 RAM。交换内存或交换空间是用于虚拟内存的硬盘驱动器的一部分。因此,两者也可以互换使用。

虚拟内存与物理内存不同。程序员可以直接访问虚拟内存而不是物理内存。虚拟内存是对主内存的抽象。用于隐藏系统真实物理内存的信息。它通过将 RAM 内容的非活动部分存储在磁盘上来扩展计算机的可用内存。当需要内容时,它会将其取回 RAM。虚拟内存会产生一个地址空间从零开始的错觉。它主要因其优化功能而受到青睐,通过它减少了空间需求。它由可用的 RAM 和磁盘空间组成。

交换内存一般称为交换空间。交换空间是指保留作为临时存储位置的虚拟内存部分。当可用 RAM 无法满足系统内存的要求时,将使用交换空间。例如,在 Linux 内存系统中,内核将每个页面定位在物理内存或交换空间中。内核还维护一个表,其中保存了有关换出页面和物理内存中页面的信息。 长时间未访问的页面被发送到交换空间区域。该过程称为换出。如果需要相同的页面,则通过换出不同的页面将其换入物理内存。因此,可以得出结论,交换内存和虚拟内存是相互关联的,因为交换内存是用于虚拟内存技术的。

difference-between-virtual-memory-and-swap-memory

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 谢谢,改进了帖子。【参考方案5】:

“虚拟内存”是一个通用术语。在 Windows 中,它被称为分页或分页。在 Linux 中,它被称为 Swap。

【讨论】:

以上是关于“虚拟内存”和“交换空间”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

物理内存和虚拟内存

虚拟内存介绍

Linux性能监测:内存篇

在centos系统中增删交换分区

Linux下怎样增加虚拟内存

虚拟内存