Cтраница 1
Клиентский суррогат может упаковать само число k в сообщение и передать его серверу. Затем серверный суррогат создает указатель на число k и передает его серверной процедуре, как и ожидалось. Когда серверная процедура возвращает управление серверному суррогату, тот оправляет число k назад клиенту, где новое число k копируется поверх старого. В результате стандартная передача параметров по ссылке была заменена передачей значений. К сожалению, этот метод не всегда работает, например не работает в том случае, когда указатель указывает на какую-либо сложную структуру. По этой причине на параметры удаленных процедур должны быть наложены определенные ограничения. [1]
Ключевой вопрос, на который следует здесь обратить внимание, состоит в том, что клиентская процедура, написанная пользователем, выполняет нормальный ( то есть локальный) процедурный вызов клиентского суррогата. Так как клиентская процедура и клиентский суррогат находятся в одном адресном пространстве, параметры передаются обычным образом. Аналогично, серверная процедура вызывается процедурой в своем адресном пространстве. Таким образом, вместо выполнения ввода-вывода с помощью процедур send и receive, связь с удаленными объектами осуществляется при помощи имитации нормальных процедурных вызовов. [2]
При этом параметры передаются через стек, как при обычном вызове. На шаге 2 клиентский суррогат упаковывает параметры в сообщение и обращается к системному вызову для оправки сообщения. Упаковка параметров называется маршалингом или маршализацией. На шаге 3 ядро посылает сообщение с клиентской машины на сервер. Наконец, на шаге 5 серверный суррогат вызывает серверную процедуру. Ответ проходит по тому же пути в обратном направлении. [3]
Ключевой вопрос, на который следует здесь обратить внимание, состоит в том, что клиентская процедура, написанная пользователем, выполняет нормальный ( то есть локальный) процедурный вызов клиентского суррогата. Так как клиентская процедура и клиентский суррогат находятся в одном адресном пространстве, параметры передаются обычным образом. Аналогично, серверная процедура вызывается процедурой в своем адресном пространстве. Таким образом, вместо выполнения ввода-вывода с помощью процедур send и receive, связь с удаленными объектами осуществляется при помощи имитации нормальных процедурных вызовов. [4]
Идея удаленного вызова процедуры заключается в том, что вызов удаленной процедуры должен выглядеть максимально похоже на вызов локальной процедуры. В простейшей форме для вызова удаленной процедуры клиентская программа должна быть связана с небольшой библиотечной процедурой, называемой клиентским суррогатом или клиентской заглушкой, представляющей серверную процедуру в адресном пространстве клиента. Аналогично, сервер связан с процедурой, называемой серверным суррогатом или серверной заглушкой. Эти процедуры создают видимость локальности вызова. [5]
Вторая проблема заключается в том, что в языках со слабым контролем типов, таких как С, вполне допустимо написание процедуры, вычисляющей скалярное произведение двух векторов ( массивов), без указания размеров векторов. Массивы могут, например, ограничиваться специальным символом, известным только вызывающей и вызываемой процедурам. При такой ситуации клиентский суррогат не способен корректно упаковать в сообщение все необходимые параметры, так как у него нет способа определить их размеры. [6]
Вторая проблема заключается в том, что в языках со слабым контролем типов, таких как С, вполне допустимо написание процедуры, вычисляющей скалярное произведение двух векторов ( массивов), без указания размеров векторов. Массивы могут, например, ограничиваться специальным символом, известным только вызывающей и вызываемой процедурам. При такой ситуации клиентский суррогат не способен корректно упаковать в сообщение все необходимые параметры, так как у него нет способа определить их размеры. [7]