В Linux 2.6.16 было добавлено три новых нестандартных значения advice: MADV_DONTFORK, MADV_DOFORK и MADV_REMOVE. В Linux 2.6.32 и 2.6.33 появилось еще четыре нестандартных значения: MADV_HWPOISON, MADV_SOFT_OFFLINE, MADV_MERGEABLE и MADV_UNMERGEABLE. Эти константы предназначены для особых случаев и описаны в справочной странице madvise(2).
В большинстве реализаций UNIX вызов madvise() поддерживает для аргумента advice как минимум те константы, которые описаны выше. Но в SUSv3 данный программный интерфейс носит другое имя, posix_madvise(), а ко всем соответствующим значениям advice добавляется префикс POSIX_. Таким образом, стандартные константы выглядят как POSIX_MADV_NORMAL, POSIX_MADV_RANDOM, POSIX_MADV_SEQUENTIAL, POSIX_MADV_WILLNEED и POSIX_MADV_DONTNEED. Этот альтернативный интерфейс реализован в библиотеке glibc (начиная с версии 2.2) и использует вызовы madvise(), однако в некоторых UNIX-системах не поддерживается.
Согласно стандарту SUSv3 функция posix_madvise() не должна влиять на семантику программы. Но в библиотеке glibc до версии 2.7 операция POSIX_MADV_DONTNEED была реализована с помощью вызова madvise() с флагом MADV_DONTNEED, который идет вразрез с этим требованием (как было описано выше). Начиная с glibc 2.7, при использовании константы POSIX_MADV_DONTNEED функция-обертка posix_madvise() не выполняет никаких действий и, следовательно, не влияет на семантику программы.
В данной главе были рассмотрены различные операции, которые можно применять к виртуальной памяти процесса:
• системный вызов mprotect() изменяет защиту участка виртуальной памяти;
• системные вызовы mlock() и mlockall() «запирают» участок виртуального пространства в рамках физической памяти и не дают сбросить его на диск;
• системный вызов mincore() сообщает, какие страницы виртуального пространства находятся в физической памяти;
• системный вызов madvise() и функция posix_madvise() дают возможность сообщить ядру о потенциальной модели поведения процесса в контексте использования участка виртуальной памяти.
46.1. Проверьте влияние ограничения RLIMIT_MEMLOCK, написав программу, которая устанавливает соответствующее ограничение и затем пытается заблокировать больше памяти, чем позволено.
46.2. Напишите программу, проверяющую действие вызова madvise() с флагом MADV_DONTNEED на отображение типа MAP_PRIVATE, доступное для записи.
47. Введение в межпроцессное взаимодействие стандарта POSIX
Стандарт POSIX.1b содержит ряд расширений реального времени, которые формируют набор IPC-механизмов (одной из целей создателей данного стандарта было разработать средства межпроцессного взаимодействия, лишенные недостатков аналогичных механизмов из состава System V). В совокупности эти механизмы называются POSIX IPC. Их можно разделить на три категории.
•
•
В данной главе мы познакомимся со средствами POSIX IPC, уделяя внимание характерным для них свойствам.
Механизмы POSIX IPC имеют целый ряд общих свойств, которые будут подробно рассмотрены на следующих нескольких страницах. В табл. 47.1 представлены их программные интерфейсы.
Если не считать упоминаний в табл. 47.1, в этой главе будет проигнорирован тот факт, что POSIX-семафоры бывают двух видов: именованные и анонимные. Первые похожи на другие механизмы POSIX IPC, описанные в данной главе: они имеют имена и доступны для любого процесса с подходящими правами доступа к заданному объекту. У анонимных семафоров нет соответствующего идентификатора; они помещаются на участок памяти, который разделяется несколькими процессами (или потоками одного процесса). Семафоры обоих этих типов будут подробно описаны в главе 49.
Таблица 47.1. Перечень программных интерфейсов для работы с объектами POSIX IPC