Как определить процесс "виртуальный размер" (WinXP)?

У меня есть программа, которая нуждается в большой памяти, и она срабатывает, как только будет достигнуто виртуальное адресное пространство 2 ГБ. Исследователь процессов Sysinternals отображает это как столбец "виртуальный размер". Как я могу определить этот "виртуальный размер" с кодом C (или С++)?

Хорошо, мне нужно запросить счетчик производительности для "Виртуальных байтов". Perfmon показывает строку запроса (или как она называется), например, "\ Process (firefox)\Virtuelle Größe" на моей установке в Германии Win XP.

Как определить строку запроса для текущего процесса и существует ли это нелокализованное имя?

Ответ 1

Согласно MSDN: информация о производительности памяти PROCESS_MEMORY_COUNTERS_EX.PrivateUsage совпадает с размером виртуальной машины в диспетчере задач в Windows XP. GetProcessMemoryInfo должен работать:

PROCESS_MEMORY_COUNTERS_EX pmcx = {};
pmcx.cb = sizeof(pmcx);
GetProcessMemoryInfo(GetCurrentProcess(),
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb);

Теперь pmcx.PrivateUsage содержит размер виртуальной машины в процессе.

Ответ 2

Вы запрашиваете счетчик производительности.
Для API win32 существует полный API, читайте об этом здесь.
Вы можете посмотреть все счетчики производительности, если вы запустите программу под названием "perfmon.exe"

Ответ 3

Вы можете использовать счетчик производительности. Процесс Объект имеет значение "Виртуальные байты".

Ответ 4

Мне нужно было то же самое, что и theller, но, к сожалению, это было для другого процесса, кроме моего. Из-за этого все-таки сам ответ на использование "MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual" не работал у меня, поскольку GlobalMemoryStatusEx() (функция, возвращающая MEMORYSTATUXEX) работает только для текущего процесса.

До сих пор я не смог найти то, что искал, не используя счетчики производительности (я не попадал в них, потому что они выглядели более сложными, чем то, что я искал). Я прошел очень близко, обходя вокруг и используя "VirtualQueryEx", чтобы исследовать адресное пространство желаемого процесса, подсчитывая все регионы, в которых не было состояния MEM_FREE. В моих тестах он казался постоянным на 17 М выше, чем я ожидал при сравнении с Process Explorer.... тоже, конечно, не гонка-состояние бесплатно.

Во всяком случае, я знаю, что это не ответ, но я решил, что, по крайней мере, буду документировать прогресс, который я сделал для этого, для того, кто наткнется на следующий.

Ответ 5

В 32-битном WindowsXP адресное пространство разделено на две части 2 ГБ: одна часть для программы, а другая для ядра. Вы можете увеличить часть приложения до 3 ГБ с помощью /3GB switch в файле boot.ini.

Ответ 6

Вам не нужны счетчики производительности. Просто используйте NAPI (FAQ по Win32)

см. в новостях группы win32://nntp.aioe.org/comp.os.ms-windows.programmer.win32 для кода C.