2011-04-23 20 views
10

Usando getrlimit (RLIMIT_MEMLOCK), se puede obtener la cantidad permitida de memoria bloqueada que un proceso puede asignar (mlock() o mlockall()).Cuánta memoria está bloqueada en un proceso

¿Pero cómo recuperar la cantidad de memoria actualmente bloqueada?

Por ejemplo, getrusage() no devuelve información.

En Linux, es posible leer/proc/self/status y extraer la cantidad de memoria bloqueada de la línea que comienza con VmLck.

¿Hay alguna forma portátil de recuperar la cantidad de memoria bloqueada que funcionaría en Linux, * BSD y otros sistemas POSIX compatibles?

+1

POSIX especifica que las llamadas a mlock y mlockall fallarán con ENOSYS si la llamada no se implementa. Esto significa que no hay una interfaz portátil garantizada para bloquear/desbloquear, portátil en el sentido de que está garantizado su implementación. También. No hay una forma especificada de POSIX para enumerar las páginas bloqueadas de la memoria de proceso. –

Respuesta

3

Probablemente deba verificar cada sistema e implementarlo en consecuencia. En Linux:

cat /proc/$PID/status | grep VmLck

Usted probablemente tendrá que hacer lo mismo en C (leer /proc línea por línea y la búsqueda de VmLck), ya que se crea esta información en la función task_mem (en array.c) que me Don No creo que pueda acceder directamente. Algo así como:

#include <unistd.h> 
#include <stdlib.h> 
#include <stdio.h> 

char cwd[PATH_MAX]; 
sprintf(cwd, "/proc/%d/status", getpid()); 

FILE* fp = fopen(cwd, "r"); 
if(!fp) { 
    exit(EXIT_FAILURE); 
} 

while((read = getline(&line, &len, fp)) != -1) { 
    // search for line starting by "VmLck" 
} 
+0

formato más corto: FILE * fp = fopen ("/ proc/self/status", "r"); – milton

Cuestiones relacionadas