8.8. Семейство функций mlock(): блокирование физической памяти
8.8. Семейство функций mlock(): блокирование физической памяти
Функции семейства mlock() позволяют программе блокировать часть своего адресного пространства в физической памяти. Заблокированные страницы не будут выгружены операционной системой в раздел подкачки, даже если программа долго к ним не обращалась.
Блокирование физической памяти важно в программах реального времени, поскольку задержки, связанные с выгрузкой и подкачкой страниц, могут оказаться слишком длинными или возникать в самый неподходящий момент. Приложения, заботящиеся о безопасности своих данных, могут устанавливать запрет на выгрузку важных данных в файл подкачки, в котором они станут доступны злоумышленнику после завершения программы.
Чтобы заблокировать область памяти, достаточно вызвать функцию mlock(), передав ей указатель на начало области и значение длины области. ОС Linux разбивает память на страницы и соответственно блокирует ее постранично: любая страница, которую захватывает (хотя бы частично) заданная в функции mlock() область памяти, окажется заблокированной. Определить размер системной страницы позволяет функция getpagesize(). В Linux-системах, работающих на платформе x86, эта величина составляет 4 Кбайт.
Вот как можно выделить и заблокировать 32 Мбайт оперативной памяти:
const int alloc_size = 32 * 1024 * 1024;
char* memory = malloc(alloc_size);
mlock(memory, alloc_size);
Выделение страницы и блокирование ее с помощью функции mlock() еще не означает, что эта страница будет предоставлена данному процессу, поскольку выделение памяти может происходить в режиме копирования при записи.[29] Следовательно, каждую страницу необходимо проинициализировать:
size_t i;
size_t page_size = getpagesize();
for (i = 0; i < alloc_size; i += page_size)
memory[i] = 0;
Процессу, осуществляющему запись на страницу, операционная система предоставит в монопольное использование ее уникальную копию.
Для разблокирования области памяти следует вызвать функцию munlock(), передав ей те же аргументы, что и функции mlock().
Функция mlockall() блокирует все адресное пространство программы и принимает единственный флаговый аргумент. Флаг MCL_CURRENT означает блокирование всей выделенной на данный момент памяти, но не той, что будет выделяться позднее. Флаг MCL_FUTURE задает блокирование всех страниц, выделенных после вызова функции mlockall(). Сочетание флагов MCL_CURRENT | MCL_FUTURE позволяет блокировать всю память программы, как текущую, так и будущую.
Блокирование больших объемов памяти, особенно с помощью функции mlockall(), несет потенциальную угрозу всей системе. Несправедливое распределение оперативной памяти приведет к катастрофическому снижению производительности системы, так как остальным процессам придется сражаться друг с другом за небольшой "клочок" памяти, вследствие чего они будут постоянно выгружаться на диск и загружаться обратно. Может даже возникнуть ситуация, когда оперативная память закончится и система начнет уничтожать процессы. По этой причине функции mlock() и mlockall() доступны лишь суперпользователю. Если какой-нибудь другой пользователь попытается вызвать одну из этих функций, она вернёт значение -1, а в переменную errno будет записан код EPERM.
Функция munlосkall() разблокирует всю память текущего процесса.
Контролировать использование памяти удобнее всего с помощью команды top. В колонке SIZE ее выходных данных показывается размер виртуального адресного пространства каждой программы (общий размер сегментов кода, данных и стека с учетом выгруженных страниц). В колонке RSS приводится объем резидентной части программы. Сумма значений в столбце RSS не может превышать имеющийся объем ОЗУ, а суммарный показатель по столбцу SIZE не может быть больше 2 Гбайт (в 32-разрядных версиях Linux).
Функции семейства mlock() объявлены в файле <sys/mman.h>.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Семейство шрифта
Семейство шрифта Свойство font-family указывает браузеру шрифт или список шрифтов, которыми должен отображаться текст. Не надо забывать, что заданный вами шрифт может быть не установлен на машине клиента. Тогда браузер отобразит текст на экране первым шрифтом, который найдет
9.1.4. Запуск новой программы: семейство exec()
9.1.4. Запуск новой программы: семейство exec() После запуска нового процесса (посредством fork()) следующим шагом является запуск в процессе другой программы. Имеется несколько функций, которые служат различным целям:#include <unistd.h> /* POSIX */int execve(const char *filename, /* Системный вызов */char
Семейство протоколов TCP/IP
Семейство протоколов TCP/IP В названии семейства присутствуют имена двух протоколов — TCP и IP. Это, конечно, не означает, что данными двумя протоколами исчерпывается все семейство. Более того, как будет видно, названные протоколы выполняют различные функции и используются
1.1.1 Семейство ОС типа UNIX
1.1.1 Семейство ОС типа UNIX Операционная система - это комплекс программ, который обеспечивает управление аппаратными средствами компьютера, организует работу с файлами (в том числе запуск и управление выполнением программ), а также реализует взаимодействие с
Мост между физической и логической структурой базы данных
Мост между физической и логической структурой базы данных Мы рассмотрели в общих чертах физическую структуру файлов базы данных. Теперь надо перейти к логической структуре базы данных. Чтобы переход произошел без каких-то "предельных переходов" в понятиях, оставив после
9.9. Блокирование в NFS
9.9. Блокирование в NFS Аббревиатура NFS расшифровывается как Network File System (сетевая файловая система); эта система подробно обсуждается в главе 29 [22]. Блокировка записей fcntl представляет собой расширение NFS, поддерживаемое большинством ее реализаций. Обслуживается эта
Совет 46. Передавайте алгоритмам объекты функций вместо функций
Совет 46. Передавайте алгоритмам объекты функций вместо функций Часто говорят, что повышение уровня абстракции языков высокого уровня приводит к снижению эффективности сгенерированного кода. Александр Степанов, изобретатель STL, однажды разработал небольшой комплекс
Семейство POWERQUEST
Семейство POWERQUEST Общеизвестно: там, где речь заходит о жестком диске и его обслуживании, никак не обойтись без утилит от PowerQuest (http://www.powerquest.com). Долгое время они были единственными на рынке, и лишь позднее у каждой программы объявились конкуренты, к примеру в лице описанных
12.3.5. Адаптеры функций для объектов-функций
12.3.5. Адаптеры функций для объектов-функций В стандартной библиотеке имеется также ряд адаптеров функций, предназначенных для специализации и расширения как унарных, так и бинарных объектов-функций. Адаптеры – это специальные классы, разбитые на следующие две
2.3. Создание физической модели данных
2.3. Создание физической модели данных 2.3.1. Уровни физической модели Различают два уровня физической модели:трансформационная модель (Transformation Model); модель СУБД (DBMS Model). Физическая модель содержит всю информацию, необходимую для реализации конкретной БД. Трансформационная
2.3.1. Уровни физической модели
2.3.1. Уровни физической модели Различают два уровня физической модели:трансформационная модель (Transformation Model); модель СУБД (DBMS Model). Физическая модель содержит всю информацию, необходимую для реализации конкретной БД. Трансформационная модель содержит информацию для
19.11.2. Вызов функций из файла функций
19.11.2. Вызов функций из файла функций Мы уже рассматривали, каким образом функции вызываются из командной строки. Эти типы функций обычно используются утилитами, создающими системные сообщения.А теперь воспользуемся снова описанной выше функцией, но в этом случае