none
关于程序虚拟内存的使用 RRS feed

  • 问题

  • GlobalMemoryStatusEx这个函数返回的“虚拟内存大小”和“可用虚拟内存大小”,是指什么?我发现“可用虚拟内存”和“虚拟内存”总是相差不大,而实际上我系统里的程序应该用了很多虚拟内存。

    如果用 systeminfo 这个命令,会得到,
    虚拟内存:最大值:   2048MB
    虚拟内存:可用:   2004MB
    虚拟内存:使用中: 44MB

    而实际上如果在 任务管理器 中查看每个进程使用的虚拟内存,  加起来,远不止 44MB。

    这是怎么回事呢?

    2010年1月30日 8:56

答案

  • ullTotalVirtual

    The size of the user-mode portion of the virtual address space of the calling process, in bytes. This value depends on the type of process, the type of processor, and the configuration of the operating system. For example, this value is approximately 2 GB for most 32-bit processes on an x86 processor and approximately 3 GB for 32-bit processes that are large address aware running on a system with 4-gigabyte tuning enabled.

    ullAvailVirtual

    The amount of unreserved and uncommitted memory currently in the user-mode portion of the virtual address space of the calling process, in bytes.

    ullAvailExtendedVirtual

    The amount of unreserved and uncommitted memory currently in the extended portion of the virtual address space of the calling process, in bytes.

         看到MSDN 的解释你就会知道 Total Virtual 和 Avail Virtual 是针对当前调用GlobalMemoryStatusEx 进程来说的。 我们都知道32为系统上,理论寻址空间是4G,这也就是虚拟内存支持的最大寻址空间。一般来说,操作系统会占用高位的2G虚拟内存空间,用来映射操作系统的API、保存与当前进程相关的线程控制块等等信息。所以,一般来说对于一个进程的用户模式,最大可寻址空间是2G。这个值也不是不可以改变,在系统盘有一个Boot.ini 文件,在启动操作系统后面加上/3GB 的参数,该操作系统启动后,就会将用户模式的虚拟内存地址空间提高到3G,操作系统仅保留1G虚拟内存地址空间。

         根据你给出的三个数据,你当前用于测试GlobalMemoryStatusEx API 的程序总共占用了44M 的虚拟内存,因此最多还可使用2004M 虚拟内存。
    2010年1月30日 9:28
    版主

全部回复

  • ullTotalVirtual

    The size of the user-mode portion of the virtual address space of the calling process, in bytes. This value depends on the type of process, the type of processor, and the configuration of the operating system. For example, this value is approximately 2 GB for most 32-bit processes on an x86 processor and approximately 3 GB for 32-bit processes that are large address aware running on a system with 4-gigabyte tuning enabled.

    ullAvailVirtual

    The amount of unreserved and uncommitted memory currently in the user-mode portion of the virtual address space of the calling process, in bytes.

    ullAvailExtendedVirtual

    The amount of unreserved and uncommitted memory currently in the extended portion of the virtual address space of the calling process, in bytes.

         看到MSDN 的解释你就会知道 Total Virtual 和 Avail Virtual 是针对当前调用GlobalMemoryStatusEx 进程来说的。 我们都知道32为系统上,理论寻址空间是4G,这也就是虚拟内存支持的最大寻址空间。一般来说,操作系统会占用高位的2G虚拟内存空间,用来映射操作系统的API、保存与当前进程相关的线程控制块等等信息。所以,一般来说对于一个进程的用户模式,最大可寻址空间是2G。这个值也不是不可以改变,在系统盘有一个Boot.ini 文件,在启动操作系统后面加上/3GB 的参数,该操作系统启动后,就会将用户模式的虚拟内存地址空间提高到3G,操作系统仅保留1G虚拟内存地址空间。

         根据你给出的三个数据,你当前用于测试GlobalMemoryStatusEx API 的程序总共占用了44M 的虚拟内存,因此最多还可使用2004M 虚拟内存。
    2010年1月30日 9:28
    版主
  • 看来是这样的,我把这个virtual memory理解错了。谢谢。

    我想知道的是,怎样获得一个进程使用了多大的“虚拟内存”,像“任务管理器”显示的那样的?。
    2010年1月30日 13:19
  • 首先遍历所有进程,获得各个进程的句柄。然后调用GetProcessMemoryInfo
    MSDN上有例子
    http://msdn.microsoft.com/en-us/library/ms682050(VS.85).aspx


    麻烦把正确答案设为解答。
    2010年2月1日 1:29
    版主