GNU/Linux >> Linux Esercitazione >  >> Linux

Utilizzo della memoria del processo corrente in C

Puoi sempre semplicemente aprire i 'file' nel /proc system come faresti con un normale file (utilizzando il collegamento simbolico 'self' in modo da non dover cercare il tuo pid):

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

Ovviamente, ora devi analizzare il file per scegliere le informazioni di cui hai bisogno.


Mi sono imbattuto in questo post:http://appcrawler.com/wordpress/2013/05/13/simple-example-of-tracking-memory-using-getrusage/

Versione semplificata:

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

(testato in Linux 3.13)


Questo è un modo terribilmente brutto e non portatile per ottenere l'utilizzo della memoria, ma poiché il monitoraggio della memoria di getrusage() è essenzialmente inutile su Linux, leggere /proc//statm è l'unico modo che conosco per ottenere il informazioni su Linux.

Se qualcuno conosce modi più puliti, o preferibilmente più cross-Unix, di tracciare l'utilizzo della memoria, sarei molto interessato a sapere come.

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

Dalla pagina man di 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)

Il getrusage La funzione di libreria restituisce una struttura contenente un sacco di dati sul processo corrente, inclusi questi:

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

Tuttavia, la documentazione di Linux più aggiornata parla di questi 3 campi

(unmaintained) This field is currently unused on Linux

che il manuale poi definisce come:

Non tutti i campi sono compilati; i campi non mantenuti sono impostati a zero dal kernel. (I campi non mantenuti sono forniti per compatibilità con altri sistemi e perché un giorno potrebbero essere supportati su Linux.)

Vedere getrusage(2)


Linux
  1. Linux:limite all'utilizzo della memoria per un singolo processo Linux?

  2. Linux – Hai bisogno di una spiegazione sulla dimensione del set residente/dimensione virtuale?

  3. Recuperare l'utilizzo della CPU e l'utilizzo della memoria di un singolo processo su Linux?

  4. Limitazione dell'utilizzo della memoria/CPU del processo su Linux

  5. Crescente utilizzo della memoria residente (RSS) di Java Process

registrazione del limite massimo della memoria RAM di un processo Linux

Utilizzo elevato della memoria ma nessun processo lo sta utilizzando

Picco di utilizzo della memoria di un processo

Come viene riportato l'utilizzo della memoria in Linux?

Utilizzo della memoria del processo grafico su Linux

Ubuntu Linux:elabora la memoria di scambio e l'utilizzo della memoria