Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Т2. Связь_Таненбаум_СРС_ПРИС.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.59 Mб
Скачать

2.3.4. Передача параметров

Поскольку большинство систем RMI поддерживает ссылки на объекты в преде­лах системы, возможности по передаче параметров при обращениях к методам обычно не столь ограничены, как в случае RPC. Однако существуют определен­ные тонкости, которые могут усложнить обращения RMI по сравнению с перво­начальным представлением. Ниже мы кратко обсудим этот вопрос.

Сперва рассмотрим ситуацию, когда все объекты — распределенные. Другими словами, все объекты в системе доступны с удаленных машин. В этом случае при обращениях к методам мы постоянно используем ссылки на объекты как пара­метры. Ссылки передаются по значению и копируются с одной машины на дру­гую. Если процесс получает ссылку на объект в качестве результата обращения к методу, он легко может выполнить привязку к объекту, на который указывает ссылка, позже, если ему это понадобится.

К сожалению, использование исключительно распределенных объектов обыч­но слишком неэффективно, особенно если эти объекты малы и просты, как, на-

2.3. Обращение к удаленным объектам 119

п ример, целые числа и логические значения. Каждое обращение клиента, если он не находится на том же сервере, что и объект, порождает запрос между различ­ными адресными пространствами или, что еще хуже, между различными маши­нами. Поэтому работа со ссылками на удаленные и локальные объекты обычно происходит по-разному.

При обращении к методу с использованием ссылки на объект в качестве па­раметра эта ссылка копируется и передается как параметр-значение только то­гда, когда она относится к удаленному объекту. Именно в этом случае происхо­дит передача объекта по ссылке. Однако если ссылка относится к локальному объекту, то есть к объекту в адресном пространстве клиента, то объект, на кото­рый указывает ссылка, целиком копируется и в процессе обращения передается клиенту. Другими словами, объект передается по значению.

Эти две ситуации показаны на рис. 2.17, на котором изображены клиентская программа, выполняемая на машине А, и программа-сервер, выполняемая на ма­шине С. Клиент обладает ссылкой на локальный объект 01, который использу­ется в качестве параметра при вызове серверной программы на машине С. Кроме того, он обладает ссылкой на находящийся на машине В удаленный объект 02, который также используется в качестве параметра. При вызове сервера на маши­ну С передается копия всего объекта 01 и копия ссылки на объект 02.

Отметим, что независимо от того, работаем ли мы со ссылкой на локальный или глобальный объект, эта работа может быть весьма прозрачна, как, например, в Java. В Java разница будет заметна только в том случае, если локальные объек­ты будут иметь типы данных, отличные от типов данных удаленных объектов. В противном случае оба типа ссылок будут трактоваться почти одинаково [494]. С другой стороны, в традиционных языках программирования, таких как С, ссыл­ками на локальные объекты могут быть простые указатели, использовать которые в качестве ссылок на удаленные объекты будет невозможно.