Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС - Лекции.doc
Скачиваний:
14
Добавлен:
05.09.2019
Размер:
1.04 Mб
Скачать

4.2.5Взаимодействие процессов Разделяемая память

Самым простым из таких средств может быть организация сегмента памяти, разделяемого между задачами. В современных ОС совместное использование памяти обеспечивается в основном следующими средствами:

  • файлами, отображаемыми в памяти;

  • уникальными API разделяемой памяти;

  • механизмами импорта/экспорта.

В системах с виртуальной памятью совместное использование сегментов организуется достаточно просто – одни и те же физические страницы отображаются на адресные пространства различных задач. В результате процессы ведут чтение и запись данных в области разделяемой памяти, используя для этого те же машинные команды, что и при работе с обычной памятью.

Существенной особенностью разделяемой памяти, как механизма межпроцессного взаимодействия, является тот факт, что данные в разделяемой памяти остаются в сохранности, даже если она не принадлежит ни одному из процессов.

Основным достоинством разделяемой памяти является высокая скорость обмена. В то же время, однако, использование для коммуникаций между задачами данного механизма влечет за собой практически все проблемы, связанные с параллельно выполняемыми процессами: необходимость синхронизации, критические секции и т.д. Поэтому в современных ОС для синхронизации и взаимодействия процессов часто используются и другие средства.

Программные каналы

Ряд систем предоставляет более простые в использовании средства, предоставляющие обмен данных одновременно с синхронизацией и реализующие, тем самым, принцип гармонически взаимодействующих процессов по Дийкстре. Одним из наиболее типичных средств такого рода является программный канал или труба (pipe) – основное средство взаимодействия между процессами в ОС семейства Unix.

Труба представляет собой поток байтов, запись и чтение из которого происходит по дисциплине FIFO. Данные, поступающие в программный канал, представляют собой неструктурированную последовательность байтов и после чтения удаляются.

Механизм программных каналов вместе с обменом данными обеспечивает и синхронизацию параллельных процессов. Процесс, который пытается считать данные из пустой трубы, будет задержан, пока там не появятся данные. Напротив, пишущий процесс может записать в трубу некоторое количество данных, прежде чем труба заполнится и дальнейшая запись будет заблокирована.

Создание программного канала в ОС семейства UNIX осуществляется с помощью системного вызова, который создает трубу и помещает дескрипторы файлов, соответствующие входному и выходному концам трубы, в массив. После открытия программного канала чтение данных из трубы и запись в нее осуществляется теми же самыми системными вызовами, что и работа с обычным файлом. Закрытие процессом программного канала осуществляется также стандартным «файловым» вызовом закрытия. Если все процессы, использующие программный канал, закрывают его, то он автоматически удаляется из системы.

Программный канал, таким образом, представляет собой специальный файл. Существенно, что этот файл отсутствует в таблице каталогов, поэтому обычные, или неименованные, каналы могут использоваться для обмена данными только между родственными процессами (имеющими общего предка).

Обойти это ограничение позволяют именованные программные каналы. Чтобы канал стал именованным он должен быть подключен к узлу файловой системы. Поскольку доступ к именованным программным каналам совершенно аналогичен доступу к обычным файлам, то они позволяют производить обмен данными даже процессам, выполняющимся на разных ЭВМ.

В отличие от неименованных, именованные каналы не удаляются из системы даже если они не используются ни одним процессом. Отсоединение имени от узла файловой системы (удаление именованного канала) производится специальным системным вызовом.