GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation de la mémoire du processus en cours en C

Vous pouvez toujours simplement ouvrir les 'fichiers' dans le /proc system comme vous le feriez avec un fichier normal (en utilisant le lien symbolique 'self' pour ne pas avoir à chercher votre propre pid):

FILE* status = fopen( "/proc/self/status", "r" );

Bien sûr, vous devez maintenant analyser le fichier pour sélectionner les informations dont vous avez besoin.


Je suis tombé sur ce post :http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

Version simplifiée :

#include <sys/resource.h>
#include <stdio.h>

int main() {
  struct rusage r_usage;
  getrusage(RUSAGE_SELF,&r_usage);
  // Print the maximum resident set size used (in kilobytes).
  printf("Memory usage: %ld kilobytes\n",r_usage.ru_maxrss);
  return 0;
}

(testé sous Linux 3.13)


C'est un moyen terriblement moche et non portable d'obtenir l'utilisation de la mémoire, mais comme le suivi de la mémoire de getrusage() est essentiellement inutile sous Linux, lire /proc//statm est le seul moyen que je connaisse pour obtenir le informations sur Linux.

Si quelqu'un connaît des moyens plus propres, ou de préférence plus inter-Unix, de suivre l'utilisation de la mémoire, je serais très intéressé à savoir comment.

typedef struct {
    unsigned long size,resident,share,text,lib,data,dt;
} statm_t;

void read_off_memory_status(statm_t& result)
{
  unsigned long dummy;
  const char* statm_path = "/proc/self/statm";

  FILE *f = fopen(statm_path,"r");
  if(!f){
    perror(statm_path);
    abort();
  }
  if(7 != fscanf(f,"%ld %ld %ld %ld %ld %ld %ld",
    &result.size,&result.resident,&result.share,&result.text,&result.lib,&result.data,&result.dt))
  {
    perror(statm_path);
    abort();
  }
  fclose(f);
}

À partir de la page de manuel proc(5) :

   /proc/[pid]/statm
          Provides information about memory usage, measured in pages.  
          The columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

Le getrusage La fonction de bibliothèque renvoie une structure contenant un grand nombre de données sur le processus en cours, notamment celles-ci :

long   ru_ixrss;         /* integral shared memory size */
long   ru_idrss;         /* integral unshared data size */
long   ru_isrss;         /* integral unshared stack size */

Cependant, la documentation Linux la plus récente parle de ces 3 champs

(unmaintained) This field is currently unused on Linux

que le manuel définit alors comme :

Tous les champs ne sont pas remplis ; les champs non maintenus sont mis à zéro par le noyau. (Les champs non maintenus sont fournis pour la compatibilité avec d'autres systèmes, et parce qu'ils pourraient un jour être pris en charge sous Linux.)

Voir getrusage(2)


Linux
  1. Outil qui permet la journalisation de l'utilisation de la mémoire ?

  2. Utilisation maximale de la mémoire d'un processus Linux/Unix

  3. Récupérer l'utilisation du processeur et l'utilisation de la mémoire d'un seul processus sous Linux ?

  4. Limitation de l'utilisation de la mémoire de processus/du processeur sous Linux

  5. enregistrement de la marque d'eau haute de la mémoire RAM d'un processus Linux

Comment vérifier la taille totale de la RAM et l'utilisation de la mémoire sous Linux

Comment vérifier la taille du tas pour un processus sous Linux

Utilisation croissante de la mémoire résidente (RSS) du processus Java

Limiter l'utilisation de la mémoire pour un seul processus Linux

Utilisation maximale de la mémoire d'un processus

Comment l'utilisation de la mémoire est-elle signalée sous Linux ?