GNU/Linux >> Tutoriales Linux >  >> Linux

Uso de memoria del proceso actual en C

Siempre puede simplemente abrir los 'archivos' en el /proc sistema como lo haría con un archivo normal (usando el enlace simbólico 'self' para que no tenga que buscar su propio pid):

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

Por supuesto, ahora debe analizar el archivo para seleccionar la información que necesita.


Encontré esta publicación:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

Versión simplificada:

#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;
}

(probado en Linux 3.13)


Esta es una forma terriblemente fea y no portátil de obtener el uso de la memoria, pero dado que el seguimiento de la memoria de getrusage() es esencialmente inútil en Linux, leer /proc//statm es la única forma que conozco de obtener el información sobre Linux.

Si alguien conoce formas más limpias, o preferiblemente más cruzadas de Unix, de rastrear el uso de la memoria, estaría muy interesado en saber cómo.

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);
}

Desde la página de manual de 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)

El getrusage La función de biblioteca devuelve una estructura que contiene una gran cantidad de datos sobre el proceso actual, incluidos estos:

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

Sin embargo, la documentación de Linux más actualizada dice acerca de estos 3 campos

(unmaintained) This field is currently unused on Linux

que el manual luego define como:

No todos los campos están completos; los campos no mantenidos son puestos a cero por el kernel. (Los campos no mantenidos se proporcionan por motivos de compatibilidad con otros sistemas y porque es posible que algún día sean compatibles con Linux).

Ver getrusage(2)


Linux
  1. Uso de memoria de Linux

  2. Linux:¿limitar el uso de memoria para un solo proceso de Linux?

  3. ¿Herramienta que permite el registro del uso de la memoria?

  4. Linux:¿necesita una explicación sobre el tamaño del conjunto residente/tamaño virtual?

  5. Cómo verificar el tamaño total de RAM y el uso de memoria en Linux

Invocar y rastrear el uso de memoria de un proceso

Limite el uso de memoria para un solo proceso de Linux

Uso máximo de memoria de un proceso

¿Cómo se informa el uso de la memoria en Linux?

Graficando el uso de la memoria del proceso en Linux

Ubuntu Linux:procesamiento de memoria de intercambio y uso de memoria