Межпроцессное взаимодействие
Если абстрагироваться от вопросов синхронизации, то обмен данными между потоками одного процесса не представляет никакой сложности — имея общее адресное пространство и общие открытые файлы, потоки получают беспрепятственный доступ к данным друг друга. Другое дело — обмен данными потоков, выполняющихся в рамках разных процессов. Для защиты процессов друг от друга ОС возводит мощные изолирующие преграды, которые не только защищают процессы, но и не позволяют им передавать друг другу данные. Потоки разных процессов работают в разных адресных пространствах. Однако операционная система имеет доступ ко всем областям памяти, поэтому она может играть роль посредника в информационном обмене прикладных потоков. При необходимости в обмене данными поток обращается с запросом к ОС. По этому запросу ОС, пользуясь своими привилегиями, создает различные системные средства связи, такие, например, как каналы или очереди сообщений. Эти средства, так же как рассмотренные ранее средства синхронизации процессов, относятся к классу средств межпроцессного взаимодействия (Inter-Process Communications, IPC).Многие из средств межпроцессного обмена данными выполняют также и функции синхронизации: в том случае, когда данные для процесса-получателя отсутствуют, последний переводится в состояние ожидания средствами ОС, а при поступлении данных от процесса-отправителя процесс-получатель активизируется. Набор средств межпроцессного обмена данными в большинстве современных ОС выглядит следующим образом:
· каналы (pipes);
· именованные каналы (named pipes);
· очереди сообщений (message queues);
· разделяемая память (shared memory).
Кроме этого, достаточно стандартного набора средств, в конкретных ОС часто имеются и более специфические средства межпроцессного обмена, например средства среды STREAMS для различных версий Unix или почтовые ящики (mail slots) в ОС Windows.
Канал представляет собой буфер в оперативной памяти, поддерживающий очередь байтов по алгоритму FIFO. Для программиста, использующего системный вызов pipe, этот буфер выглядит как безымянный файл, в который можно писать и из которого можно читать, осуществляя тем самым обмен данными. Системный вызов pipe имеет одно существенное ограничение — обмениваться данными могут только родственные процессы, точнее процессы, которые имеют общего прародителя, создавшего данный конвейер.
Именованные каналы представляют собой развитие механизма обычных каналов. Такие каналы имеют имя, которое является записью в каталоге файловой системы ОС, поэтому они пригодны для обмена данными между двумя произвольными процессами или потоками этих процессов. Именованный канал является специальным файлом типа FIFO и не имеет области данных на диске. Создается именованный канал с помощью того же системного вызова, который используется и для создания файлов любого типа, но только с указанием в качестве типа файла параметра FIFO.
Механизм очередей сообщений похож на механизм каналов с тем отличием, что он позволяет процессам и потокам обмениваться структурированными сообщениями. При этом синхронизация осуществляется по сообщениям, то есть процесс, пытающийся прочитать сообщение, переводится в состояние ожидания в том случае, если в очереди нет ни одного полного сообщения. Очереди сообщений являются глобальными средствами коммуникаций для процессов операционной системы, как и именованные каналы, так как каждая очередь имеет в пределах ОС уникальное имя.
Разделяемая память представляет собой сегмент физической памяти, отображенной на виртуальное адресное пространство двух или более процессов. Механизм разделяемой памяти поддерживается подсистемой виртуальной памяти, которая настраивает таблицы отображения адресов для процессов, запросивших разделение памяти, так что одни и те же адреса некоторой области физической памяти соответствуют виртуальным адресам разных процессов.