为什么可用物理内存(dwAvailPhys)>在Windows Vista x64上调用GlobalMemoryStatus时可用的虚拟内存(dwAvailVirtual)

时间:2010-03-17 18:55:11

标签: windows memory

我正在使用MSDN示例进行内存压力测试(请参阅:http://msdn.microsoft.com/en-us/magazine/cc163613.aspx)以及专门用于物理内存的该工具的扩展(请参阅http://www.donationcoder.com/Forums/bb/index.php?topic=14895.0;prev_next=next)。我显然对虚拟和物理内存之间的差异感到困惑。我认为每个进程都有2 GB的虚拟内存(虽然我也因为“开销”而读取1.5 GB。我的理解是这个虚拟内存中的一些/全部/没有可能是物理内存,以及一个物理内存的使用量。进程可能随着时间的推移而变化(内存可以换成光盘等)我进一步认为,一般来说,当你分配内存时,操作系统可以使用物理内存或虚拟内存。由此我得出结论,dwAvailVirtual应该总是等于或大于调用GlobalMemoryStatus中的dwAvailPhys。但是,我经常(总是?)看到相反的情况。我错过了什么。

如果我的问题形成不好,我会提前道歉。我仍然试图绕过Windows中的整个内存管理系统。我们非常欢迎教程/说明/书籍收藏!

安德鲁

3 个答案:

答案 0 :(得分:2)

这在过去的日子里才是真实的,当RAM价格昂贵时。操作系统根据需要将虚拟内存页面映射到RAM。如果没有足够的RAM来满足程序的请求,它将启动取消映射页面以腾出空间。如果这样的页面包含数据而不是代码,则会将其写入页面文件。每当程序再次访问该页面时,它就会生成一个分页错误,让操作系统从磁盘读回页面。

如果机器有很少的RAM并且有很多进程占用虚拟内存页面,那么这可能会导致一种非常不愉快的效果,称为“颠簸”。操作系统不断访问磁盘,机器性能降低为爬行速度。

更多RAM意味着更少的磁盘访问。没有理由不在32位操作系统上使用3或4 GB的RAM,这很便宜。即使您不能使用全部4 GB,由于硬件设备占用地址总线上的空间(主要是视频),因此并非所有这些都可以寻址。但这不会改变用户代码可访问的虚拟内存的大小,它仍然是2千兆字节。

Windows Internals是一本好书。

答案 1 :(得分:1)

我不知道这是否是您的问题,但MSDN page for the GlobalMemoryStatus function包含以下警告:

  

在内存超过4 GB的计算机上, GlobalMemoryStatus 函数可以返回不正确的信息,报告值为-1表示溢出。因此,应用程序应使用 GlobalMemoryStatusEx 函数。

此外,该页面上写着:

  

在内存超过2 GB且内存少于4 GB的Intel x86计算机上, GlobalMemoryStatus 功能将始终在 dwTotalPhys 成员中返回2 GB > MEMORYSTATUS 结构。同样,如果总可用内存介于2到4 GB之间, MEMORYSTATUS 结构的 dwAvailPhys 成员将向下舍入为2 GB。如果使用 / LARGEADDRESSAWARE 链接器选项链接可执行文件,则 GlobalMemoryStatus 函数将在两个成员中返回正确数量的物理内存。

由于您指的是dwAvailPhys而非ullAvailPhys之类的成员,因此您使用的是MEMORYSTATUS结构而不是MEMORYSTATUSEX结构。我不知道它在64位平台上的后果,但在32位平台上肯定会导致报告不正确的内存大小。

答案 2 :(得分:1)

虚拟内存量受地址空间大小的限制 - 在32位系统上每个进程4GB。您必须从中减去为系统使用保留的区域的大小以及您的进程已经使用的VM的数量(包括映射到其地址空间的所有库)。

另一方面,物理内存的总量可能高于系统为您的进程免费使用的虚拟内存空间量(现在通常是这样)。

这意味着如果你有超过2GB或RAM,你不能在一个进程中使用所有物理内存(因为没有足够的虚拟内存空间来映射它),但它可以被许多进程使用。请注意,在64位系统中删除了此限制。