物理内存与虚拟内存

时间:2013-10-08 17:42:47

标签: windows memory internals

我知道当创建新进程时,会有一个与该进程关联的虚拟地址空间。虚拟地址空间位于虚拟内存页面中,并映射到非物理内存中的内存页面连续的方式。

我的问题是:

当一个线程存储一个值或为变量分配空间时,它将被存储/分配在虚拟内存中,但这些更改是否同时写入物理内存?

2 个答案:

答案 0 :(得分:3)

简而言之,是的。

为了能够读取或写入内存,虚拟地址必须映射到物理内存。因此,对您的变量的写入将始终由物理内存支持(由于缓存可能会有延迟,但这与物理与虚拟无关)。如果在执行写操作时当前未映射内存,则会发生页面错误,这将允许操作系统介入并映射物理内存。

如果需要映射内存,它可以来自“待机”列表,这意味着内存已经在物理内存中,而操作系统只需将其连接起来(soft fault)。或者它可能必须从磁盘读取内存(又名hard fault);它可以来自页面文件,内存映射文件或二进制文件的内容。


编辑 - 对内存列表和页面错误的澄清:

零列表 这些是物理内存页面,它们是免费的并且已经被清零。当应用程序分配更多内存时,操作系统首先从此内存池(如果可用)中提取。将这些映射到进程的地址空间是一个软故障。

免费列表 这些是物理内存页面,操作系统正在进行清理,并且即将进入零列表。

待机列表 Windows会定期从虚拟内存中取消映射内存,因为其他人可能需要更多内存。相反,如果零列表中有大量内存,它将找到应用程序可能需要的内存页面并将其预加载到内存中。所有这些页面都存储在Standby列表中。如果存在突然需要更多内存的应用程序,则它们不会分配给任何一个应用程序,并且可能会被清除和重新分配。

运行perfmon.exe /res并点击“内存”标签,查看与各种列表相关联的内容。您经常会发现Windows喜欢在待机列表中保留相当数量的内存。

软错误 如果您的应用程序分配内存或读取或写入操作系统窃取或预加载(并放置在备用列表中)的内存,那么操作系统分配回您的进程是一件非常简单的事情。软故障很便宜。

硬错误 如果您需要的内存不在物理内存中的任何位置,则会遇到硬故障,并且操作系统需要从某种类型的存储设备“页面”输入。这通常很慢,是开发人员在进行性能调整时可能会关注的问题。

回答你的评论 分配内存通常会导致软故障,因为操作系统从零列表中拉出,然后从待机列表中窃取以完成请求。没有任何东西需要从任何物理媒体读取,因此,没有遇到任何硬故障。

一旦分配了内存,操作系统可能会稍后将该内存推送到待机列表。如果再次引用它,则会出现软故障,将其重新放回地址空间。如果其他人需要内存,则操作系统可以将该内存刷新到页面文件(写出数据不是“错误”)。然后再次引用该内存地址后,就会发生硬故障并读取页面并将其映射回您的地址空间。

答案 1 :(得分:2)

没有与物理内存分开的虚拟内存。对内存的所有读写都必须转到物理内存。

以下是虚拟内存通常在硬件中的工作方式:

  • 当执行加载或存储指令时,处理器首先计算虚拟存储器地址空间中的地址。 (这通常涉及将处理器寄存器的内容和/或编码到指令本身中的值加在一起。)
  • 然后处理器在其拥有的表中查找虚拟地址。这些表描述了从虚拟内存到物理内存的转换。
  • 如果处理器找到虚拟地址的匹配项,它将使用匹配表条目中的数据将虚拟地址更改为物理地址。 (通常,虚拟地址的高位是表的关键,低位是页面内的偏移。为了形成物理地址,从表项中获取新的高位,并使用相同的低位。)
  • 然后处理器使用计算出的物理地址执行加载或存储操作。

如果在处理器具有特殊寄存器的表中找不到虚拟地址,则可能会发生以下几种情况之一:

  • 某些处理器模型会搜索内存中的特殊表(由操作系统创建和维护),以获取有关从虚拟内存到物理内存的映射的​​其他信息。
  • 如果处理器无法执行上述操作或执行搜索但未能找到匹配项,则会生成异常。异常会停止当前程序,在处理器内部进行一些特殊更改,并开始执行操作系统的一部分而不是用户程序。
  • 操作系统检查异常的原因并决定该怎么做。

操作系统通常执行以下操作之一:

  • 如果异常的原因只是处理器没有针对该进程尝试访问的特定地址的相应表条目,但该地址是操作系统建立的进程虚拟地址空间的一部分,然后操作系统将适当的数据加载到处理器中并继续执行该过程。
  • 如果用户进程尝试访问其虚拟地址空间但当前没有物理地址的内存,则操作系统会为进程分配新的物理内存,设置表以从中描述新映射部分虚拟地址空间到分配的物理内存,并恢复执行用户进程。 (这种新物理内存的分配可能涉及释放其他物理内存。有时可以通过取消映射暂时未使用的页面并删除其内容[为了安全]来完成。有时它需要将页面内容写入磁盘,以便以后再次需要时保存它们。)
  • 如果用户进程试图访问不在其虚拟地址空间中的内存(当然,这些数字在空间中,但可能没有为该部分地址空间分配虚拟内存),那么系统向进程发送一个信号,使其执行错误的信号处理程序。如果进程没有此问题的信号处理程序,操作系统将终止该进程。