2013-10-08 41 views
0

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

我的问题是:

当一个线程将存储的值或变量分配空间,它会被存储/虚拟内存中分配,但都写在同一时间的物理内存的变化?

+0

虚拟内存是真实内存的视图(可能还有一些磁盘空间),所以你的问题没有任何意义。数据写在虚拟地址指示的物理内存中。 – Ingo

+0

我猜虚拟地址并不能表示数据在物理内存中的位置,因为这些页面全部以任意方式放置在物理内存中。我会想一个页表。 – JohnnyCat

+0

这是怎么回事?绝对没有意义。每个用户程序只能通过虚拟地址读取或写入,并且在读取或写入实际发生时,此地址必须映射到某个实际地址。 – Ingo

回答

3

总之,是的。

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

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


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

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

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

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

运行perfmon.exe /res然后单击“内存”选项卡查看多少与各种列表相关联。您经常会发现Windows喜欢在备用列表中保留相当数量的内存。

软故障 如果您的应用程序分配内存或读取或写入到存储器,操作系统窃取或预加载(和放在备用列表),那么它是操作系统分配回一个很简单的事情到你的过程。软故障很便宜。

硬故障 如果你需要的内存是不是在物理内存中的任何地方,然后硬故障遇到,操作系统需要以“页”从某种类型的存储设备。这通常很慢,是开发人员在性能调整时可能会关注的问题。

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

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

+0

你的意思是当物理内存中没有可用空间来映射当前线程的虚拟内存页面时,硬页面故障会消失......当物理内存中有未使用的页面时,会有软错误? – JohnnyCat

2

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

这里是虚拟存储器通常是如何工作的硬件:

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

如果处理器在其特殊寄存器表中没有找到虚拟地址,那么几件事情之一可能发生:

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

操作系统通常做的几件事情之一:

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