mlock
запрещает страничный обмен памяти в области, начинающейся с адреса
addr
длиной
len
байтов. Все страницы памяти, включающие в себя часть заданной области
памяти, будут помещены в ОЗУ, если системный вызов
mlock
проделан успешно, и они останутся в памяти до тех пор, пока
не будут освобождены функциями
munlock
или
munlockall,
пока страницы не будут высвобождены при помощи
munmap
или пока процесс не завершить работу, либо не запустит другую
программу при помощи
exec.
Блокировка страниц не наследуется дочерними процессами, созданными
при помощи
fork.
Блокировка памяти используется, в основном, в двух случаях:
в алгоритмах реального времени и в работе с защищенными данными.
Программам реального времени необходимы предсказуемые
задержки в работе, а страничный обмен (наряду с системой переключения
процессов) может привести к неожиданным задержкам в работе.
Режим таких приложений часто переключается на режим реального
времени при помощи функции
sched_setscheduler.
Криптографические системы защиты данных очень часто содержат важные
данные, например, пароли или секретные ключи, в структурах данных. В
результате страничного обмена эти данные могут попасть в область подкачки,
находящуюся на устройстве длительного хранения (таком, как жесткий диск),
где к этим данным после того, как они пропадут из памяти, может получить
доступ практически кто угодно.
(Помните, что в режиме "засыпания" на лэптопах и некоторых компьютерах
на жесткий диск сохраняется копия памяти ОЗУ системы, независимо
от блокировок памяти).
Блокировка памяти не попадает в стек, т.е., страницы, блокированные несколько
раз при помощи функций
mlock
или
mlockall
, будут разблокированы одним вызовом
munlock
(с соответствующими параметрами) или
munlockall.
Страницы, помещенные в несколько областей памяти или принадлежащие
нескольким процессам, будут заблокированы в памяти до тех пор, пока
они заблокированы хотя бы в одной из областей памяти или хотя бы
одним процессом.
В POSIX-системах, в которых доступны
mlock
и
munlock
, в <unistd.h> задана константа
_POSIX_MEMLOCK_RANGE ,
а значение
PAGESIZE
в <limits.h> задает количество байтов на странице.
ЗАМЕЧАНИЯ
В Linux
addr
автоматически округляется вниз до ближайшей границы страницы.
Однако, согласно POSIX 1003.1-2001, возможны реализации этой функции,
требующие, чтобы
addr
был выравнен по границе страниц, поэтому переносимые приложения
должны гарантировать выравнивание.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При удачном завершении вызова возвращается 0. При ошибке возвращается
-1, а переменной
errno
присваивается номер ошибки, и ни с одной из блокировок
памяти ничего не происходит.
НАЙДЕННЫЕ ОШИБКИ
ENOMEM
Часть заданной области памяти не соответствует страницам в области
памяти процесса, или процесс попытался превысить максимально заданное
ему количество блокированных страниц.
Не-суперпользовательским процессам разрешено блокировать до их текущего
RLIMIT_MEMLOCK
ограничения ресурсов.
EPERM
У процесса, вызвавшего эту функцию, нет соответствующих прав. Блокировка
страниц разрешена только процессам, имеющим привилегии root.
Вызвавший процесс не имеет нужных прав и привилегий. Процессам
разрешено блокировать страницы, если они работают с возможностью
CAP_IPC_LOCK
(обычно оно разрешено только для root) или если их текущее ограничение
RLIMIT_MEMLOCK
не равно нулю.
EINVAL
len
- не является положительным числом.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1b, SVr4. SVr4 описывает дополнительный код ошибки EAGAIN.