Как определить процесс "виртуальный размер" (WinXP)?
У меня есть программа, которая требует много памяти, и она падает, как только достигается виртуальное адресное пространство 2 ГБ. Sysinternals Process Explorer отображает это как "виртуальный размер" столбца. Как я могу определить этот "виртуальный размер" с помощью кода C (или C++)?
Хорошо, я должен запросить счетчик производительности для "Виртуальных байтов". Perfmon показывает строку запроса (или как она называется) как, например, '\Process(firefox)\Virtuelle Größe' в моей немецкой установке Win XP.
Как определить строку запроса для "текущего процесса" и есть ли для нее нелокализованное имя?
6 ответов
Согласно 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
содержит размер виртуальной машины процесса.
Вы запрашиваете счетчик производительности.
В Win32 API для этого есть полный API, читайте об этом здесь.
Вы можете посмотреть все счетчики производительности, если запустите программу "perfmon.exe"
Вы можете использовать счетчик производительности. Объект процесса имеет значение "Виртуальные байты".
Мне нужно было то же самое, что и Тиллеру, но, к сожалению, это было нужно для процесса, отличного от моего. Из-за этого сам ответ пользователя об использовании "MEMORYSTATUSEX.ullTotalVirtual–MEMORYSTATUSEX.ullAvailVirtual" у меня не сработал, поскольку GlobalMemoryStatusEx() (функция, которая возвращает MEMORYSTATUXEX) работает только для текущего процесса.
До сих пор мне не удалось найти именно то, что я искал, без использования счетчиков производительности (я не разбирался в них, потому что они выглядели намного сложнее, чем то, что я искал). Я очень близко подошел к циклу и использовал "VirtualQueryEx" для изучения адресного пространства нужного процесса, подсчитав все регионы, которые не имели состояния MEM_FREE. В моих тестах он оказался на 17M выше, чем я ожидал по сравнению с Process Explorer.... Кроме того, это, безусловно, не свободен от условий гонки.
Во всяком случае, я знаю, что это не ответ, но я решил, что, по крайней мере, задокументирую прогресс, который я сделал в этом для тех, кто наткнется на это дальше.
В 32-битном WindowsXP адресное пространство разделено на две части по 2 ГБ: одна часть для программы, а другая для ядра. Вы можете увеличить часть приложения до 3 ГБ, используя ключ /3GB в файле boot.ini.
Вам не нужны счетчики производительности. Просто используйте NAPI (Win32 FAQ)
см. в новостях группы win32://nntp.aioe.org/comp.os.ms-windows.programmer.win32 для C-кода.