Вопрос 54. Механизмы межпроцессного взаимодействия сигналы, каналы, файлы, сообщения, семафоры, разделяемая память, сокеты, RPC.
IPC – inter process communication.
Механизм межпроцессного взаимодействия при использовании разделенного адресного пространства.
Через сигналы – программный механизм, аналогичный прерыванию(без использования приоритетов), который информирует процесс о наступлении синхронного события.Минус – скорость выполнения.
Плюс – зарезервированные константы.
Через разделяемые файлы. Через каналы – именованная (неименованная) очередь сообщения по принципу FIFO. Записывает один поток - считывает другой.Каналы:
· Именованные – регистрируются в системе.
· Неименованные – между 2-мя потоками одного процесса или между дочерним и родительским.
Неименованный канал это путь обмена данными между связанными процессами - родителем и потомком. Родительский процесс создает канал при помощи системного вызова: int pipe(int mas[1]);
На выходе получим массив из двух чисел - файловых дискрипторов. Причем через mas[0] можно читать, а в mas[1] можно писать.
Как это на самом деле работает:
Pipe создает 2 новых файловых дискриптора. Затем создается потомок, и разумеется он наследует и дискрипторы(D1,D2). Поскольку дискрипторы являются внешними по отношению к процессу, то существует возможность передачи данных через них, а действуют они как труба, с одного конца заливаем(D2), с другого выливается(D1). Т. е. если писать данные в D2, то из D1 их можно читать.
Значит если нам надо передавать данные из Main process в Child, то в Main process мы закрываем D1(писать же в D2), а в Child закрываем D2 чтобы не мешался :).

Рис. 1.2-1 Наследование дискрипторов.
Далее доступ к каналу Read, Write.
Если объем читаемых данных больше данных в канале функция Read посчитает и уведомит о количестве считанных байт.
Если канал пуст или не открыт на запись => Read=0. если пуст но открыт => Read заблокирован.
Если размер данных меньше размера канала => запись атомарная. Иначе – лучше подождать.
Более быстрая передача данных – механизм разделяемой памятиРазделяемая память |
shmem |
5. |
shmem – регистрирует раздел памяти, устанавливает права доступа.
map() – указывает программы у которых есть оступ
unmap() – ограничивает.
Виртуальная память – общий блок виртуальной памяти, совместно используемая несколькими процессами.
Плюсы: скорость обмена
отсутствие синхронизации. Взаимоисключения.
Минусы: невозможность работать на другом процессоре.
Обмен сообщениями.Сообщение – малый объём данных, синхронно или асинхронно передаваемый от одного процесса к другому.
Семафоры. (смотри предыдущие билеты) Сокеты – примитивы при обмене данных по сети. Состоит из адреса машины и № порта + протокол.Плюсы вся информация ложится на сетевой адаптер.
Не только по сети, но и внутри машины (адрес 27.0.0.1. – данные не наружу а через сетевуху)
Возможность послать широковещательное сообщение.
Удаленный вызов процедуры RPCИдея вызова удаленных процедур (Remote Procedure Call - RPC) состоит в расширении хорошо известного и понятного механизма передачи управления и данных внутри программы, выполняющейся на одной машине, на передачу управления и данных через сеть. Средства удаленного вызова процедур предназначены для облегчения организации распределенных вычислений. Наибольшая эффективность использования RPC достигается в тех приложениях, в которых существует интерактивная связь между удаленными компонентами с небольшим временем ответов и относительно малым количеством передаваемых данных. Такие приложения называются RPC-ориентированными.
Характерными чертами вызова локальных процедур являются:
- Асимметричность, то есть одна из взаимодействующих сторон является инициатором; Синхронность, то есть выполнение вызывающей процедуры при останавливается с момента выдачи запроса и возобновляется только после возврата из вызываемой процедуры.
Реализация удаленных вызовов существенно сложнее реализации вызовов локальных процедур. Начнем с того, что поскольку вызывающая и вызываемая процедуры выполняются на разных машинах, то они имеют разные адресные пространства, и это создает проблемы при передаче параметров и результатов, особенно если машины не идентичны. Так как RPC не может рассчитывать на разделяемую память, то это означает, что параметры RPC не должны содержать указателей на ячейки нестековой памяти и что значения параметров должны копироваться с одного компьютера на другой. Следующим отличием RPC от локального вызова является то, что он обязательно использует нижележащую систему связи, однако это не должно быть явно видно ни в определении процедур, ни в самих процедурах. Удаленность вносит дополнительные проблемы. Выполнение вызывающей программы и вызываемой локальной процедуры в одной машине реализуется в рамках единого процесса. Но в реализации RPC участвуют как минимум два процесса - по одному в каждой машине. В случае, если один из них аварийно завершится, могут возникнуть следующие ситуации: при аварии вызывающей процедуры удаленно вызванные процедуры станут "осиротевшими", а при аварийном завершении удаленных процедур станут "обездоленными родителями" вызывающие процедуры, которые будут безрезультатно ожидать ответа от удаленных процедур.


