Опубликован: 11.04.2006 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет путей сообщения
Лекция 8:

Средства управления распределенными системами

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >

Вызов удаленных процедур

Идея вызова удаленных процедур (Remote Procedure Call - RPC) состоит в расширении хорошо известного и понятного механизма передачи управления и данных внутри программы, выполняющейся на одной машине, до передачи управления и данных через сеть . Средства удаленного вызова процедур предназначены для облегчения организации распределенных вычислений. Наибольшая эффективность использования RPC достигается в тех приложениях, в которых существует интерактивная связь между удаленными компонентами с небольшим временем отклика и относительно малым количеством передаваемых данных. Такие приложения называются RPC-ориентированными.

Характерными чертами вызова локальных процедур являются:

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

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

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

RPC достигает прозрачности следующим путем. Когда вызываемая процедура действительно является удаленной, вместо локальной процедуры используется другая ее версия, называемая клиентской заглушкой (stub). Подобно локальной процедуре, заглушка вызывается с использованием того же списка параметров, только в отличие от локальной процедуры она отправляет вызывающее сообщение на сервер. Вызывающее сообщение содержит параметры процедуры для процесса на сервере. Далее клиентский процесс ожидает от сервера ответного сообщения. Процесс на серверной стороне ожидает поступления вызывающего сообщения, дождавшись которого, извлекает параметры процедуры, выполняет необходимые вычисления и отправляет ответное сообщение клиенту. Далее процесс на серверной стороне ждет следующего вызывающего сообщения. Процесс на клиентской стороне получает ответное сообщение, извлекает из него результаты вычислений и продолжает выполнение. Взаимодействие программных компонентов при выполнении удаленного вызова процедуры показано на рис. 4.3.

Вызов удаленной процедуры

Рис. 4.3. Вызов удаленной процедуры

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

Из вышеизложенного следует, что перед выполнением компиляции и связывания RPC-программы необходимо решить весьма важную предварительную задачу. Эта задача заключается в создании и компиляции файла определения интерфейсов, в котором находится описание клиент-серверных интерфейсов. Эти интерфейсы определяются на специальном языке определения интерфейсов (Interface Definition Language, IDL) и содержат набор <прототипов> для вызовов удаленных процедур со стороны клиента, которые реально должны быть выполнены на серверной стороне. После создания такого файла он компилируется специальным IDL-компилятором. Выходом этого компилятора является пара объектных файлов, один из которых относится к серверному модулю, а второй - к клиентскому. Они содержат коды клиентских и серверных заглушек, где все детали удаленного выполнения процедур, передачи данных и т.д. увязаны с библиотекой RPC времени выполнения. Эти файлы в дальнейшем связываются с результатом компиляции программ клиентской и серверной сторон. Кроме того, IDL-компилятор генерирует заголовочный файл для подключения его к исходным файлам клиента и сервера на этапе их компиляции. Заголовочный файл содержит все объявления, полученные из определений, имеющихся в IDL-файле. В частности, там находится глобальный уникальный идентификатор интерфейса (Global Unique Identifier, GUID), который используется во время выполнения для описания и привязки определенных в RPC-приложении интерфейсов. Вызовы удаленных процедур могут быть реализованы на любом языке программирования, поэтому язык определения интерфейсов является стандартным для всех сетевых платформ.

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

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Сергей Мосолов
Сергей Мосолов
Россия
Иван Панченко
Иван Панченко
Казахстан, Астана, сш.№16, 2009