虚拟内存实际上是如何增加内存空间的?

Aht*_*hti 73 memory operating-systems virtual-memory

我知道虚拟内存通过显示比实际可用内存更多的内存来愚弄程序。

但最终它必须将逻辑地址映射到实际的物理地址。现在它是如何增加内存的?

Mok*_*bai 117

它根本没有增加物理内存。它的目的完全是另一回事。它可以做的是提供其他后备存储,允许程序使用比物理可用内存更多的内存。

虚拟内存用于将进程彼此分开和隔离,还允许将内存访问转移到其他位置。

虚拟内存允许系统为每个进程提供与其他进程隔离的自己的内存空间。由于程序在它们自己的空间中有效运行,它使它们可以完全访问整个地址空间,而不必绕过其他可能也需要使用“相同”地址的程序。这具有提高可靠性和安全性的副作用,因为进程不容易相互干扰。

应用程序的虚拟内存空间是根据需要构建的。应用程序看起来(对它自己)位于一个连续的内存块中,但实际上可能完全分散在物理内存中。

虚拟内存还允许捕获和转移内存访问,这使我们能够使用交换文件等功能。这意味着我们可以将最近未使用的部分内存推送到磁盘并设置一个指针,表明“该内存块位于文件 x 中的位置 y”,然后我们可以释放物理内存供其他应用程序使用的区域。当应用程序需要该内存时,它可以从磁盘读回,放置在物理 RAM 的某个位置(可能与之前的位置不同)并映射回与以前相同的虚拟内存位置。

与使用页面文件的方式相同,虚拟内存也可以允许操作系统为程序执行有效的共享库“延迟”加载。当主程序告诉操作系统它想使用一个特定的库时,操作系统可以通过检查库的要求来节省时间,为应用程序分配虚拟内存区域中的空间,而不是加载整个库它可以推迟从磁盘加载库的页面,直到实际需要它们。通过这种方式,库中唯一加载到 RAM 的部分是程序实际使用的部分,从未使用过的部分永远不会被加载,因此不会浪费 RAM。

使用这些技术,我们提高了系统的稳定性,并允许更多的进程在有限的空间内运行,而不会相互影响。它不会“增加记忆”,而是让我们更有效地使用我们拥有的东西。

交换文件是由虚拟内存系统启用,但在过去被混淆,虚拟内存。


Dmi*_*yev 21

外行的解释

使用该内存时,系统必须将每个虚拟地址映射到物理地址,但并非所有内存都同时使用。例如,假设您的浏览器中有 20 个选项卡,每个选项卡占用 1GB 内存。在不支持虚拟内存的操作系统中,您需要 20GB 的 RAM 才能工作。诀窍是,您不会同时浏览所有 20 个选项卡,因此具有虚拟内存的操作系统将使您能够像这样使用浏览器,只需几 GB 的 RAM,将不活动的选项卡交换到磁盘。

更复杂的方面

虚拟内存不专门用于交换。它的主要目的实际上是为了避免 RAM 碎片,这在没有虚拟内存管理的系统上是一个大问题:您可能有 1GB 的可用 RAM,但如果它是 10MB 的块,那么请求 100MB 的应用程序将无法工作.

随着时间的推移,虚拟内存发现了更多用途,尤其是随机文件访问:如果被迫顺序读取文件,许多应用程序(如数据库)将变得非常缓慢,如果操作系统允许它们假装整个文件位于(虚拟) 内存并根据访问模式优化磁盘 IO 和缓存。

  • 遗憾的是,我们生活在一个每个浏览器选项卡都需要 1GB 内存的世界中 (9认同)
  • @tbodt 我责怪古埃及人。要是他们知道驯养那些讨厌的猫在做什么就好了! (9认同)
  • @Random832 当然这有点夸张,但我不确定夸张和面向未来之间的界限。我的第一台 PC 有 32 MB 的 RAM,我可以轻松地在 Opera 中打开 8 个选项卡,而不会发生明显的交换。现在它需要500MB,所以再过20年它可能会达到8GB。 (3认同)

小智 6

从实际添加更多主内存硬件的意义上说,虚拟内存不会增加内存。但它可以增加可用地址的范围。因此,可以有一个由代码段和数据(堆栈和堆)段组成的正在运行的程序,并且这两者都可以占用一个虚拟地址范围,该范围比由其物理-真实存储空间提供的物理地址范围更大。机器。诀窍在于,在任何时候,这些虚拟地址中只有一小部分由物理主内存支持 [但一切最终都由磁盘存储支持]。这是因为引用局部性现象: 任何时候都只执行程序段的一个或多个连续小段中的指令,而操作的只是数据段中一个或多个连续小段中的数据[当然行为实际上更复杂,但它确实在很大一部分时间遵循这种模式]