2009-02-14 11 views
10

J'ai un programme qui a besoin de beaucoup de mémoire, et il se bloque dès que l'espace d'adressage virtuel de 2 Go est atteint. L'explorateur de processus Sysinternals l'affiche comme colonne "taille virtuelle". Comment puis-je déterminer cette "taille virtuelle" avec du code C (ou C++)?Comment déterminer un processus "taille virtuelle" (WinXP)?

Ok, je dois interroger un compteur de performance pour "Virtual Bytes". Perfmon affiche la chaîne de requête (ou comment elle s'appelle) comme, par exemple, '\ Process (firefox) \ Virtuelle Größe' sur mon installation allemande Win XP.

Comment puis-je déterminer la chaîne de requête pour le « processus en cours », et est-il un nom non localisé pour elle?

Répondre

8

Selon MSDN: Memory Performance InformationPROCESS_MEMORY_COUNTERS_EX.PrivateUsage est la même que VM Size dans le Gestionnaire des tâches de Windows XP. GetProcessMemoryInfo devrait fonctionner:

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

Maintenant pmcx.PrivateUsage détient la taille VM du processus.

+0

Je suppose que ce sera ce que ProcessExplorer affiche dans la colonne 'private bytes', donc ce n'est pas ce que je cherche. – theller

+0

PROCESS_MEMORY_COUNTERS_EX.PrivateUsage est le même que VM Size dans Task Manager selon http://msdn.microsoft.com/en-us/library/aa965225(VS.85).aspx. – dalle

+7

Alors que la taille de la machine virtuelle n'est pas ce que je recherche la page MSDN que vous avez mentionné a ce dont j'ai besoin: MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual – theller

1

Vous interrogez un compteur de performance. Il existe une API complète pour cela dans l'API win32, read about it here.
Vous pouvez consulter tous les compteurs de performance si vous exécutez un programme appelé 'perfmon.exe'

+0

Vous n'avez pas d'extrait de code, s'il vous plaît? – theller

1

Vous pouvez utiliser un compteur de performance. L'objet Process a une valeur "Virtual Bytes".

+1

IIUC, GetProcessMemoryInfo ne fournit pas * cette * information. – theller

+0

vous avez raison. corrigée. –

0

Dans l'espace d'adressage 32 bits de Windows XP est divisé en deux parties: une partie de 2 Go pour le programme et l'autre pour le noyau. Vous pouvez augmenter la partie de l'application à 3 Go en utilisant le /3GB switch in the boot.ini file.

+0

Je le sais. La question est, à quelle distance je suis de la limite. – theller

0

Vous n'avez pas besoin de compteurs de performance. Il suffit d'utiliser PNAI (FAQ Win32)

voir sur les nouvelles du groupe win32: //nntp.aioe.org/comp.os.ms-windows.programmer.win32 pour le code C.

1

J'avais besoin de la même chose que theller, mais malheureusement, il en avait besoin pour un processus autre que le mien. De ce fait, l'auto-réponse Theller d'utiliser « MEMORYSTATUSEX.ullTotalVirtual-MEMORYSTATUSEX.ullAvailVirtual » ne fonctionne pas pour moi, depuis GlobalMemoryStatusEx() (la fonction qui retourne MEMORYSTATUXEX) ne fonctionne que pour le processus en cours. Jusqu'ici, j'ai été incapable de trouver exactement ce que je cherchais sans utiliser les compteurs de performance (je ne les ai pas abordés parce qu'ils semblaient beaucoup plus complexes que ce que je cherchais). J'ai été très proche en bouclant et en utilisant "VirtualQueryEx" pour explorer l'espace d'adressage du processus désiré, en comptant toutes les régions qui n'avaient pas un état de MEM_FREE. Dans mes tests, il semblait être une constante 17M plus élevé que ce à quoi je m'attendais en comparant Process Explorer. ... aussi, ce n'est certainement pas une condition de course libre.

Quoi qu'il en soit, je sais que c'est sorta une non-réponse, mais je suis dit que je au moins le document les progrès que je l'avais fait sur ce point pour celui qui trébuche sur ce côté.

+0

J'ai essayé de comprendre la même chose. En plus d'ajouter un message de message ou de fenêtre à l'autre processus que je surveille, je suis à court d'idées. –

Questions connexes