ЖУРНАЛ «СТА» №3/2004
данных master будет передавать про- грамме agent последовательности двух ключей (начало и конец диапа- зона), то есть если работа идёт с клю- чами длины keylen , write() будет осуществлять передачу буфера дли- ны 2*keylen ; ● ожидать получения результата от agent программа master будет на обычной блокирующей операции read() , а agent возвратит буфер дли- ны N*keylen , где N может иметь и ну- левое значение (вспомним, что изза нечёткости критериев приемлемых результатов работы может быть 0, 1 и более); ● поскольку master должен ожидать read() от многих хостов, то последо- вательность write()–read() для каж- дого доступного хоста должна быть выполнена в отдельном потоке (за- бегая вперёд, отмечу, что синхрони- зация потока далее будет сделана на барьере pthread_barrier_t ); ● программе master для работы с agent нужны ещё некоторые вспомогатель- ные операции приёмапередачи ин- формации, все они сделаны на devctl() и определены в comand.h: ● DCMD_CLUST_STS – по этой команде master передаёт программам agent сетевое (то есть в форме /net/host/…) имя файлаисточни- ка для декодирования; получив эту команду, каждая программа agent средствами QNET загружает со- держимое источника к себе в бу- фер и далее в источнике не нужда- ется (направление передачи дан- ных – к agent ); ● DCMD_CLUST_STK — команда, кото- рой master передаёт текущую ис- пользующуюся длину ключа (на- правление передачи данных – к agent ); ● DCMD_CLUST_GTF – команда запроса частоты (производительности) процессора, на котором работает agent (направление передачи дан- ных – от agent ). С процедурами взаимодействия всё ясно, строим менеджер. Менеджер находится в файле agent.cpp , и в нём нет совершенно ни- чего интересного (типовой dispatchменеджер, скопированный из HELP QNX), за исключением несколь- ких деталей: ● менеджер agent регистрирует пре- фикс пути /dev/agent на своём хосте; ● agent является не только менеджером ресурса; это forkпрограмма, которая своим дочерним процессом создаёт менеджер и остаётся активной, а ро- дительский процесс благополучно завершается; ● как уже понятно, в менеджере уста- навливаются три обработчика для операций read() , write() , devctl() ; все обработчики сообщений нахо- дятся не в основном файле (agent.cpp) , а в отдельном файле об- работчиков (agefun.h—agefun.cpp) . Всё остальное уже предельно просто. Некоторых минимальных коммента- риев заслуживает только текст запус- кающей программы master ( master.cpp ). Начиная работу, master читает QNETкаталог /net (это каталог по умолчанию QNET; если вы используете другой, то вам придётся несколько ис- хитриться). Если он не находит /net , то это означает, что npm-qnet.so просто не «подмонтирован» к io-net (то есть сеть QNET не запущена), и мой master пытается подправить ситуацию (но это — дело вкуса). Далее программа перечитывает со- держимое /net . Для определённости описания будем считать, что она там находит имена хостов: alpha, beta, gamma. Будем считать, что alpha соот- ветствует имени локального хоста, на котором и запущена программа master . Программа строит односвязный список хостов ( class SutList ), в кото- ром каждый доступный хост будет представлен элементом списка ( class Sutelite ). В этом есть доста- точно глубокий смысл! Первоначаль- но я, пересчитав хосты в /net , созда- вал динамический массив хостов, но потом перешёл к динамическому списку, который позволяет более ра- ционально использовать ресурсы па- мяти. Поясню почему. QNET — «ус- тойчивая» сеть (в отличие, скажем, от IP), в которой крайне просто сиг- нализируется потеря канала по коду возврата read() (кто пытался обраба- тывать разнообразные ошибки канала в TCP – меня поймёт, об UDP я про- сто не хочу говорить…). Последующие open() позволяют восстановить тра- фик сразу же после восстановления канала (это очень важно, и все эти свойства QNET я перепроверял и тес- тировал сам). А значит, при использо- вании динамического списка про- грамма master может поддерживать в нём только «актуальные» хосты: вы П Р О Г РАММНО Е ОБ Е С П Е Ч Е НИ Е / СИС Т ЕМЫ Р Е АЛ Ь НО ГО В Р ЕМЕ НИ 59 СТА 3/2004 www.cta.ru HandyScope 3 • Осциллограф • Мультиметр • Анализатор спектра • Регистратор сигналов • Функциональный генератор Пять устройств в одном! #451 Tел.: (095) 234-0636 • Факс 234-0640, E-mail: info@prosoft.ru • Web: www.prosoft.ru • Два независимых канала с частотой дискретизации до 100 МГц • Подключение к ПК через USB 2.0 или 1.1 • Русифицированный интерфейс ПО
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy