Вопрос 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 участвуют как минимум два процесса - по одному в каждой машине. В случае, если один из них аварийно завершится, могут возникнуть следующие ситуации: при аварии вызывающей процедуры удаленно вызванные процедуры станут "осиротевшими", а при аварийном завершении удаленных процедур станут "обездоленными родителями" вызывающие процедуры, которые будут безрезультатно ожидать ответа от удаленных процедур.