
- •Глава 2 Связь
- •2.1. Уровни протоколов
- •2.1. Уровни протоколов 83
- •84 Глава 2. Связь
- •2.1. Уровни протоколов 85
- •2.1.1. Низкоуровневые протоколы
- •86 Глава 2. Связь
- •2.1. Уровни протоколов 87
- •2.1.2. Транспортные протоколы (метод_Метелап лр_1)
- •88 Глава 2. Связь
- •2.1. Уровни протоколов 89
- •92 Глава 2. Связь
- •2.1.3. Протоколы верхнего уровня
- •2.1. Уровни протоколов 91
- •92 Глава 2. Связь
- •2.2. Удаленный вызов процедур 93
- •2.2. Удаленный вызов процедур
- •94 Глава 2. Связь
- •2.2.1. Базовые операции rpc
- •2.2. Удаленный вызов процедур 95
- •96 Глава 2. Связь
- •2.2. Удаленный вызов процедур 97
- •98 Глава 2. Связь
- •2.2.2. Передача параметров
- •2.2. Удаленный вызов процедур 99
- •100 Глава 2. Связь
- •2.2. Удаленный вызов процедур 101
- •102 Глава 2. Связь
- •2.2. Удаленный вызов процедур 103
- •2 .2.3. Расширенные модели rpc
- •104 Глава 2. Связь
- •2.2. Удаленный вызов процедур 105
- •106 Глава 2. Связь
- •2.2.4. Пример — dce rpc
- •2.2. Удаленный вызов процедур 107
- •108 Глава 2. Связь
- •2.2. Удаленный вызов процедур 109
- •110 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 111
- •2.3. Обращение к удаленным объектам
- •112 Глава 2. Связь
- •2.3.1. Распределенные объекты
- •2.3. Обращение к удаленным объектам 113
- •114 Глава 2. Связь
- •2.3.2. Привязка клиента к объекту
- •2.3. Обращение к удаленным объектам 115
- •116 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 117
- •2.3.3. Статическое и динамическое удаленное обращение к методам
- •118 Глава 2. Связь
- •2.3.4. Передача параметров
- •2.3. Обращение к удаленным объектам 119
- •120 Глава 2. Связь
- •2.3.5. Пример 1 — удаленные объекты dce
- •2.3. Обращение к удаленным объектам 121
- •122 Глава 2. Связь
- •2.3.6. Пример 2 — Java rmi
- •2.3. Обращение к удаленным объектам 123
- •124 Глава 2. Связь
- •2.3. Обращение к удаленным объектам 125
- •126 Глава 2. Связь
- •2.4. Связь посредством сообщений
- •2.4.1. Сохранность и синхронность во взаимодействиях
- •2 .4. Связь посредством сообщений 127
- •128 Глава 2. Связь
- •2.4. Связь посредством сообщений 129
- •130 Глава 2. Связь
- •2.4. Связь посредством сообщений 131
- •2.4.2. Нерезидентная связь на основе сообщений
- •132 Глава 2. Связь
- •2.4. Связь посредством сообщений 133
- •134 Глава 2. Связь
- •2.4. Связь посредством сообщений 135
- •136 Глава 2. Связь
- •2.4.3. Сохранная связь на основе сообщений
- •2.4. Связь посредством сообщений 137
- •1 38 Глава 2. Связь
- •2.4. Связь посредством сообщений 139
- •140 Глава 2. Связь
134 Глава 2. Связь
В результате большинство взаимодействующих сетей и мультикомпьютерных систем оснащалось собственными коммуникационными библиотеками. Эти библиотеки содержали множество эффективных высокоуровневых коммуникационных примитивов. Разумеется, все библиотеки были абсолютно несовместимыми друг с другом, и теперь разработчики приложений имеют очевидные проблемы с переносимостью.
Требование независимости от аппаратного обеспечения постепенно привело к созданию стандарта пересылки сообщений, названному просто интерфейсом передачи сообщений {Message-Passing Interface, MPI). MPI разрабатывался для параллельных приложений, но затем был перенесен на нерезидентное взаимодействие. Он предполагает использование базовых сетей и не предусматривает ничего, напоминающего коммуникационные серверы (см. рис. 2.19). Кроме того, он предусматривает, что серьезные сбои в системе, такие как аварии процессов или участков сети, фатальны и не могут быть восстановлены автоматически.
MPI предполагает, что связь происходит в пределах известной группы процессов. Каждая группа получает идентификатор. Каждый процесс в группе также получает идентификатор (локальный). Пара идентификаторов (groupID, processID), таким образом, однозначно определяет источник или получателя сообщения и используется вместо адреса транспортного уровня. В вычислениях может участвовать несколько, возможно перекрывающихся, групп процессов, исполняемых одновременно.
В основе MPI лежат примитивы передачи сообщений, поддерживающие большинство видов нерезидентного взаимодействия, показанных на рис. 2.21 (в-е), наиболее понятные из них собраны в табл, 2.2.
Фактически без поддержки остались только синхронные взаимодействия, показанные на рис. 2.21, г. Другими словами, MPI не поддерживает синхронизацию отправителя и получателя при передаче сообщения по сети.
Нерезидентная асинхронная связь (см. рис. 2.21, в) поддерживается примитивом MPI_bsend. Отправитель отправляет сообщение на передачу. Обычно оно сперва копируется в локальный буфер исполняющей системы MPI. После того
2.4. Связь посредством сообщений 135
к ак сообщение скопировано, отправитель продолжает работу. Локальная исполняющая система MPI удалит сообщение из буфера и примет меры по его передаче получателю сразу же, как только получатель запустит примитив, отвечающий за прием.
Также существует и операция передачи с блокировкой, которая называется MPI_send. Ее семантика зависит от реализации. Примитив MPI_send может блокировать отправителя как на время копирования сообщения в исполняющую систему MPI на стороне отправителя, так и до момента инициирования получателем операции приема. Первый случай соответствует асинхронной связи, показанной на рис. 2.21, г, второй — на рис. 2.21, д.
Синхронная связь, при которой отправитель блокируется до передачи сообщения на дальнейшую обработку, как показано на рис. 2.21, д, поддерживается при помощи примитива MPI_ssend.
И наконец, наиболее жесткая форма синхронных коммуникаций показана на рис. 2.21, е. Когда отправитель вызывает примитив MPI_sendrecv, он посылает получателю сообщение и блокируется до получения ответа. В основе работы этого примитива лежит обычный механизм RPC.
Примитивы MPI_send и MPI_ssend имеют варианты, исключающие необходимость копирования сообщения из буфера пользователя во внутренний буфер локальной исполняющей системы MPI. Эти варианты соответствуют асинхронной связи. При помощи примитива MR_isend отправитель передает указатель на сообщение, после чего исполняющая система MPI начинает взаимодействие. Отправитель немедленно продолжает свою работу. Чтобы избежать изменения сообщения до момента окончания связи, MPI предоставляет примитивы для проверки завершения передачи или, при необходимости, блокировки. Как и в случае MR_send, вопрос о том, нужно ли реально передавать сообщение или достаточно копирования в локальный буфер исполняющей системы MPI, оставлен на усмотрение разработчиков.
В случае вызова примитива MR_issend отправитель также передает исполняющей системе MPI только указатель. Когда исполняющая система показывает, что она обработала сообщение, отправитель удостоверяется, что получатель получил сообщение и в настоящее время работает с ним.
Операция MPI_recv вызывается для приема сообщения и блокирует запустивший процесс до прихода сообщения. Существует также и асинхронный вариант этой операции под именем MPI_irecv, вызовом которого получатель показывает, что он готов к приему сообщений. Получатель может проверить, имеются ли пришедшие сообщения, или заблокироваться в ожидании таковых.
Семантика коммуникационных примитивов MPI не всегда проста, и иногда замена различных примитивов никак не влияет на правильность программы. Официальная причина поддержки такого разнообразия вариантов взаимодействия состоит в том, что разработчики систем MPI должны иметь все возможности для оптимизации производительности. Циники могут сказать, что комитет, как всегда, не нашел в себе сил хорошенько подумать. Интерфейс MPI был разработан для высокопроизводительных параллельных приложений, что упрощает понимание причин подобного разнообразия коммуникационных примитивов.