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

标签 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 中的整个内存管理系统。非常欢迎教程/解释/书籍推荐!

安德鲁

最佳答案

这仅在过去是正确的,当时 RAM 很昂贵。操作系统根据需要将虚拟内存页映射到 RAM。如果没有足够的 RAM 来满足程序的请求,它就会开始取消映射页面以腾出空间。如果此类页面包含数据而不是代码,则会将其写入页面文件。每当程序再次访问该页面时,它都会生成分页错误,让操作系统从磁盘读回该页面。

如果机器的 RAM 很小并且有大量进程消耗虚拟内存页面,则可能会导致非常不愉快的效果,称为“抖动”。操作系统不断地访问磁盘,机器性能缓慢下降。

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

Windows 内部原理是一本好书。

关于windows - 为什么在 Windows Vista x64 上调用 GlobalMemoryStatus 时可用物理内存 (dwAvailPhys) > 可用虚拟内存 (dwAvailVirtual),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2465030/

相关文章:

c - 本地初始化字符串数组的内存分配

javascript - 是否有可能用JavaScript中的其他内存覆盖变量指向的内存?

c++ - 清理 RAM(也许是 win32 api)?

linux - Rebar3 从主机操作系统释放 ERTS 文件?

windows - 在 pushd 中 pushd —— 可能吗?

PHP 如何启动 Windows GUI 应用程序

c++ - C++编程中的缓存是什么?

c++ - Qlist适合在服务中使用?

windows - ffmpeg 录制屏幕并将视频文件以 .mpg 格式保存到磁盘

Windows Azure : Creating a subdirectories inside the blob