2009-02-14 18 views
10

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++)?¿Cómo determinar un proceso de "tamaño virtual" (WinXP)?

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?

Respuesta

8

Según MSDN: Memory Performance InformationPROCESS_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 la máquina virtual de proceso.

+0

Supongo que esto será lo que ProcessExplorer muestra en la columna 'bytes privados', por lo que no es lo que estoy buscando. – theller

+0

PROCESS_MEMORY_COUNTERS_EX.PrivateUsage es lo mismo que VM Size en el Administrador de tareas según http://msdn.microsoft.com/en-us/library/aa965225(VS.85).aspx. – dalle

+7

Si bien el tamaño de VM tampoco es lo que estoy buscando, la página de MSDN que mencionó tiene lo que necesito: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual – theller

1

Consulta un contador de rendimiento.
Hay una API completa para esto en la API win32, read about it here.
Puede consultar todos los contadores de rendimiento si ejecuta un programa llamado 'perfmon.exe'

+0

¿No tiene un fragmento de código, por favor? – theller

1

Puede usar un contador de rendimiento. El objeto Process tiene un valor de "Bytes virtuales".

+1

IIUC, GetProcessMemoryInfo no proporciona * esta * información. – theller

+0

tienes razón. corregido –

0

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

+0

Lo sé. La pregunta es, ¿qué tan lejos estoy del límite? – theller

0

No necesita contadores de rendimiento. sólo tiene que utilizar NAPI (Win32 FAQ)

ver en el Grupo de Noticias de Win32: //nntp.aioe.org/comp.os.ms-windows.programmer.win32 para el código C.

1

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 utilizar los 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 el siguiente.

+0

He estado tratando de descubrir lo mismo. Además de agregar un mensaje o mensaje de ventana al otro proceso que estoy monitoreando, me acaban de salir ideas. –

Cuestiones relacionadas