BC/NW 2006, №2 (9): 11.2

 

 

АДАПТАЦИЯ ПРИНЦИПОВ АВТОМАТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ К ТЕХНОЛОГИИ CORBA

 

Р.А. Рыбаков

 

 (Москва, Московский энергетический институт (технический университет), Россия)

 

 

На сегодняшний день технология CORBA занимает лидирующие позиции в области разработки распределенного программного обеспечения и поддерживается большинством существующих аппаратных и программных платформ. Последние дополнения, касающиеся асинхронного вызова методов (AMIAsynchronous Method Invocation), существенно расширили возможности данной технологии, позволив клиентам осуществлять неблокирующие двунаправленные вызовы с использованием SMI (Synchronous Method Invocation), тем самым, сняв ограничения предыдущих версий [1].

Однако, появление нового стандартизованного механизма, позволяющего обслуживать несколько двунаправленных запросов в пределах одного потока, привело к возникновению целого ряда трудностей, связанных с организацией процесса асинхронного взаимодействия. При этом предложенные стандартом схемы уведомления (модели callback и polling) рассчитаны на использование дополнительного механизма, ассоциирующего полученные результаты с запросами к удаленной стороне, реализация которого выходит за рамки стандарта CORBA.

Кроме того, нерешенными остались вопросы, связанные с асинхронной обработкой запросов на стороне сервера, что также снижает эффект от применения механизма AMI в многоуровневых серверах, где основные операции выполняются в отдельных потоках [2].

 

Для организации асинхронного взаимодействия в среде CORBA могут применяться различные методы. В качестве одного из вариантов может быть рассмотрен подход, основанный на использовании принципов автоматно-ориентированного программирования.

В отличие от традиционного программирования, оперирующего понятием «событие», данный стиль программирования базируется на понятии «состояние» [3]. В рамках автоматного подхода программирование выполняется не посредством переменных или флагов, как это делается в традиционном программировании, а посредством состояний, что позволяет лучше понять и специфицировать задачу и ее составные части.

Для реализации базовых принципов автоматно-ориентированного программирования была разработана модель UDE [4]. Основным элементом этой модели, отвечающим за формирование логики работы приложения и организацию процесса асинхронного взаимодействия удаленных объектов, являются распределенные процедуры, получившие название «DPC-процедур». Использование механизма DPC позволяет организовать внутреннюю логику приложения в виде наборов конечных недетерминированных автоматов, каждый из которых отвечает за реализацию отдельной функции UDE-объекта.

Основная идея разработанной модификации CORBA-UDE (рис. 1) состоит в том, чтобы дополнить текущую спецификацию CORBA 3.0 средствами двустороннего асинхронного взаимодействия, адаптировав к ней принципы автоматно-ориентированного программирования.

 

Рис. 1. Базовая архитектура CORBA-UDE.

        

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

Механизм работы CORBA-UDE приложений представлен на рис. 2.

 

Рис. 2. Механизм взаимодействия CORBA-UDE приложений.

 

При запуске сервера создается UDE-объект, отвечающий за выполнение требуемого набора функций. В процессе инициализации ему присваивается уникальный в пределах системы адрес (UNIADDR), используемый при последующих обращениях со стороны UDE-объектов, а также активируется объект-привратник (servant), обеспечивающий связь с элементами технологии CORBA. На финальной стадии происходит регистрация UDE-объекта в службах именования CORBA и UDE, после чего становится возможным обращение к объекту с удаленных узлов.

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

Механизм выполнения асинхронных запросов выглядит следующим образом: клиент формирует UDE-сообщение (пакет запроса), в котором содержатся адреса отправителя и получателя, код операции и параметры, необходимые для успешного выполнения запроса. Далее осуществляется вызов метода PostUDEMsg объекта UDEDispatcher, который осуществляет доставку сообщения объекту-получателю. После приема оно помещается в очередь сообщений соответствующего UDE-объекта, а клиент получает уведомление о доставке, и с этого момента может переходить к выполнению дальнейших действий.

По мере готовности сервер приступает к обработке запроса, в процессе выполнения которого могут потребоваться дополнительные обращения к другим UDE-объектам. После завершения процесса обработки, сервер формирует ответное сообщение, в котором содержатся адреса отправителя и получателя и результат выполнения запроса. Поскольку у клиентского UDE-объекта может отсутствовать связь с элементами CORBA, доставка ответного сообщения осуществляется с использованием UDEDispatcher клиента, так как он гарантированно взаимодействует с подсистемой CORBA посредством объекта-привратника (servant).

Механизм доставки ответного сообщения аналогичен тому, что используется при доставке запроса серверу. Разница состоит лишь в том, что ответное сообщение сначала поступает в UDEDispatcher клиента, который впоследствии транслирует его объекту-получателю. Сообщение, полученное от сервера, помещается в очередь сообщений UDE-объекта клиента и извлекается оттуда по мере готовности, тем самым обеспечивается асинхронный режим работы как клиентского, так и серверного приложений.

В модели UDE для организации асинхронных запросов используется специальный вид процедур, так называемые DPC-процедуры (рис. 3).

 

Рис. 3. Пример реализации DPC-процедуры на языке C++.

 

По сути каждая DPC-процедура, отвечающая за выполнение отдельной функции объекта, представляет собой конечный недетерминированный автомат, реализованный в виде структурированного участка кода, содержащего Switch-конструкцию и ряд вспомогательных команд.

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

Механизм выполнения DPC-процедуры представлен на рис. 4.

 

Рис. 4. Механизм выполнения DPC-процедуры.

 

Активация DPC-процедуры производится при наступлении одного из событий: явный запуск процедуры в ответ на поступившее сообщение, повторный запуск при получении результата выполнения запроса и повторный запуск по прошествии критического интервала времени, отведенного на выполнение запроса.

В момент активации DPC-процедуры происходит восстановление (инициализация) значений локальных DPC-переменных из внутреннего стека процедуры, что позволяет организовать работу с локальными переменными так же, как в и случае с обычными процедурами и функциями.

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

1.     Безусловный переход к новому состоянию (Continue), выполняемый без прерывания процедуры.

2.     Условный переход на основе результата запроса к удаленному объекту (Suspend) – приостанавливает выполнение процедуры до момента получения результата запроса.

3.     Условный переход с таймаутом (SuspendWithKick) – приостанавливает выполнение процедуры до момента получения результата запроса или момента завершения указанного интервала времени.

4.     Завершение процедуры (End) – освобождает все ресурсы, связанные с данной процедурой, и прекращает ее выполнение.

5.     Отмена процедуры (Cancel) – осуществляет безусловный переход к специальному состоянию без прерывания процедуры и инициирует обработчик, в ходе выполнения которого возможен переход к другому состоянию, инициирующему новую цепочку действий.

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

Сторона, инициирующая запрос, формирует UDE-сообщение, указывая в нем всю необходимую информацию, после чего осуществляет его отправку с помощью объекта UDEDispatcher. Как правило, после команды отправки сообщения следует управляющая инструкция, определяющая дальнейшее поведение автомата. В большинстве случаев используются команды Suspend и SuspendWithKick, в параметрах которых задаются номера состояний, к которым будет осуществлен переход в случае успешного и неуспешного завершения запроса, а также в случае истечения указанного промежутка времени.

Переключение между состояниями производится автоматически в момент поступления соответствующего события, что исключает возможность случайного переключения.

При выходе из процедуры происходит сохранение значений зарегистрированных DPC-переменных во внутреннем стеке для последующего восстановления. В случае если была выполнена управляющая инструкция, завершающая выполнение процедуры, DPC-менеджер объекта автоматически освобождает ресурсы, выделенные для хранения ее дескриптора.

Благодаря использованию механизма DPC клиент получает возможность осуществлять асинхронные запросы к серверу, не заботясь о вопросах, связанных с доставкой сообщений серверу и получением ответных сообщений. В свою очередь сервер получает возможность осуществлять асинхронную обработку запросов в контексте UDE-объектов, исполняющихся в отдельных потоках.

 

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

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

ЛИТЕРАТУРА

1.     Henning M., Vinoski S. Advanced CORBA® Programming with C++ // Addison-Wesley professional computing series, 1999. – 1120 p.

2.     Brunsch D., O’Ryan C., Schmidt D.C. Designing an Efficient and Scalable Server-side Asynchrony Model for CORBA // Proc. of the IFIP/ACM International Conference on Distributed Systems Platforms, Springer, 2000. – 7 p.

3.     Шалыто А.А. Логическое управление. Методы аппаратной и программной реализации алгоритмов. СПб.: Наука, 2000. 780 с.

4.     Рыбаков Р.А. Разработка модели взаимодействия объектов в распределенной среде // Радиоэлектроника, электротехника и энергетика // Двенадцатая Междунар. науч.-течн. конф. студентов и аспирантов: Тез. докл. В 3-х т. – М.: МЭИ, 2006. Т. 1. – с. 427-428.