什么是虚拟内存?


27

我仔细检查了有关“虚拟内存”的注释,教科书中的定义是:

分配一部分二级存储以充当主内存的一部分的过程

凡为维基百科说:

虚拟内存是一种计算机系统技术,可以使应用程序拥有连续的工作内存(地址空间)的印象。

和(维基百科也说)

请注意,“虚拟内存”不仅仅是“使用磁盘空间扩展物理内存大小”

谁能提供关于哪个正确的任何澄清?


我相信Wikipedia的注释包含一些有关连续事物使用的限定条件。
JB金王

这个问题可能会在SO上得到更好的答案。
Segfault上尉于2009年

2
不要将虚拟内存与使用方式混淆。Wikipedia的第一句话定义了它的含义。您的书正在谈论它的通常用法。人们谈论“页面”时,他们是在谈论虚拟内存的特定实现。
Tony Lee,

2
您的教科书完全是错误的。有许多机器具有虚拟内存,根本没有辅助存储。同样,曾经有很多机器可以将辅助存储用作主内存的一部分,但不支持虚拟内存。“虚拟内存”不是内存,而是像内存一样被访问。您的教科书正在定义交换或分页。
David Schwartz

1
教科书完全错误地定义了它,辅助存储不是定义的一部分。甚至Wikipedia关于“磁盘空间以外”的声明也具有误导性,因为它可能根本不涉及磁盘-听起来好像是“将内存扩展到磁盘”以及其他内容。
开尔文2012年

Answers:


41
Note that "virtual memory" is more than just "using disk space to extend physical memory size"

虚拟内存是提供给每个进程的抽象层。例如,计算机具有2GB的物理RAM,地址从0到2G。一个进程可能会看到一个4GB的地址空间,它完全拥有它自己的空间。从虚拟地址到物理地址的映射由内存管理单元处理,该内存管理单元由操作系统管理。通常,这是在4KB“页面”中完成的。

这提供了几个功能:

  1. 一个进程看不到其他进程中的内存(除非操作系统希望这样做!)
  2. 给定虚拟地址上的内存可能不在同一物理地址上
  3. 可以将虚拟地址处的内存“分页”到磁盘,然后在再次访问时“分页”。

您的教科书将虚拟内存(错误地)定义为#3。

即使不进行任何交换,如果为执行DMA(直接内存访问)的设备编写设备驱动程序,则特别需要注意虚拟内存。您的驱动程序代码在CPU上运行,这意味着其内存访问是通过MMU(虚拟)进行的。该设备可能通过MMU,因此可以看到原始物理地址。因此,作为驱动程序编写者,您需要确保:

  1. 您传递给硬件的任何原始内存地址都是物理的,而不是虚拟的。
  2. 您发送的任何大(多页)内存块在物理上都是连续的。8K阵列实际上可能是连续的(通过MMU),但是有两个物理上分开的页面。如果您告诉设备将8K数据写入与该阵列起始位置相对应的物理地址,它将在您期望的位置写入第一个4K,但是第二个4K将破坏某些地方的内存。:-(

4

我会尝试慢慢开始,然后为您整合所有内容。就像这样:

通常使用的虚拟内存是指“分页”。顾名思义,分页就像人类的记事本。

当您计算简单的总和或学习简单的信息时,您就可以轻松完成所有事情:您只需加载所有信息,对其进行处理并获得答案。这就像计算机从硬盘驱动器加载文件一样,它会将需要处理的程序或图片或其他信息加载到其“真实内存”(或“物理内存”)中,并使用其“大脑”(它的处理器)。

但是,当您学习复杂的信息或处理复杂的金额时,可能无法一次将所有内容放到脑海中。您会感到困惑,开始放慢脚步,无法一次全部收拾其中,而不得不忘记一些东西以记住其他东西。

人类的解决方案是使用记事本。我们在页面上记下了我们一次不记得的所有事情,但是在进行总结时请参考它们。我们可能无法记住一个月的销售数字,但是我们可以查看页面,一次获取一点信息,然后逐一处理。这就像计算机在“分页”其内存时一样-写满信息的页面,然后将其放入“虚拟内存”以供以后参考,并意识到它需要一个页面,然后将该页面从虚拟内存加载回真实内存。在Linux和UNIX上,这些页的存储位置从字面上称为“ pagefile”,而内存中的数据页从字面上称为“ pages”。对于这些事物,不同的系统使用不同的名称,但是总体概念几乎相同。

所以说真的,分页非常简单。所有信息页面都无法容纳在内存中,因此某些页面被放置在磁盘上,并在以后再次加载。

现在,更为复杂的是,现代系统具有内存映射和内存保护功能,通常都由计算机中的同一硬件系统(内存管理单元或MMU)来处理。

在(现代)多任务计算机中,该计算机可以一次运行多个程序,并具有内存保护功能,每个程序通常与同一系统上运行的其他程序分开。这样,一个程序不能仅通过访问其内存来更改另一个程序-MMU在物理上将一个程序的地址空间与其他程序分开。换句话说,用户程序看不到其他用户程序,甚至看不到其他程序。他们看不到“真实内存”,而是看到了自己的“虚拟内存”。

现在,此内存隔离概念和页面文件概念是两个概念上不同的事物,这可能就是您感到困惑的原因。但是,关键是它们都使用MMU进行工作-内存管理单元,它将内存分成页面,并将页面映射到虚拟地址空间。

因此,当程序在某个“内存地址”处请求内存时,真正发生的是查找该程序的内存页面及其对应的地址(程序的“地址空间”),并找到与之对应的页面。找到该内存块。该页面可以加载到实际内存中的某个位置(在这种情况下,可以访问该程序),也可以将其分页到磁盘。如果将其分页,则会触发“页面错误”-访问磁盘,并将页面加载到内存中。因此,即使没有足够的内存,该程序也可以运行,但是如果必须使用磁盘进行通常非常快速的内存访问,则该程序运行缓慢。

现在,如果没有足够的空间将该页面加载到内存中,那么您将遇到问题。在这种情况下,必须将某些已经在内存中的OTHER页面“交换”到磁盘上,以便可以加载第一个程序的页面。或者,它们可能同样是同一程序的页面。您有时会在图形程序中看到这种情况,例如在负载较重的系统上,当图片的一部分缓慢加载并快速绘制时,下一部分同样缓慢加载并快速绘制,而当您回到第一个工作时部分,再慢一点。这是因为要先加载它们再进行处理,然后再换出,以便可以进行其他处理。显然,这是一种非常缓慢的工作方式,而您真正需要的是更多的真实内存。


我100%不同意这个答案。如果“虚拟内存”指的是分页,则不分页的系统(例如,未启用交换或分页文件的系统)将不支持虚拟内存。但这显然是疯了。
大卫·史瓦兹

@DavidSchwartz-最初我的反应与您相似,但是在详细阅读答案时,我认为它没有那么糟糕。考虑一下Wikipedia /虚拟内存/ Paged所说的“几乎所有的虚拟内存实现都将虚拟地址空间划分为页面,连续的虚拟内存地址块”。也就是说,“寻呼”,在广义上,它要求页文件,而是指虚拟地址映射为物理地址。
ToolmakerSteve

1
嗯,另一方面,Lee说:“所有信息页面都无法容纳在内存中,因此某些页面被放置在磁盘上,以后再加载。”因此,大卫是对的:这个答案忽略了一个基本事实,即分页不只是分页到磁盘。从好的方面来说,Lee确实还提到了虚拟内存的其他好处(内存隔离)。如果将此答案改写为不将“虚拟内存的映射页”与“分页到磁盘”混为一谈,则将更加有用。
ToolmakerSteve

@ToolmakerSteve问题是这是一个非常普遍的误解,而任何导致这种误解加剧的问题,IMO,都是一件坏事。当此答案试图在一个非常简单的问题上解释非常基本的概念时,这尤其糟糕—最重要的是不要基于常见的误解为基础打下基础!
David Schwartz

@DavidSchwartz-我同意。没错,他没有定义“虚拟内存”,而是正在定义“页面文件的工作方式”。一开始我还以为问题仅仅是,李失败“的内存分页=映射页从虚拟到物理”与“页面文件=映射页到磁盘”进行区分,但是重新阅读后,他真的是说关于映射到磁盘。(正如我们所看到的那样,从教科书的报价中,从除船长的所有其他答案中,以及从谷歌搜索中,这两个概念的这种混合非常普遍。我确信我对此感到内gui。)
史蒂夫·史蒂夫(Steve)

0

我知道为时已晚....但认为仍然有用。

  • 基于不同的观点,一切都是正确的。
  • 虚拟内存是一种内存管理技术,而交换内存是磁盘驱动器上的区域。交换内存通常称为交换空间。交换空间是指虚拟内存中保留为临时存储位置的部分。当可用RAM无法满足系统内存要求时,将使用交换空间
  • 您可以参考以下链接了解更多详细信息

-2

好吧,如果我们理解虚拟这个词,我想我们可以理解它与内存的关系。

在Dictionary.com上定义的“虚拟”:“由计算机软件临时模拟或扩展的:RAM中的虚拟磁盘;硬盘上的虚拟内存”。

对于虚拟内存,系统正在使用较慢的内存资源(例如,硬盘驱动器,拇指驱动器等)来模拟系统内存。当需要附加内存时,系统将交换系统内存中不需要的数据您已设置的驱动器或资源。这样可以释放系统内存,以便您的应用程序可以继续执行其正在执行的任务。

交换是一个连续的过程,因此,如果升级内存,则应该会看到性能上的提高,因为系统不需要将内存减慢即可。


-2

虚拟内存是操作系统(OS)的一项功能,该功能允许计算机通过将数据页从随机访问内存(RAM)临时传输到磁盘存储中来弥补物理内存的不足。

这意味着它就像虚拟机或虚拟盒子中用来在不格式化计算机的情况下尝试操作系统的镜像或示例内存。


不,那是传呼。
David Schwartz 2015年

-4

虚拟内存是硬盘驱动器的一部分,除了物理RAM外,系统还用作系统的页面文件。

由于Windows不会对硬盘驱动器的这一部分进行碎片整理,因此它变得棘手,有时甚至很慢。

我可以提供的2条最佳技巧:1)Virt Mem的最小值和最大值应设置为物理内存的1.5倍左右。例如 2GB内存= 3070MB Virt。2)进行碎片整理时,请关闭分页文件。对2倍进行碎片整理,然后重置为原始编号。这样可以提供清晰的驱动器,并提高分页文件的速度。


1
这不是完全正确的-现代内存管理器可以虚拟化所有系统内存。这就是允许进程分离的原因-每个进程只能触摸自己的内存。内存管理器负责将这些虚拟页面映射到实际存储,并可选地映射到固定磁盘。
Anthony Giorgio

1
“ Windows不会对硬盘驱动器的这一部分进行碎片整理。” 只需简单地核对pagefile.sys,重新启动,对磁盘进行碎片整理并重新启用分页,打开新的,连续的分页文件!但是,Sysinternals的PageDefrag可以做得更好,因为它还将页面文件放在驱动器/分区的开头,以提高性能。

1
如果此答案正确,则没有配置页面文件的Windows系统将无法提供任何虚拟内存支持。但这显然是错误的。这样的系统仍然可以,例如,将文件映射到超过物理RAM的进程地址空间,这是虚拟内存的一个示例。
大卫·史瓦兹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.