
Тема 7. Межпроцессные коммуникации.
Не все процессы являются самодостаточными. Многим требуется информация от других процессов, либо они сами должны какую-либо информацию сообщать. Поэтому в ОС встраиваются механизмы, которые обеспечивают межпроцессное взаимодействие(Interprocess Communication - IPC). В историческом плане сначала появилась необходимость в коммуникации процессов, выполняющихся на одном компьютере. В дальнейшем же, с развитием сетевых технологий появилась потребность в средствах для взаимодействия процессах, выполняющихся на разных компьютерах в сети. Особенно сложна такая задача, если компьютеры строятся на базе разных платформ под управлением разных ОС.
Под однонаправленной связью понимается связь, при которой каждый процесс может использовать данный канал либо только для приема информации, либо только для ее передачи. При двунаправленной связи процесс может использовать канал и для приема, и для передачи. В коммуникации принято назвать однонаправленную связь симплексной, двунаправленную связь с поочередной передачей информации в разных направлениях – полудуплексной, а двунаправленную связь с одновременной передачей в разных направлениях – дуплексной. Способ коммуникации принято считать надежным, если при обмене данными выполняются 4 условия:
Не происходит потери информации.
Не происходит повреждения информации.
Не появляется лишняя информация.
Не нарушается порядок данных в процессе обмена.
7.1. Программные каналы.
Программные каналы (pipes) – средства обмена информации между процессами, организованные в виде специального файла. Выборка и помещение информации в такой файл происходит по правилу «первый пришел - первый обслужился (FIFO). При работе с файлом всегда используется потоковая модель данных. Переданные через канал данные никак не интерпретируются. Длина передаваемых сообщений не контролируется. Сразу несколько процессов клиентов могут писать в файл, а один процесс-сервер может читать его и обмениваться с клиентом сообщениями. При этом сообщения никак не отделяются друг от друга, и сервер сам должен определять, кто из клиентов и какое сообщение ему прислал. Попытка записи в файл, который никто не читает, приведет к блокировке процесса-писателя до появления процесса-читателя, и наоборот. Чаще всего каналы используются для передачи непрерывного потока данных. Каналы делятся на анонимные (anonymous pipes) и именованные (named pipes). Анонимные каналы используются достаточно редко и связывают лишь родственные процессы, передавая поток вывода процесса на поток ввода другого. Если посторонний процесс получит дескриптор анонимного канала не родственного ему процесса, то этот дескриптор вне контекста своего процесса потеряет всякий смысл, и злоумышленник ничего не сможет сделать с процессом. Если же паразитный процесс проникнет в родственный процесс и попытается перегрузить процесс потоком ненужных данных, то сработает алгоритм защиты в операционной системе. Если процесс-читатель не успевает обрабатывать данные, система автоматически приостанавливает передачу, не давая атакуемому родственному процессу заглохнуть, причем процесс-читатель сам решает, принимать дальше поток данных или закрыть канал.
Именованные каналы доступны всем процессам в системе, в том числе и исполняющимся на узлах в сети. Для открытия именованного канала необходимо иметь привилегии, но для создания канала такие привилегии необязательны. Угроза внедрения подложных каналов весьма серьёзна, поскольку именованные каналы активно используются систему для передачи зашифрованных паролей и удаленного управления системой. Именованные каналы имеют еще один серьёзный недостаток. Обработка каждого нового подключения требует выделения определенных ресурсов, а максимальное количество создаваемых каналов неограниченно. Создавая новые каналы, злоумышленник займет все ресурсы, и система рано или поздно зависнет. Даже если максимальное число каналов ограничено, злоумышленник просто займет все свободные ресурсы, не оставив места для остальных нормальных процессов.
7.2. Сокеты.
Механизм межпроцессного взаимодействия, основанный на сокетах более гибкий, чем каналы. Сокет является конечной точкой коммуникации, доступной через дескриптор так же, как и канал. Каждый из 2 процессов, участвующих во взаимодействии может создать сокет, а затем ОС соединит эти конечные точки для получения надежно канала передачи данных и обмена сообщениями. Прозрачность сокетов позволяет ядру перенаправить вывод одного процесса на вход другого, работающего на узле в сети. Главное отличие сокетов от каналов состоит в том, что каналы требуют наличие общего родительского процесса для установки коммуникации. Соединение между сокетами может быть установлено двумя несвязанными процессами. Это очень важная технология, т.к. именно она отвечает за обмен данными в сети Интернет. Кроме того, сокеты часто используются в крупных локальных сетях. В современных ОС процедура работы с сокетами вкладывается в прикладной программный интерфейс.
7.3 Очереди сообщений.
В отличие от программных каналов очереди сообщений допускают более гибкую организацию взаимодействия. Здесь необязательно существование парных процессов писателя и читателя. Существует некоторая очередь сообщений, которое используется как хранилище сообщений для любых процессов. При формировании очереди не используется потоковая модель данных. Каждое сообщение имеет строго определенную структуру – тип и данные. В сообщении допустимы любые данные. Их объем определяется процессом и может быть произвольным, ограниченным лишь памятью, отведенной под очередь. Ядро никак не интерпретирует содержание сообщений, и лишь обеспечивают их размещение и выборку в соответствии с указанным типом. Очереди имеют преимущества по сравнению с каналом. Например, чтобы осуществить дуплексная связь между 2 процессами, нужно создать 2 канала. С другой стороны, можно обойтись одной очередью, если различать сообщения по типу: от клиента к серверу и наоборот. Кроме того, имеется возможность извлекать сообщения не только по принципу FIFO, но и в произвольном порядке. Эта особенность широко используется при построении систем с приоритетным обслуживанием. Сообщения представляют собой еще один тип неавторизированного межпроцессного взаимодействия, т.е. любой процесс, независимо от уровня своих привилегий может послать сообщение другому процессу. Это снижает безопасность механизма. Однако запретить межпроцессную рассылку сообщений невозможно, поскольку это вызовет проблему совместимости и приведет к неработоспособности большого количества программ.
7.4. Разделяемая память.
Этот способ взаимодействия реализуется через технологию отображения файлов на оперативную память (File Mapping). Этот механизм позволяет осуществлять доступ к файлу, будто это обыкновенный массив, хранящийся в памяти, при этом сам файл в память явно не загружается. Этот подход дает возможность работать с таким отображенным файлом сразу нескольким процессам. Таким образом, можно создать объект, но не ассоциировать его с каким-то конкретным файлом. Получаемая область памяти будет общей для процессов. Единицей разделяемой памяти являются сегменты, свойства которых зависят от аппаратных особенностей. Работая с разделяемой памятью, процессы должны согласовывать свои действия с помощью механизмов синхронизации. Разделение памяти обеспечивает наиболее быстрый обмен данными.
7.5. Библиотеки динамической компоновки.
Библиотеки динамической компоновки (DLL) также могут обеспечивать обмен данными между процессами. Когда в рамках DLL объявляется переменная, ее можно сделать разделяемой. Все процессы, обращающиеся к библиотеке, для таких переменных будут использовать одно и то же место физической памяти.
7.6. Протокол динамического обмена данными.
Этот протокол (Dynamic Data Exchange, OLE, ActiveX) выполняет все основные функции обмена данными между приложениями. Протокол подходит для задач, не требующих продолжительного взаимодействия с пользователем. В некоторых случаях пользователю нужно только установить соединение между программами, а обмен данными происходит без его участия. Это универсальная технология, и межпроцессный обмен – лишь одно и ее многих применений. Специально для обмена данными между процессами в протоколе существует интерфейс IDataObject. Для обмена данными по сети используется интерфейс DCom.
7.7. Почтовые слоты.
Почтовые слоты(mail slots) – механизм однонаправленной межпроцессной коммуникации. Если приложению известно имя слота, оно может помещать туда сообщения, а процесс-читатель этого слота может их оттуда извлекать и обрабатывать. Основное преимущество этого способа – возможность передавать сообщения по локальной сети сразу нескольким компьютерам за одну операцию. Для этого приложения - приемники создают слоты с одним и тем же именем. Когда какое-либо приложение помещает сообщение этот слот, приложения-приемники получают его одновременно.
7.8. Объекты синхронизации.
Объекты синхронизации тоже можно отнести к механизмам межпроцессной коммуникации. Объем передаваемых данных в этом случае очень невелик, но именно эти объекты целесообразно использовать, если необходимо передать информацию по типу «я закончил работу» или «я начинаю работать с разделяемым ресурсам» и т.д. .
7.9. Microsoft Message Queue (MSMQ)
Этот протокол обеспечивает рассылку сообщений между приложениями с помощью очереди приложений. Основное его отличие от стандартной очереди сообщения состоит в том, что он может работать с удаленными процессами, а также процессами, которые в данный момент недоступны, например, не запущены. Доставка сообщения по адресу гарантируется. Оно ставится в специальную очередь и находится там до тех пор, пока не появится возможность его доставить.