44.6. Сервер в листинге 44.7 (fifo_seqnum_server.c) полагается на предсказуемое поведение клиентских процессов. Но если клиент создаст клиентскую очередь FIFO и отправит серверу запрос, но сама очередь при этом не будет открыта, то попытка сервера ее открыть заблокируется, а запросы других клиентов останутся без ответа (такие действия, если они выполняются умышленно, можно квалифицировать как DoS-атаку — от англ. denial-of-service attack). Разработайте план для борьбы с данной проблемой. Дополните код сервера (а возможно, и клиента из листинга 44.8) соответствующим образом.
44.7. Напишите программу для проверки работы неблокирующих операций открытия и ввода/вывода в контексте очередей FIFO (см. раздел 44.9).
45. Отображение в память
Эта глава посвящена системному вызову mmap(), который предназначен для создания отображений в память. Они могут использоваться для межпроцессного взаимодействия, а также ряда других задач. Сначала мы кратко рассмотрим основные понятия, связанные с данным вызовом, а затем изучим его более глубоко.
Системный вызов mmap() создает в виртуальном адресном пространстве процесса новое
•
Данную процедуру также можно представить в виде отображения виртуального файла, который всегда содержит нули (что на самом деле ближе к действительности).
Участок памяти в отображении одного процесса можно разделять с отображением другого процесса (то есть записи таблицы со страницами каждого из процессов будут указывать на одни и те же страницы физической памяти). Этого можно достичь двумя способами:
• когда два процесса отображают один и тот же участок файла, страницы памяти, к которым они получают доступ, становятся для них общими;
• дочерний процесс, созданный с помощью вызова fork(), наследует копии родительских отображений, указывающих на те же страницы физической памяти, что и отображения родителя.
Когда два или более процесса разделяют одни и те же страницы, каждый из них может видеть изменения, вносимые в эти страницы другими процессами. Однако данное положение зависит от того, является отображение
•
•
Два атрибута отображений, описанных выше (файловые/анонимные, приватные/разделяемые), можно комбинировать четырьмя разными способами, как показано в табл. 45.1.
Таблица 45.1. Назначения разных видов отображения в память
Видимость изменений
Вид отображения
Файловое
Анонимное
Приватное
Инициализация памяти из содержимого файла
Выделение памяти
Разделяемое
Ввод/вывод, отображенный в память; разделение памяти между процессами (IPC)
Разделение памяти между процессами (IPC)
Ниже описано, как создается и используется каждый из четырех типов отображения.