Сколько памяти заблокировано в процессе

Используя getrlimit(RLIMIT_MEMLOCK), можно получить допустимый объем заблокированной памяти, которую может выделить процесс (mlock() или mlockall()).

Но как получить текущий заблокированный объем памяти?

Например, getrusage() не возвращает никакой информации.

В Linux можно прочитать /proc/self/status и извлечь количество заблокированной памяти из строки, начинающейся с VmLck.

Есть ли портативный способ получить объем заблокированной памяти, который будет работать в Linux, *BSD и других POSIX-совместимых системах?


person Yann Droneaud    schedule 23.04.2011    source источник
comment
POSIX указывает, что вызовы mlock и mlockall не будут выполняться с помощью ENOSYS, если вызов не реализован. Это означает, что не существует гарантированного переносимого интерфейса для блокировки/разблокировки, переносимого в том смысле, что он гарантированно будет реализован. Также. В POSIX не указан способ перечисления заблокированных страниц памяти процесса.   -  person jim mcnamara    schedule 25.04.2011


Ответы (1)


Вероятно, вам потребуется проверить каждую систему и реализовать ее соответствующим образом. В Linux:

cat /proc/$PID/status | grep VmLck

Вероятно, вам придется сделать то же самое в C (прочитайте /proc построчно и найдите VmLck), так как эта информация создается в функции task_memarray.c), к которым я не думаю, что вы можете получить доступ напрямую. Что-то вроде:

#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"
}
person Giovanni Funchal    schedule 26.04.2011