Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гл.4 ОС буклет.doc
Скачиваний:
7
Добавлен:
11.11.2018
Размер:
157.18 Кб
Скачать

4.2.2. Основы передачи сообщений

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

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

Выделяют такие характеристики каналов связи:

-способ задання;

-количество процессов, которые могут быть соединены одним каналом;

-количество каналов, которые могут быть созданы между двумя процессами;

-пропускная способность канала (количество сообщений, которые могут одновременно находиться в системе и быть ассоциированными с этим каналом);

-максимальный размер сообщения;

-направленность связи через канал (двусторонняя или односторонняя связь).

В односторонней связи для конкретного процесса допускают передачи данных только в один сторону.

Примитивы передачи сообщений

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

Примитивы передачи сообщений – это специальные операции обмена данными через канал, которые обеспечивают не только обмен данными, но и синхронизацию.

Есть два примитива передачи сообщений:

-send - для отсылания сообщения каналом,

-receive - для получения сообщения из канала.

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

Указанные примитивы передачи сообщений могут задавать прямой и косвенный обмен данными. При прямом обмене данными необходимо явным образом указывать процесс, с которым необходимо обмениваться информацией. Косвенный обмен осуществляют через специальный объект (почтовый ящик, порт); процессы могут помещать сообщение в почтовый ящик и получать их оттуда. Обычно несколько процессов имеют доступ к одному почтовому ящику, применяя во время его поиска методы именования. Большинство современных технологий обмена сообщениями использует косвенный обмен данными. Примером прямого обмена являются традиционные сигналы.

Синхронная и асинхронная передача сообщений

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

  1. Может ли поток быть приостановлен во время выполнения операции send, если сообщение не было получено?

  2. Может ли поток быть приостановлен во время выполнения операции receive, если сообщение не было отослано?

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

Во время синхронной передачи сообщений операция send приостанавливает процесс получения сообщения, а во время асинхронной передачи сообщений она не приостанавливает процесс (т.е. является неблокировочной); после отсылания сообщения процесс продолжает свое выполнение, не ожидая получение результата. Удобнее в этом случае использовать косвенную адресацию через почтовые ящики.

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

  • Если пропускная способность равняется нулю (сообщение не могут ожидать в системе), отправитель всегда должен ожидать, пока получателю не поступит сообщения, а получатель должен ожидать, пока сообщение ему не будет отослано. Два процессы должны явно договариваться о будущем обмене.

  • Если пропускная способность ограничена (в системе могут находиться максимум n сообщений для этого канала), отправитель должен ожидать только тогда, когда очередь сообщений для этого канала полна (в ней находится ровно n сообщений), получатель должен ожидать, если эта очередь пустая.

  • Если пропускная способность неограниченная, ожидает только для получатель освобождения очереди.

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

Решение задачи производителей-потребителей с помощью передачи сообщений

Рассмотрим решение задачи производителей-потребителей с использованием асинхронной передачи сообщений.

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

Почтовые ящики производителя и потребителя имеют свои особенности.

Сундучок производителя может содержать только пустые сообщения не больше n. Наличие m сообщений в этом сундучке служит сигналом для производителя, e которого в буфере есть место для m объектов. Чтобы отослать данные в буфер, производитель забирает с сундучка одно сообщение, заполняет его данными и отсылает в сундучок потребителя. Заполнив буфер, производитель опустошит свой сундучок и будет вынужден ждать, пока потребитель не поместит у нее пустое сообщение.

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

В начале работы сундучок производителя заполняют пустыми сообщениями узагальним числом n (это будет означать, что он может сделать n объектов).

Функции producer() и consumer () похожие. Как производитель так и потребитель в цикле стараются забрать сообщение из своих сундучков. Если это удается производителю, он заполняет сообщение данными и отсылает его в сундучок потребителя, если это сможет сделать потребитель, он воспользуется сообщением и отошлет пустое сообщение в сундучок производителя. После этого цикл продолжается.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]