
2.2.
Удаленный вызов процедур 101
чит работу, оригинальное сообщение будет отослано назад, клиентской заглуш-
ке,
которая скопирует буфер клиенту. В результате вызов по ссылке будет под-
менен копированием/восстановлением. Несмотря на то что это не одно и то же,
часто такой замены вполне достаточно.
Небольшая оптимизация позволяет сделать этот механизм вдвое эффектив-
нее.
Если обеим заглушкам известно, входящим или исходящим параметром
является буфер для сервера, то одну из копий можно удалить. Если массив ис-
пользуется сервером в качестве исходных данных (то есть при вызове write), то
копировать его обратно не нужно. Если это результат, то нет необходимости из-
начально передавать его серверу.
В качестве последнего комментария отметим, что нет ничего особенно хоро-
шего в том, что мы можем работать с указателями на простые массивы и структу-
ры,
если нам по-прежнему недоступна работа с более общими вариантами указате-
лей
—
с указателями на произвольные структуры данных, например на сложные
графы. В некоторых системах делается попытка решить эту проблему путем пе-
редачи серверной заглушке реальных указателей с последующей генерацией спе-
циального кода в процедурах сервера для работы с этими указателями. Так, для
получения данных, которые соответствуют указателю, сервер может сделать спе-
циальный запрос.
Спецификация параметров и генерация заглушек
После всех этих объяснений становится ясно, что сокрытие механизма удаленно-
го вызова процедур требует, чтобы вызывающая и вызываемая системы догово-
рились о формате сообщений, которыми они обмениваются, и при необходимо-
сти пересылки, например, данных сложной структуры, следовали определенному
порядку действрп"!. Другими словами, при совершении RPC обе стороны должны
следовать одному протоколу.
В качестве простого примера рассмотрим процедуру, показанную на рис. 2.10, а.
Она имеет три параметра: символ, число с плавающей точкой и массив из пяти
целых чисел. Предполагая, что длина слова составляет четыре байта, протокол
RPC может предписать передачу символа в крайнем правом байте слова (остав-
ляя последующие три пустыми), числа с плавающей точкой
—
в целом слове,
а массива
—
в виде последовательности слов с общей длиной, равной длине мас-
сива, и предшествующим словом, содержащим длину последовательности
(рис.
2.10, б). Если ввести подобные правила, то клиентская заглушка будет
знать, что для процедуры foobar необходимо использовать тот формат, который
представлен на рис. 2.10, б, а серверная заглушка
—
что именно такой формат бу-
дет иметь входящее сообщение для вызова процедуры foobar.
Определение формата сообщения
—
это только одна сторона протокола RPC.
Этого недостаточно. Также нам необходимо, чтобы клиент и сервер пришли к до-
говоренности по вопросу представления простых типов данных, таких как целые
числа, символы, логические значения и т. д. Так, протокол может предписать,
чтобы целые передавались без знака, символы в 16-битной кодировке Unicode,
а числа с плавающей точкой
—
в формате стандарта IEEE 754, и все это
—
в ост-
роконечном формате. Только при наличии такой дополнительной информации
сообщение может быть однозначно интерпретировано.