【问题标题】:Physical Memory Vs Virtual Memory物理内存与虚拟内存
【发布时间】:2013-10-08 17:42:47
【问题描述】:

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

我的问题是:

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

【问题讨论】:

  • 虚拟内存是真实内存的视图(可能还有一些磁盘空间),所以你的问题没有任何意义。数据写入物理内存中虚拟地址指示的位置。
  • 我猜虚拟地址并不表示数据在物理内存中的位置,因为页面都以任意方式放置在物理内存中。我想一个页表。
  • 怎么会这样?这绝对没有意义。每个用户程序只能通过虚拟地址读取或写入,并且在实际发生读取或写入时,该地址必须映射到某个真实地址。

标签: windows memory internals


【解决方案1】:

简而言之,是的。

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

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


编辑 - 对内存列表和页面错误的说明:

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

免费列表 这些是操作系统正在清理的物理内存页面,即将粘贴到零列表中。

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

运行perfmon.exe /res 并单击“内存”选项卡以查看与各种列表相关联的数量。您会经常观察到 Windows 喜欢在待机列表中保留相当数量的内存。

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

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

回答您的评论
分配内存通常会导致软故障,因为操作系统从零列表中提取然后从备用列表中窃取以完成请求。不需要从任何物理媒体读取任何内容,因此不会遇到硬故障。

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

【讨论】:

  • 你的意思是当物理内存中没有可用空间来映射当前线程的虚拟内存页面时,会出现硬页面错误......当物理内存中有未使用的页面时,就会出现软错误?
【解决方案2】:

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

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

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

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

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

操作系统通常会做以下几件事之一:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多