2009-11-04 7 views
4

Je souhaite obtenir des informations sur l'utilisation de la mémoire pour chaque processus et pour l'ensemble du système. Dans Windows, c'est plutôt facile. GetProcessMemoryInfo et GlobalMemoryStatusEx font ces tâches grandement et très facilement. Par exemple, GetProcessMemoryInfo donne "PeakWorkingSetSize" du processus donné. GlobalMemoryStatusEx renvoie la mémoire disponible dans tout le système.API d'utilisation de la mémoire C/C++ sous Linux/Windows

Cependant, je dois le faire sous Linux. J'essaie de trouver des API système Linux équivalentes GetProcessMemoryInfo et GlobalMemoryStatusEx.

J'ai trouvé 'getrusage'. Cependant, max 'ru_maxrss' (taille de l'ensemble résident) dans la structure rusage est juste zéro, ce qui n'est pas implémenté. En outre, je n'ai aucune idée d'obtenir la mémoire libre de tout le système.

Solution de contournement actuelle pour cela, j'utilise "system (" ps -p% my_pid -o vsz, rsz ");". Connexion manuelle au fichier Mais, c'est sale et pas pratique pour traiter les données. Je voudrais savoir quelques API Linux de fantaisie à cette fin.

+0

Voulez-vous la quantité de mémoire utilisée par un processus particulier ou ce qui est utilisé par un thread particulier? – ChadNC

+0

@ChadNC, je voulais par processus et système large, et j'ai résolu ce problème. – minjang

Répondre

6

Vous pouvez voir comment cela est fait dans libstatgrab.
Et vous pouvez également l'utiliser (GPL)

+0

Merci Alex, c'est exactement ce que je voulais. En fait, la bibliothèque lit/proc/* data, ce qui est la façon dont je l'essayerais :) – minjang

+0

Puis marquez la réponse comme acceptée et upvote. –

5

Linux a un système de fichiers-interface (modulaire) pour extraire ces données à partir du noyau, étant ainsi utilisable par presque tout outil de langage ou de script.

La mémoire peut être complexe. Il y a le programme exécutable lui-même, probablement mmap(). Bibliothèques partagées. Empiler l'utilisation. Utilisation du tas Des parties du logiciel résident dans la RAM. Les portions ont été échangées. Etc


Qu'est-ce que c'est «PeakWorkingSetSize»? Cela ressemble à la taille maximale de l'ensemble résident (la mémoire RAM physique maximale non échangée utilisée par le processus).

Bien que cela pourrait également être l'empreinte mémoire totale de la mémoire virtuelle de l'ensemble du processus (sum des parties dans-RAM et SWAPPED-out).


Irregardless, sous Linux, vous pouvez strace un processus pour voir ses interactions au niveau du noyau. "ps" obtient ses données à partir des fichiers/proc/$ {PID}/*. Je vous suggère cat/proc/$ {PID}/status Les lignes Vm * sont très utiles.

Spécifiquement: VmData fait référence à l'utilisation du tas de processus. VmStk fait référence à l'utilisation de la pile de processus.

Si vous continuez à utiliser "ps", vous pourriez envisager popen().


Je ne sais pas d'obtenir la mémoire libre à l'échelle du système.

Il y a toujours /usr/bin/gratuit

Notez que Linux utilisera la mémoire inutilisée pour les fichiers en mémoire tampon et la mise en cache ... Ainsi, la +/- tampons/cache ligne.

+0

Merci pour les réponses détaillées. "PeakWorkingSetSize" est défini dans le système Windows, et il est similaire à max rss comme vous l'avez indiqué. Comme vous l'avez mentionné, libstatgrab lit le fichier dans/proc/$ PID/status. La bibliothèque fournit également une mémoire libre pour tout le système en lisant la section "/ proc/meminfo". Merci! – minjang

Questions connexes