【发布时间】:2018-03-02 09:00:16
【问题描述】:
为什么 GlobalMemoryStatusEx() 会提供巨大的总虚拟内存。它是否考虑了所有可以创建的页面文件?
系统详情:
Windows 8.1,64 位进程,x64 处理器
int main()
{
MEMORYSTATUSEX mex;
mex.dwLength = sizeof (mex);
GlobalMemoryStatusEx(&mex);
std::cout<<mex.ullTotalVirtual<<" "<<mex.ullAvailVirtual;
}
140737488224256 140737478111232
编辑:
我在 Windows 10 上得到了相同的结果。我很想知道这个 127 TB 数字是如何出现的。为什么系统没有考虑到我的磁盘上没有 127 tb 空间?
(x64 系统)上的 32 位进程仅显示 2gb,这是用户模式下 32 位进程的可访问地址限制。为什么在 32 位进程的情况下不考虑页面文件?
【问题讨论】:
-
看起来这为您提供了进程虚拟地址空间的理论数量,而不管实际可用的物理存储量(RAM + 页面文件)
-
AFAIR,AMD64 的当前硬件实现将地址位限制为 48。Windows 为您提供一半,就像它在 32 位处理器中所做的那样......
-
@user3819404:抱歉,不,虚拟内存不是你想的那样。通过拥有这么多虚拟内存,您可以映射 100 TB 文件并访问整个文件,而无需使用任何交换空间和最佳物理内存...
-
这是一个非常古老的功能,一直存在,运行在具有从未设想过的功能的操作系统上。您有多少可用的实际虚拟内存是高度不可预测的,这取决于操作系统增长页面文件的速度。时间是一个重要因素,你分配得越慢,增长跟上的可能性就越大。你只有通过尝试才能真正知道。当然这个功能不能合理地做到这一点,所以它平底锅。
-
@user3819404:在 32 位系统上不行,因为您受限于 2GB 的虚拟内存大小。在 64 位系统上是的,交换空间与此操作无关...