Система Orphus

Программирование сетевых приложений на C++. Том 2

Систематическое повторное использование: ACE и каркасы

Авторы: Дуглас С.Шмидт
Стивен Д.Хьюстон
Издательство: Бином, 2004
400 страниц

Материал предоставил: Евгений Охотников
Найти в магазинах
Купить в Books.Ru

Аннотация

Содержание
О чем эта книга
Комментарии
Ссылки

Аннотация

Это второй том двухтомника "Программирование сетевых приложений на С++" посвященный библиотеке The ADAPTIVE Communication Environment (ACE) - одной из самых переносимых C++ библиотек, предназначенной для разработки сложных, многоплатформенных приложений, и широко используемой во всем мире. В нем читатель знакомится с самой сложной и важной частью библиотеки - каркасами.

Книга предназначена, в основном, разработчикам-практикам, нуждающимся в удобном и мощном инструменте для создания сложных кроссплатформенных приложений. Так же она может быть интересна студентам старших курсов и аспирантов, да и просто всем интересующимся разработкой серьезного ПО на C++.

Содержание

Предисловие
Об этой книге

Глава 1. Объектно-ориентированные каркасы и сетевые приложения

Общее представление об объектно-ориентированных каркасах
Сравнение методов разработки и повторного использования ПО
Применение каркасов в сетевых приложениях
Экскурс в ACE-каркасы
Пример: сетевая служба регистрации
Резюме

Глава 2. Аспекты проектирования: службы и конфигурации

Аспекты проектирования: службы и серверы
Аспекты проектирования: конфигурации
Резюме

Глава 3. ACE-каркас Reactor

Обзор
Класс ACE_Time_Value
Класс ACE_Event_Handler
ACE-классы очередей таймеров
Класс ACE_Reactor
Резюме

Глава 4. Реализации ACE Reactor

Обзор
Класс ACE_Select_Reactor
Класс ACE_TP_Reactor
Класс ACE_WFMO_Reactor
Резюме

Глава 5. ACE-каркас Service Configurator

Обзор
Класс ACE_Service_Object
Классы ACE_Service_Repository
Класс ACE_Service_Config
Резюме

Глава 6. ACE-каркас Task

Обзор
Класс ACE_Message_Queue
Класс ACE_Task
Резюме

Глава 7. ACE-каркас Acceptor-Connector

Обзор
Класс ACE_Svc_Handler
Класс ACE_Acceptor
Класс ACE_Connector
Резюме

Глава 8. ACE-каркас Proactor

Обзор
Классы-фабрики асинхронного ввода/вывода
Класс ACE_Hander
Классы Proactive Acceptor-Connector
Класс ACE_Proactor
Резюме

Глава 9. ACE-каркас Streams

Обзор
Класс ACE_Module
Класс ACE_Stream
Резюме

Словарь терминов
Англо-русский словарь терминов
Литература

О чем эта книга

Дуглас Шмидт
Стивен Хьюстон

"Материал первого тома, [C++NPv1], касался того, как преодолевать известные сложности разработки сетевых приложений. В основном, использования интерфейсных фасадов ACE, позволяющих избежать проблем с API операционных систем, написанных на C. Второй том смещает центр нашего внимания выше, на обоснование и демистификацию паттернов, методов проектирования и возможностей C++, связанных с разработкой и использованием каркасов ACE. Каркасы помогают снизить стоимость и улучшить качество сетевых приложений путем конкретизации проверенных временем программных проектов и паттернов в виде исходного кода, который может повторно использоваться на систематической основе во многих проектах и предметных областях. Каркасы ACE расширяют технологию повторного использования далеко за пределы того, чего можно достичь повторным использованием отдельных классов или даже библиотек классов"

"В книге представлены многочисленные примеры приложений C++ с целью подкрепить рассуждения о проектировании конкретными примерами того, как нужно использовать каркасы ACE. Эти примеры являются, по сути, пошаговым руководством, которое поможет вам применять основные объектно-ориентированные методы и паттерны в собственных сетевых приложениях. Книга также показывает путь совершенствования навыков проектирования, концентрируя внимание на ключевых концепциях и принципах, которые формируют дизайн удачных объектно-ориентированных каркасов, предназначенных для сетевых приложений и промежуточного слоя"

"Главы в книге организованны следующим образом:

Описанные в книге ACE-каркасы

ACE-каркасы Reactor и Proactor. Данные каркасы реализуют паттерны Reactor и Proactor [POSA2] соответственно. Оба они являются архитектурными паттернами, которые предоставляют приложениям возможность управления по событиям, поступающим к приложению от одного или нескольких источников, самыми важными из которых являются конечные точки ввода/вывода. Каркас Reactor упрощает модель взаимно-согласованного (reactive) ввода/вывода, используя события, сообщающие о возможности начать операцию синхронного ввода/вывода. Каркас Proactor спроектирован для модели активно-превентивного (proactive) ввода/вывода, в которой инициируется одна или несколько операций асинхронного ввода/вывода, а завершение каждой операции является источником события. Модели активно-превентивного ввода/вывода могут достигать высокой производительности, характерной для параллельной обработки, избегая многих ее недостатков. Каркасы Reactor и Proactor автоматизируют обнаружение, демультиплексирование и диспетчеризацию определяемых приложением обработчиков, реагирующих на события разных типов.

ACE-каркас Service Configurator. Данный каркас реализует паттерн Component Configurator [POSA2], который является паттерном проектирования, позволяющим подключать и отключать реализации своих компонентов, не требуя модификации, повторной статической компиляции или компоновки. ACE-каркас Service Configurator поддерживает конфигурацию приложений, службы которых могут быть смонтированы на более позднем этапе цикла проектирования, например, во время инсталляции и/или во время выполнения. Приложения, к работоспособности которых предъявляются повышенные требования, например, mission-critiсal системы, выполняющие on-line обработку транзакций или автоматизирующие технологические процессы реального времени, часто требуют наличия такого рода возможностей гибкого конфигурирования.

ACE-каркас Task. Данный каркас реализует различные паттерны, связанные с параллельной обработкой, такие как Active Object и Half-Sync/Half-Async [POSA2]. Active Object - паттерн проектирования, отделяющий поток, который выполняет метод от потока, который его вызывает. Назначение этого паттерна - повысить степень параллелизма и упростить синхронизацию доступа к объектам, которые выполняются в собственных потоках управления. Half-Sync/Half-Async - архитектурный паттерн, разделяющий синхронную и асинхронную обработку в параллельных системах для упрощения программирования, без заметного снижения производительности. Этот паттерн включает два взаимодействующих уровня, один для асинхронной и один для синхронной служебной обработки. Уровень организации очередей является связующим звеном во взаимодействии между службами асинхронного и синхронного уровней.

ACE-каркас Acceptor-Connector. Данный паттерн использует каркас Reactor и реализует паттерн Acceptor-Connector [POSA2]. Этот паттерн проектирования отделяет продключение и инициализацию взаимодействующих одноранговых служб сетевой системы от той обработки, которую они выполняют после подключения и инициализации. Каркас Acceptor-Connector отделяет роли активной и пассивной инициализации от определяемой приложением служебной обработки, выполняемой взаимодействующими одноранговыми службами после завершения инициализации.

ACE-каркас Streams. Данный каркас реализует паттерн Pipes & Filters, архитектурный паттерн, который обеспечивает структуру для систем обработки потоков данных [POSA1]. ACE-каркас Streams упрощает разработки и формирование иерархически упорядоченных многоуровневых служб, таких как стеки протоколов прикладного уровня и агенты управления сетью.

Комментарии

Френк Бушман (Главный разработчик Siemens Corporate Technology)

Использование каркасов ACE обеспечивает несколько важных преимуществ:

За годы консультирования и руководства многими программными проектами я понял, что ACE значительно упрощает применение легко настраиваемого на потребности сетевых приложений повторно используемого промежуточного слоя. Не всем сетевым приложениям нужен "тяжеловесный" промежуточный слой, типа серверов приложений, web-служб и сложных компонентных моделей. Но большинство сетевых приложений может выиграть от применения переносимого и эффективного промежуточного слоя инфраструктуры хоста, такого как ACE. Эта гибкость - основа успеха ACE. Не нужно обременять свои приложения полным комплектом промежуточного слоя, если вы его не используете весь. Вместо этого, можно использовать только основные классы промежуточного слоя ACE, которые действительно нужны для создания приложений, пусть небольших, но делающих то, что нужно. По этой причине я предсказываю, что ACE будет, по-прежнему, широко использоваться и после того, как влияние сегодняшнего крупномасштабного промежуточного слоя уже станет убывать.

На протяжении многих лет обычным способом освоения ACE было штудирование исходного кода, комментариев и примеров приложений. Ясно, что такой процесс требовал много времени и не исключал ошибок. Более того, даже умудрившись просмотреть несколько сотен тысяч строк кода на C++ в ACE, было легко "за деревьями не увидеть леса":

:Поэтому нам повезло, что Даг и Стив, при всей их занятости, нашли время создать такую замечательную книгу о каркасах ACE: :Если вы заинтересованы в получении исчерпывающей информации о паттернах и каркасах ACE, напрямую участвующих в формировании следующего поколения сетевого прикладного ПО - прочтите эту книгу. Я многому у нее научился, не сомневаюсь, что научитесь и вы.

Евгений Охотников

Это вторая книга из серии книг о кроссплатформенной объектно-ориентированной библиотеке ACE (The ADAPTIVE Communication Environment). И если первая книга, [C++NPv1], была введением, не требующим знания ACE, то вторая книга, основываясь на материале первой, знакомит читателя с самыми важными и сложными составляющими ACE - каркасами.

Именно во второй книге начинает складываться более полное впечатление об ACE. Здесь становится видна ее стройность и логичность. Заметен плавный переход одного слоя библиотеки в другой, приходит понимание того, как отдельные части взаимно дополняют и расширяют друг друга. На самом нижнем уровне находится кроссплатформенная реализация многих функций из стандартной библиотеки C и POSIX. Над ними - интерфейсные фасады, скрывающие детали реализации таких средств, как нити, процессы, примитивы синхронизации, различные механизмы межпроцессорного взаимодействия. Над ними каркасы.

Каждый из этих слоев уже способен существенно упростить создание кроссплатформенных приложений на C++. Не обязательно задействовать все возможности ACE. Где-то достаточно будет средств из пространства имен ACE_OS (вроде ACE_OS::dlopen() или ACE_OS::last_error), где-то хватит элементарных фасадов (вроде ACE_Thread_Mutex или ACE_Guard), а где-то придется задействовать каркас Service Configurator или Proactor. Библиотека ACE настолько велика, что в ней найдутся инструменты для приложений практически любого масштаба и уровня сложности. И это не простое собрание всевозможных приспособлений, построенное по принципу "все в одном". Нет, в данной книге показано взаимное использование различных средств ACE друг другом. Например, каркас Acceptor-Connector использует ACE_Svc_Handler, который производен от ACE_Service_Object, определенном в каркасе Service Configurator. А класс ACE_Service_Object, в свою очередь, производен от ACE_Event_Handler из каркасов Reactor и Proactor.

Как и в первом томе, в книге большое количество примеров C++ кода. Наиболее важные примеры даны с нумерацией строк, а после примера следует детальное построчное рассмотрение кода с акцентами на наиболее важных моментах. Так же удобно, что во всей книге рассматривается одна задача - служба сетевой регистрации (из первого тома), и показывается, как изменяется ее реализация при переходе от одного каркаса ACE к другому. Вместе с тем, на мой взгляд, поменялся стиль изложения материала, он стал более формальным. Главы содержат небольшой обзор, после которого следует детальное рассмотрение классов-участников каркаса. Для иллюстрации часто используются UML диаграммы, а отдельные тонкие и неочевидные моменты поясняются в блоках-врезках.

Лично мне эта книга показалось более важной и полезной, чем первая, поскольку материал первой книги может быть получен даже из on-line справки по ACE. А вот описание паттернов, вокруг которых строятся каркасы ACE и основные принципы использования этих паттернов - это очень ценная информация, да еще и полученная от первоисточника - разработчиков ACE.

Основной проблемой при чтении книги для меня было использование паттернов из двух малоизвестных у нас книг [POSA1] и [POSA2]. Например, первое упоминание названия Proactor слегка обескураживает. По ходу чтения, тем не менее, понимание приходит, да и описание многих паттернов есть на личной странице Дугласа Шмидта. Но по началу это несколько затрудняет восприятие материала.

Недостатками именно русскоязычного издания я считаю не очень высокое качество печати (заметно на врезках) и наличие опечаток в примерах кода и названиях методов.

Я рекомендую данную книгу всем, кто хотел бы использовать всю мощь библиотеки ACE в своих проектах. А так же тем, кто занимается разработкой подобных библиотек -- в качестве примера того, как это может быть сделано. В общем, я полностью согласен с выводом Френка Бушмана: "Я многому у нее научился, не сомневаюсь, что научитесь и вы."

Ссылки

[POSA1] Frank Buschmann, Regine Meunier Hans Rohnert, Peter Sommerlad, and Michael Stal. Pattern-Oriented Software Architecture-A System of Patterns. Wiley & Sons, New York, 1996.

[POSA2] Douglas C. Schmidt, Michael Stal, Hans Rohnert, and Frank Buschmann. Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects, Volume 2. Wiley & Sons, New York, 2000.