Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Нерезидентная связь на основе сообщенийСодержание книги
Поиск на нашем сайте
Множество распределенных систем и приложений непосредственно построено на базе простой модели обмена сообщениями, предоставляемой транспортным уровнем. Чтобы лучше понять и оценить системы, ориентированные на сообщения, как части решений промежуточного уровня, обсудим сперва обмен сообщениями через сокеты транспортного уровня. Сокеты Беркли Для стандартизации интерфейса транспортного уровня предпринимались специальные усилия. Это делалось для того, чтобы позволить программистам использовать полный комплект протоколов обмена сообщениями как простой набор примитивов. Кроме того, стандартные интерфейсы упрощают перенос приложений на другие машины. В качестве примера мы кратко рассмотрим интерфейс сокетов, введенный в версии UNIX, разработанной в университете Беркли (Berkeley UNIX). Другой
132 Глава 2. Связь важный интерфейс, XTI, присутствующий в транспортном интерфейсе Х/Ореп, который официально именуется интерфейсом транспортного уровня {Transport Layer Interface, ТЫ), разработан организацией AT&T. Сокеты и XTI хорошо подходят к своим моделям сетевого программирования, но имеют разный набор примитивов. Концептуально сокет {socket) — это конечная точка коммуникации. В эту точку приложение может записывать данные, которые следует переслать по базовой сети, и из этой точки оно может читать приходящие данные. Сокеты образуют абстракцию, лежащую поверх реальной конечной точки сети, которая работает с локальной операционной системой по некоторому транспортному протоколу. Далее мы сосредоточимся на примитивах сокетов для TCP, показанных в табл. 2.1. Серверы обычно выполняют первые четыре примитива, чаще всего в приведенном в таблице порядке. При вызове примитива socket вызывающий процесс создает новую конечную точку для некоторого транспортного протокола. Изнутри создание конечной точки коммуникации означает, что локальная операционная система резервирует ресурсы для размещения приходящих и отправляемых по некоторому протоколу сообщений. Примитив bind выполняет привязку локального адреса к только что созданному сокету. Например, сервер должен связать IP-адрес своей машины с номером порта (возможно, общеизвестным) сокета. Привязка сообщает операционной системе, что сервер намерен получать сообщения только на указанные адрес и порт. Примитив listen применяется только для коммуникаций, ориентированных на соединение. Это неблокирующий вызов, требующий от локальной операционной системы зарезервировать буфер для определенного максимального количества соединений, которое вызывающий процесс намерен поддерживать. Вызов примитива accept блокирует вызывающий процесс до прихода запроса на соединение. Когда этот запрос придет, локальная операционная система создаст новый сокет с теми же свойствами, что и у базового, и возвратит его вызывающему процессу. Такой подход позволяет серверу, например, разветвить про-
2.4. Связь посредством сообщений 133 цесс, который впоследствии будет поддерживать связь через новое соединение. Сервер в это время может вернуться в состояние ожидания следующего запроса на соединение с базовым сокетом. Рассмотрим теперь, как все это выглядит со стороны клиента. И здесь все начинается с создания сокета при помощи примитива socket, однако в явной привязке сокета к локальному адресу нет необходимости, поскольку операционная система может динамически выделить порт при установлении соединения. Примитив connect требует, чтобы вызывающий процесс указал адрес транспортного уровня, на который будет отправлен запрос на соединение. Клиент блокируется до тех пор, пока соединение не будет установлено. После установления соединения стороны начинают обмениваться информацией при помощи примитивов write и read, предназначенных для посылки и приема данных соответственно. Наконец, закрытие соединения при использовании сокетов симметрично и может быть осуществлено как клиентом, так и сервером путем вызова примитива close. Общая схема взаимодействия клиента и сервера с использованием сокетов для коммуникаций, ориентированных на соединение, показана на рис. 2.22. Множество подробностей, относящихся к сетевому программированию с использованием сокетов и других интерфейсов в среде UNIX, можно найти в [438]. Интерфейс передачи сообщений Работая на высокопроизводительных мультикомпьютерных системах, разработчики рассматривают примитивы, ориентированные на передачу сообщений, как средство, которое облегчит им написание высокоэффективных приложений. Это означает, что такие примитивы должны поддерживать подходящий уровень абстракции (для облегчения разработки приложений), а их реализация должна вызывать минимум дополнительных накладных расходов. Для сокетов это считается неосуществимым по двум причинам. Во-первых, их уровень абстракции явно недостаточен — они поддерживают только простейшие примитивы send и receive. Во-вторых, сокеты были разработаны для связи между сетями с использованием стеков протоколов общего назначения, таких как TCP/IP. Они не подходят для специальных протоколов, разработанных для высокоскоростных взаимодействующих сетей, например таких, которые используются в системе COW или МРР (мы рассматривали их в разделе 1.3). Эти протоколы требуют интерфейса, обладающего множеством дополнительных возможностей, таких как различные варианты буферизации и синхронизации.
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 был разработан для высокопроизводительных параллельных приложений, что упрощает понимание причин подобного разнообразия коммуникационных примитивов.
136 Глава 2. Связь Множество сведений по MPI содержится в [185]. Полное руководство, в котором детально разобрано более 100 функций MPI, можно найти в [184, 425].
|
||||
Последнее изменение этой страницы: 2016-09-19; просмотров: 337; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.245.230 (0.006 с.) |