Системные вызовы типа send и receive

Операционные системы мультикомпьютеров. Коммуникации процессов

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

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

· вызов удаленной процедуры - операционная система скрывает от пользователя передачу и прием сообщений под видом механизма вызова удаленной процедуры.

Различают блокирующие вызовы (синхронные вызовы) и неблокирующие вызовы (асинхронные вызовы).

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

· вызов посылает сообщение указанному в вызове процессу и блокирует вызывающий процесс до завершения отправки сообщения (см. рис. 1а);

· вызов вызывает блокировку вызывающего процесса вплоть до завершения получения сообщения.

Если вызов является неблокирующим, то он возвращает управление вызывающему процессу до завершения отправки сообщения (см. рис. 1б).

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

Рис. 1. а) Схема блокирующего вызова send. В течение периода времени [t1,t2] процесс Q1 заблокирован, происходит отправка сообщения. б) Схема неблокирующего вызова send. В течение периода времени [t1,t3] процесс Q1 заблокирован, ОС обрабатывает прерывание, вызванное вызовом. В течение периода времени [t3,t4] происходит отправка сообщения.

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

Возможно несколько решений этой проблемы.

1. Копирование сообщения в буфер ядра ОС. Недостатком данного решения является необходимость наличия дополнительных буферов для вызовов, а также необходимость лишнего копирования, что может существенно снизить производительность системы.

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

3. Копирование сообщения в буфер ядра ОС только в том случае, когда процесс пытается повторно использовать область памяти, в которой хранится сообщение. Данное решение может потребовать неоднократного копирования указанной области памяти (если процесс формирует очередные вызовы send до завершения отправки предыдущих сообщений).

Аналогично, реализации неблокирующих вызовов receive вызывает серьезные проблемы. Процесс-получатель может информироваться о завершении приема сообщения с помощью прерывания. Однако, опять же, эти прерывания программе пользователя необходимо обрабатывать. Другим решением является создание для каждого процесса своего «почтового ящика». ОС записывает поступающие сообщения в этот почтовый ящик, а программа пользователя периодически опрашивает его на предмет наличия непрочитанных сообщений. Используются и другие решения.

· - создает новую очередь сообщений, элементы которой представляют собой буферы сообщений;

· - используется для посылки сообщения (точнее, для постановки его в указанную очередь сообщений);

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

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

Замечание. Для процессов, которые взаимодействуют в компьютерной сети в соответствии с семейством протоколов TCP/IP, операционная система Unix использует программные гнезда (sockets). Взаимодействие процессов на основе программных гнезд основано на модели "клиент-сервер". Операционная система поддерживает внутренние соединения и маршрутизацию данных от клиента к серверу.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: