Читаем Linux API. Исчерпывающее руководство полностью

Системный вызов mlock() блокирует все страницы вызывающего процесса в диапазоне виртуальных адресов длиной length, начинающегося с addr. В отличие от аналогичного аргумента в ряде других вызовов, связанных с памятью, addr не обязательно выравнивать по странице; ядро автоматически выбирает ближайшую страницу, адрес начала которой не превышает addr. Однако стандарт SUSv3 разрешает реализации требовать, чтобы аргумент addr был кратным размеру страницы в системе, и портируемые приложения, использующие вызовы mlock() и munlock(), должны следовать этому требованию.

Поскольку единицей блокирования является целая страница, конец блокируемого участка совпадает с концом следующей страницы, адрес которой больше length плюс addr. Например, в системе, где размер страницы равен 4096 байтам, вызов mlock(2000, 4000) заблокирует диапазон байтов с 0 по 8191.

Чтобы узнать, сколько всего памяти заблокировал текущий процесс, можно прочитать поле VmLck в файле /proc/PID/status.

После успешного вызова mlock() все страницы в заданном диапазоне гарантированно запираются в физической памяти. Вызов mlock() дает сбой, если для блокирования всех запрашиваемых страниц не хватает физической памяти или запрос нарушает ограничение на ресурсы RLIMIT_MEMLOCK.

Пример использования вызова mlock() показан в разделе 46.2.

Системный вызов munlock() выполняет обратную операцию, удаляя из памяти блокировку, установленную ранее вызывающим процессом. Аргументы addr и length интерпретируются так же, как и в mlock(). Разблокировка набора страниц не гарантирует, что они перестанут храниться в физическом памяти, — они будут удалены оттуда только в том случае, если память потребуется другим процессам.

Блокировки могут удаляться не только вручную, благодаря вызову munlock(), но и автоматически. Это происходит в следующих ситуациях:

• при завершении процесса;

• при удалении заблокированных страниц из отображения с помощью вызова munmap();

• если заблокированные страницы перекрываются в результате вызова mmap() с флагом MAP_FIXED.

Подробности о семантике блокирования памяти

Ниже мы рассмотрим некоторые особенности семантики блокирования памяти.

Блокировки памяти не наследуются потомком, созданным путем вызова fork(), и не сохраняются на протяжении работы exec().

Если несколько процессов разделяют какой-то набор страниц (например, отображение типа MAP_SHARED), то эти страницы остаются запертыми в физической памяти, пока хотя бы один процесс удерживает соответствующую блокировку.

Блокировки памяти не накапливаются в рамках одного процесса. Если процесс многократно вызовет mlock() для определенного диапазона виртуальных адресов, то это приведет к установке всего лишь одной блокировки, которую можно будет убрать с помощью единственного вызова munlock(). С другой стороны, при отображении одних и тех же страниц (то есть того же файла) на разные участки памяти того же процесса и блокировке каждого из этих отображений страницы будут оставаться запертыми в физической памяти до тех пор, пока все отображения не будут разблокированы.

Тот факт, что единицей измерения блокировок памяти являются страницы, а также то, что блокировки не могут накапливаться, означает следующее: независимое применение вызовов mlock() и munlock() к разным структурам данных на одной виртуальной странице логически неверно. Представьте, к примеру, что у нас есть две структуры данных внутри одной страницы виртуальной памяти и на них ссылаются указатели p1 и p2. Теперь выполним следующие вызовы:

mlock(*p1, len1);

mlock(*p2, len2); /* На самом деле ни на что не влияет */

munlock(*p1, len1);

Все вышеприведенные вызовы завершатся успешно, но в результате будет разблокирована вся страница; таким образом, структура данных, на которую указывает p2, не запирается в физической памяти.

Обратите внимание на то, что семантика операции shmctl() SHM_LOCK отличается от семантики вызовов mlock() и mlockall():

• после операции SHM_LOCK страницы блокируются, только если последующие обращения к ним приводят к отказу. Вызовы mlock() и mlockall() возвращаются только после того, как проверят запертые в физической памяти страницы на отказы;

• операция SHM_LOCK работает скорее с разделяемым сегментом памяти, чем с процессом (по данной причине значение поля VmLck в файле /proc/PID/status не учитывает размер любых подключенных сегментов памяти типа System V, которые были заблокированы операцией SHM_LOCK). Это значит, что после отказа страница остается в физической памяти, даже если все процессы отключатся от соответствующего сегмента памяти. Участок, запертый в физической памяти с помощью вызова mlock() (или mlockall()), остается там только до тех пор, пока хотя бы один процесс удерживает блокировку данного участка.

Блокировка и разблокировка всей памяти процесса

Для выполнения этих операций процесс может использовать вызовы mlockall() и munlockall().

#include

int mlockall(int flags);

int munlockall(void);

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных