mlockall - запрещает страничный обмен всему процессу
НАЗВАНИЕmlockall - запрещает страничный обмен всему процессу
СИНТАКСИС
#include
int mlockall(int flags);
ОПИСАНИЕ
mlockall запрещает страничный обмен для всех страниц в
области памяти вызывающего процесса. Это касается всех
страниц сегментов кода, данных и стека, разделяемых
библиотек, пользовательских данных ядра, разделяемой
памяти и отраженных в память файлов. Все эти страницы
будут помещены в ОЗУ, если вызов mlockall был выполнен
успешно, и останутся там до тех пор, пока не будут
освобождены вызовами munlock или munlockall, или если
процесс завершит работу или запустит другую программу при
помощи exec. Блокировка страниц не наследуется дочерними
процессами, созданными при помощи fork. Блокировка памяти
используется, в основном, в двух случаях: в алгоритмах
реального времени и в работе с защищенными данными.
Программам реального времени необходимы предсказуемые
задержки в работе, и страничный обмен наряду с системой
переключения процессов может привести к неожиданным
задержкам в работе. Такие приложения часто переключаются
в режим реального времени при помощи функции
sched_setscheduler. Криптографические системы защиты
данных очень часто содержать критичные данные, например,
пароли или секретные ключи в структурах данных. В
результате страничного обмена эти данные могут попасть в
область подкачки, находящуюся на устройстве длительного
хранения (таком, как жесткий диск), где к этим данным
после того, как они пропадут из памяти, может получить
доступ практически кто угодно. Такие программы обычно
используют функцию mlock для блокировки небольших областей
памяти, в которых находятся защищаемые данные. Параметр
flags формируется побитовым сложением следующих констант:
MCL_CURRENT Заблокировать все страницы, находящиеся в
адресном пространстве процесса на текущий
момент.
MCL_FUTURE Заблокировать все страницы, которые будут
переданы процессу в будущем. Это могут быть
страницы растущей кучи или стека, а также
отраженные в память файлы и разделяемые
области памяти.
Если была задана константа MCL_FUTURE, и после этого
количество заблокированных процессом страниц превысит
лимит, то системный вызов, потребовавший новые страницы,
их не получит и пошлет сообщение об ошибке ENOMEM. Если
новые страницы будут затребованы растущим стеком, то ядро
не разрешит увеличение стека и пошлет процессу сигнал
SIGSEGV. Процессы, выполняющиеся в реальном времени,
должны резервировать для себя достатчное количество
страниц в стеке до входа в процедуры, критические по
времени, чтобы системные вызовы не привели к сбою работы
процесса. Этого можно достичь путем вызова функции,
которая содержит достаточно большой массив; в этот массив
функция записывает данные для того, чтобы задействовать
страницы памяти. Таким образом, стеку будет выделено
достаточное количество страниц, и они будут заблокированы
в ОЗУ. Запись в эти страницы предотвращает возможные
ошибки типа copy-on-write, которые могут возникнуть в
критичной по времени выполнения части программы.
Блокированные отрезки памяти не попадают в стек, т.е.
страницы, блокированные несколько раз при помощи функций
mlockall или mlock, будут разблокированы одним вызовом
munlockall. Страницы, помещенные в несколько областей
памяти или принадлежащие нескольким процессам, будут
заблокированы в памяти до тех пор, пока они заблокированы
хотя бы в одной из областей памяти или, по меньшей мере,
одним процессом. В POSIX-системах, в которых доступны
mlock и munlock, в задана константа _POSIX_MEM-
LOCK_RANGE , а значение PAGESIZE в задает
количество байтов в странице.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При удачном завершении вызова возвращается 0. При ошибке
возвращается -1, а переменная errno устанавливается
соответствующиим образом.
КОДЫ ОШИБОК
ENOMEM Процесс попытался превысить максимальное заданное
для него количество блокированных страниц.
EPERM У процесса, вызвавшего эту функцию, нет
соответствующих прав. Блокировка страниц разрешена
только процессам, имеющим привилегии root.
EINVAL Было задано неверное значение поля flags.
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1b, SVr4. SVr4 описывает дополнительный код ошибки
EAGAIN.