【问题标题】:GlobalMemoryStatusEx() gives total virtual memory as 127 TeraByteGlobalMemoryStatusEx() 给出的总虚拟内存为 127 TeraByte
【发布时间】: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 位系统上是的,交换空间与此操作无关...

标签: c++ windows memory


【解决方案1】:

是的。来自MSDN

您可以使用GlobalMemoryStatusEx() 来确定您的应用程序可以分配多少内存,而不会严重影响其他应用程序。

【讨论】:

  • 我认为这是系统特定的@user3819404,但我不确定。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 2018-07-09
  • 2014-02-10
  • 2013-01-24
  • 1970-01-01
  • 2015-08-16
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多