Методы IPC в операционных системах.
IPC (Inter-Process Communication – межпроцессное взаимодействие) — это набор способов обмена данными между множеством потоков в одном или более процессах. Процессы могут быть запущены на одном или более компьютерах, связанных между собой сетью.
Процесс – экземпляр выполняющейся программы:
- код и данные необходимые выполняемой программой;
- работа процессора по выполнению программы.
Методы IPC зависят от пропускной способности и задержки взаимодействия между потоками и типа передаваемых данных.
Методы IPC:
1. Обмен сообщениями. Сообщение реализуется путём посылки пакетов информации получателям, которые могут означать множество вещей: вызов функций, сигналы, данные. Этот термин широко используется в MPI.
2. Синхронизация.Приведение двух или нескольких процессов к такому их протеканию, когда определённые стадии разных процессов совершаются в определённом порядке, либо одновременно.Наиболее часто используемые средства синхронизации:
- Сигналы. Асинхронное уведомление процесса о каком-либо событии.
SIG_DFL - Подразумеваемые действия, зависящие от сигнала.
SIG_IGN - Игнорировать сигнал. Доставка сигнала не оказывает воздействия на процесс.
- Семафор. Объект, позволяющий войти в заданный участок кода не более чем n потокам. Определение введено Э. Дейкстрой.
- Мьютекс. Одноместный семафор, служащий в программировании для синхронизации одновременно выполняющихся потоков.
- Каналы (анонимные и именованные).
Анонимные (неименованные) каналы позволяют родственным процессам передавать информацию друг другу. Обычно такой канал используется для перенаправления стандартного ввода или вывода дочернего процесса так, что он может обмениваться данными со своим родительским процессом. Анонимные каналы не могут быть использованы в сети или неродственными процессами.
Именованные каналы используются для передачи данных между процессами, которые не являются родственными, и между процессами на разных компьютерах. Обычно, процесс-сервер создает именованный канал с широко известным именем или таким именем, которое предназначено для связи с клиентами. Процесс-клиент, который знает это имя, может открыть именованный канал в соответствии с ограничениями, наложенными сервером. После того как оба процесса присоединились к каналу, они могут обмениваться данными.
3. Разделяемая память. Позволяет осуществить обмен информацией не через ядро, а используя некоторую часть виртуального адресного пространства, куда помещаются и откуда считываются данные. После создания разделяемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним, как с обычным сегментом памяти. Недостатком такого обмена информацией является отсутствие каких бы то ни было средств синхронизации, однако для преодоления этого недостатка можно использовать технику семафоров.
Для работы с разделяемой памятью используются системные вызовы:
shmget — создание сегмента разделяемой памяти;
shmctl — установка параметров;
shmat — подсоединение сегмента памяти;
shmdt — отсоединение сегмента.
4. Вызов удаленных процедур(RPC - Remote Procedure Call). Класс технологий, позволяющих компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах).
Проблемы и задачи, которые необходимо решить при реализации RPC:
- Значения параметров должны копироваться с одного компьютера на другой. Для копирования параметров процедуры и результата выполнения через сеть выполняется их сериализация (процесс перевода какой-либо структуры данных в последовательность битов).
- В отличие от локального вызова удалённый вызов процедур обязательно использует транспортный уровень сетевой архитектуры (например, TCP).
- В реализации RPC участвуют как минимум два процесса — по одному в каждой машине. В случае если один из них аварийно завершится, второй будет безрезультатно ожидать ответа от умершего процесса.
- Проблема совместимости (неоднородность языков программирования и операционных сред) до сих пор не решена (пробовали решить с помощью введения одного общепринятого стандарта).
5. Очереди сообщений. Прежде чем процессы смогут обмениваться сообщениями, один из них должен создать очередь. Процессы, отправляющие или принимающие сообщение, могут приостанавливаться, если требуемую операцию невозможно выполнить немедленно. В частности, могут быть отложены попытки отправить сообщение в заполненную до отказа очередь, получить сообщение из пустой очереди и т.п. ("операции с блокировкой"). Если же указано, что приостанавливать процесс нельзя, "операции без блокировки" либо выполняются немедленно, либо завершаются неудачей.
msgget() – получение идентификатора очереди сообщения;
msgctl() – управление;
msgsnd() – отправка;
msgrсv() – прием.