Э. Таненбаум, М. ван Стеен - Распределённые системы (принципы и парадигмы) (1162619), страница 30
Текст из файла (страница 30)
Однако если ссылка относится к локальномуобъекту, то есть к объекту в адресном пространстве клиента, то объект, на который указывает ссылка, целиком копируется и в процессе обращения передаетсяклиенту. Другими словами, объект передается по значению.Эти две ситуации показаны на рис. 2.17, на котором изображены клиентскаяпрограмма, выполняемая на машине А, и программа-сервер, выполняемая на машине С. Клиент обладает ссылкой на локальный объект 01, который используется в качестве параметра при вызове серверной программы на машине С. Крометого, он обладает ссылкой на находящийся на машине В удаленный объект 02,который также используется в качестве параметра.
При вызове сервера на машину С передается копия всего объекта 01 и копия ссылки на объект 02.Машина АЛокальнаяссылка L 1 .Локальныйобъект 01Машина ВУдаленныйобъект 02Удаленнаяссылка R1Код клиента с кодомзаместителя, то есть с кодомобращения RMI к серверу,находящемусяна машине СУдаленное обращение^с передачей в качествепараметров ссылок L1 и R1Г Копирование ]объекта 01Пм''XКопирование ссылки R1на объект 02Машина СКод сервера(реализация методов)Рис. 2.17. Передача объекта по ссылке и по значениюОтметим, что независимо от того, работаем ли мы со ссылкой на локальныйили глобальный объект, эта работа может быть весьма прозрачна, как, например,в Java. В Java разница будет заметна только в том случае, если локальные объекты будут иметь тршы данных, отличные от типов данных удаленных объектов.В противном случае оба тина ссылок будут трактоваться почти одинаково [494].С другой стороны, в традиционных языках программирования, таких как С, ссылками на локальные объекты могут быть простые указатели, использовать которые вкачестве ссылок на удаленные объекты будет невозможно.120Глава 2.
СвязьДополнительный эффект обращения к методам с использованием в качествепараметра ссылки на объект состоит в возможности копирования объектов.Скрыть это невозможно, и в результате мы вынуждены явно указывать на различие между локальными и распределенными объектами. Понятно, что это разлР1чие не только разрушает прозрачность распределения — оно также затрудняетнаписание распределенных приложений.2.3.5. Пример 1 — удаленные объекты DCEDCE — это пример распределенной системы, появившейся хотя и в правильномместе, но не совсем в нужное время.
Она была одной из первых распределенныхсистем, реализованных в виде промежуточного уровня поверх существующихоперационных систем, и достаточно долго вынуждена была доказывать свою состоятельность. К сожалению, время доказательств совпало с «рождением» удаленных объектов и объявлением их панацеей распределенных систем. Посколькусреда DCE была традиционной, основанной на RPC системой, для нее наступилитяжелые времена.
Она была признана устаревшей еще до того, как потребителиуспели установрггь достаточное число копий. Нет объектов — нет и разговора, а среда DCE их никогда не имела.Команда, создававшая среду DCE, долго убеждала адвокатов объектных технологий, что в ней реализована поддержка объектов. Так, они утверждали, чтосистемы RPC по определению основаны на объектах, поскольку все вопросыреализации и распределения скрыты за интерфейсами. Однако эти аргументы некотировались, и DCE была вынуждена перейти на более явную объектную технологию. В этом пункте мы рассмотрим, как DCE поддерживает распределенныеобъекты.
Объекты DCE интересны для нас тем, что они являются прямым продолжением модели клиент-сервер, основанной на RPC, и представляют собоймост от вызовов удаленных процедур к обращениям к удаленным объектам.Модель распределенных объектов DCEРаспределенные объекты были добавлены в DCE в форме расширений языка определения интерфейсов (IDL) вместе с привязками на языке C++. Другими словами, распределенные объекты в DCE описываются на IDL и реализуются наC++. Распределенные объекты имеют вид удаленных объектов, реализация которых находится на сервере.
Сервер отвечает за локальное создание объектов C++и обеспечение доступа к их методам с удаленных клиентских мавиин. Других способов создания распределенных объектов не существует.Поддерживаются два типа распределенных объектов. Динамические распределенные объекты {distributed dynamic objects) — это объекты, которые создаютсясервером локально по требованию клиента и к которым в принципе имеет доступ только один клиент. Для создания такого объекта сервер должен получитьзапрос от клиента.
Это означает, что каждый класс, чтобы иметь возможностьсоздавать динамические объекты, должен содержать процедуру create, которуюможно вызвать, используя стандартный механизм RPC. После создания динами-2.3. Обращение к удаленным объектам121ческого объекта управление РШ переходит к исполняющей системе DCE, связывающей его с тем клиентом, по требованию которого он был создан.В противоположность динамическим объектам, имеповапные распределенныеобъекты {distributed named objects) не предназначены для работы с едршственнымклиентом.
Они создаются сервером лля совместного использования несколькими клртентами. Именованные объекты регистрируются службой каталогов, такчто клиент может найти объект и выполнить привязку к нему. Регистрацияозначает сохранение уникального идентификатора объекта, а также информациио том, как соединиться с сервером объекта. Разницу между динамическими и именованными объектами иллюстрирует рис. 2.18.Машина сервераМашина сервераДинамический ^(закрытый) объект!ИменованныйС(совместно используемый)С 1< объектАW\С Динамический Л С Динамический ^Цзакрытый) объект) Цзакрытый) объект;1Л'^1S//\Удаленнаяссылка\11•*•Клиент 1Клиент 2Клиент 3*~~~~~'~у:^*'','•/Клиент 1а,'111N\^^ ^v1•'^ф•Клиент 2Клиент 36Рис.
2.18. Распределенные динамические объекты в DCE (а).Распределенные именованные объекты (б)Обращение к удаленным объектам в DCEКак можно заметить, все обращения к удаленным объектам в DCE производятсясредствами RPC. Клиент, обращаясь к методу, передает серверу идентификаторобъекта, идентификатор интерфейса, содержащего метод, идентификацию самого метода и параметры. Сервер поддерживает таблицу объектов. С помощью этойтаблицы сервер, получив идентификатор объекта и идентификатор интерфейса,идентифицирует объект, к которому обратился клиент. Затем он выбирает запрошенный метод и передает ему параметры.Поскольку сервер может поддерживать тысячи объектов, DCE предоставляетвозможность не держать все объекты в памяти, а помещать их при необходимости во вспомогательное хранилище данных.
Когда к серверу приходит запрос наобращение к объекту, отсутствующему в таблице объектов, исполняющая система может вызвать специализированную функцию поиска, которая извлечет объект из хранилища и поместит его в адресное пространство сервера. Обращениек объекту произойдет после его помещения в оперативную память.122Глава 2. СвязьУ распределенных объектов в DCE имеется одна проблема, связанная с ихчрезвычайной близостью с RPC: не существует механизма прозрачных ссылокна объекты. Клиент имеет в лучшем случае дескриптор привязки (binding handle),ассоциированный с именованным объектом. Дескриптор привязки содержитидентификатор интерфейса, транспортный протокол, используемый для связис сервером объектов, а также адрес и конечную точку хоста сервера.
Дескрипторпривязки может быть преобразован в строку и в таком виде передан другомупроцессу.Отсутствие приемлемого механизма ссылок на объекты в пределах системыделает передачу параметров в DCE более сложной, чем в большинстве объектныхcpicTCM. Разработчик приложений для RFC должен сам придумывать механизмпередачи параметров.
На деле это означает, что необходимо явно производитьмаршалинг объектов для передачи их по значению и самостоятельно создаватьдля этого соответствующие процедуры.В качестве альтернативы разработчик может использовать делегирование.Для этого из спецификации интерфейса объекта генерируется специальная заглушка. Заглушка работает как оболочка нужного объекта и содержит только теметоды, которые будут вызываться удаленными процессами. Заглушка можетбыть скомпонована с любым процессом, который хочет использовать этот объект. Преимущества такого подхода становятся понятны, если вспомнить, что DCEразрешает передавать удаленные ссылки на заглушки в качестве параметров вызовов RFC.