c++ c windows memory-management

c++ - ¿Cómo determinar un proceso de "tamaño virtual"(WinXP)?



windows memory-management (6)

Tengo un programa que necesita mucha memoria y se bloquea tan pronto como se alcanza el espacio de direcciones virtuales de 2 GB. El explorador de procesos Sysinternals muestra esto como una columna de "tamaño virtual". ¿Cómo puedo determinar este "tamaño virtual" con el código C (o C ++)?

Ok, tengo que consultar un contador de rendimiento para "Bytes virtuales". Perfmon muestra la cadena de consulta (o cómo se llama) como, por ejemplo, ''/ Process (firefox) / Virtuelle Größe'' en mi instalación Win XP alemana.

¿Cómo determino la cadena de consulta para el ''proceso actual'' y hay un nombre no localizado para él?


Consulta un contador de rendimiento.
Hay una API completa para esto en la API de win32, lee sobre esto aquí .
Puede ver todos los contadores de rendimiento si ejecuta un programa llamado ''perfmon.exe''


En 32 bits, el espacio de direcciones de Windows XP está dividido en dos partes de 2 GB: una parte para el programa y otra para el kernel. Puede aumentar la parte de la aplicación a 3GB utilizando el modificador / 3GB en el archivo boot.ini .


No necesita contadores de rendimiento. Solo use NAPI (Win32 FAQ)

ver en noticias del grupo win32: //nntp.aioe.org/comp.os.ms-windows.programmer.win32 para el código C.


Puedes usar un contador de rendimiento. El Objeto de proceso tiene un valor de "Bytes virtuales".


Según MSDN: Información sobre el rendimiento de la memoria PROCESS_MEMORY_COUNTERS_EX.PrivateUsage es lo mismo que VM Size en el Administrador de tareas en Windows XP. GetProcessMemoryInfo debería funcionar:

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

Ahora pmcx.PrivateUsage contiene el tamaño de VM del proceso.


Necesitaba lo mismo que Theller, pero desafortunadamente lo necesitaba para un proceso que no era el mío. Debido a esto, la auto-respuesta de Theller de usar "MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual" no funcionó para mí, ya que GlobalMemoryStatusEx () (la función que devuelve MEMORYSTATUXEX) solo funciona para el proceso actual.

Hasta ahora, no he podido encontrar exactamente lo que estaba buscando sin usar contadores de rendimiento (no me metí en ellos porque parecían mucho más complejos de lo que estaba buscando). Me acerqué mucho y usé "VirtualQueryEx" para explorar el espacio de direcciones del proceso deseado, contando todas las regiones que no tenían un Estado de MEM_FREE. En mis pruebas, parecía ser una constante 17M más alta de lo que hubiera esperado al comparar con Process Explorer. ... también, ciertamente no está libre de condiciones de carrera.

De todos modos, sé que esto no es una respuesta, pero pensé que al menos documentaría el progreso que había hecho en esto para quien se tropiece con esto.