Заблокировать весь диапазон адресного пространства процесса
#include <sys/mman.h>
int mlockall( int flags );
- flags
- Флаги, указывающие, какие страницы блокировать. Один или несколько из следующих битов:
- MCL_CURRENT
- Блокировать страницы, в настоящее время смапированные в адресное пространство процесса.
- MCL_FUTURE
- Блокировать страницы, которые будут смапированы в адресное пространство процесса в будущем, когда будет выполняться мапирование.
libc
Функция mlockall() блокирует все страницы, мапированные адресным пространством процесса, и делает их резидентными до тех пор, пока они не будут разблокированы, или пока процесс не завершится или не запустит другой процесс. То, какие страницы будут заблокированы, зависит от параметра flags.
Резидентная память — это термин, используемый для обозначения того, что адреса всегда находятся в физической памяти.
Необходимо иметь права суперпользователя, чтобы заблокировать страницы. При попытке заблокировать страницы используйте любой из следующих подходов:
- Тщательно контролируемый подход
- Блокировать страницы одну за другой, вызывая mmap(), а затем mlock().
- Глобальный подход
- Блокировать все страницы одновременно, выполнив одно из следующих действий:
- Вызов функции mlockall(
MCL_FUTURE
), после чего один или несколько вызовов функции mmap(). - При необходимости вызов функции mmap(), а затем вызов функции mlockall(
MCL_CURRENT
).
- 0
- Успешное завершение.
- -1
- Возникла ошибка. Код ошибки записан в errno.
- EAGAIN
- Часть или вся память, заданная операцией, не может быть заблокирована при выполнении вызова.
- EINVAL
- Параметр flags равен нулю.
- ENOMEM
- Блокировка страниц, мапированных в указанном диапазоне, превысит установленный реализацией предел объёма памяти, которую может заблокировать процесс. Это ограничение определяется реализацией и зависит от значения
RLIMIT_MEMLOCK
структуры rlimit. - EPERM
- Вызывающий процесс не имеет соответствующих прав для выполнения запрошенной операции.
POSIX 1003.1 Process Memory Locking
- Нет
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Да
- В потоке
- Да
mlock(), mmap(), munlock(), munlockall()
Предыдущий раздел: Описание API системной библиотеки