Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сообщение между модулями, нужен способ эффективного взаимодействия 
:(
    Опции темы
fish9370
Дата 8.11.2014, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Здравствуйте,

есть задача: 
1. принять сообщение
2. передать сообщение модулю по префиксу команды (к примеру команда monitor::update, где monitor - имя модуля, в котором находится обработчик, update - команда)
3. в заданном модуле произвести обработку, и асинхронно вернуть результат, в некоторую очередь в первом модуле

пояснение к задаче:
1) за прием и маршрутизацию команд отвечает модуль router
2) тестовый модуль, в котором будет обработчик назовем monitor
3) при загрузке модуль monitor регистрирует функцию обработчик в модуле router. Добавляет в список префиксов префикс 'monitor' - связка префикс-обработчик
4) очередь результатов, находится в модуле router и должна быть доступна всем прочим модулям

вопрос по 4 пункту: используется динамическое связывание, модули подключаются во время исполнения программы, как сделать объект общим? Если я описываю, объект как extern при связывании линкер пишет undefined symbol, если я не указываю extern создается локальная копия

обоснованная критика архитектуры приветствуется


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 9.11.2014, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(fish9370 @  8.11.2014,  22:48 Найти цитируемый пост)
вопрос по 4 пункту: используется динамическое связывание, модули подключаются во время исполнения программы, как сделать объект общим?

Модуль router оформляется как librouter.so файл (с описанием объекта без каких либо префиксов в нем самом и с extern в соответствующем *.h файле) Главная программа линкуется с librouter.so, с ним же ликуются при компиляции все остальные загружаемые модули (они должны быть собраны в виде *.so файлов).
Тогда при загрузке этих *.so (через dlopen) они подхватят librouter.so, который к тому времени уже будет загружен в основной программе



Это сообщение отредактировал(а) xvr - 9.11.2014, 13:39
PM MAIL   Вверх
Cheloveck
Дата 9.11.2014, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Описан dbus


--------------------
user posted image
PM Jabber   Вверх
svlary
Дата 10.11.2014, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(fish9370 @  8.11.2014,  22:48 Найти цитируемый пост)
обоснованная критика архитектуры приветствуется 


А почему нельзя воспользоваться СТАНДАРТНЫМ механизмом очередей сообщений в Linux?
- man 2 msgget
- man 3 mq_open

Это база. Можно воспользоваться d-Bus, если хочется поковыряться...smile

Просто, дело в том, что реализуя механизм очередей сообщений самостоятельно, Вы неизбежно столкнётесь с проблемой блокировок и анализом полноты буферов. Это не очень простые задачи.

PM MAIL   Вверх
fish9370
Дата 10.11.2014, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(svlary @  10.11.2014,  11:28 Найти цитируемый пост)
А почему нельзя воспользоваться СТАНДАРТНЫМ механизмом очередей сообщений в Linux?
- man 2 msgget
- man 3 mq_open


наверно можно, но это будет менее эффективно, все-таки msgget это механизм IPC. А так же, после, все-равно придется выполнять копирование в тот самый объект (хеш-таблица), так как с ним ведется работа

dbus - тоже IPC

Цитата(svlary @  10.11.2014,  11:28 Найти цитируемый пост)
Просто, дело в том, что реализуя механизм очередей сообщений самостоятельно, Вы неизбежно столкнётесь с проблемой блокировок и анализом полноты буферов. Это не очень простые задачи.


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

Добавлено @ 15:51
Цитата(xvr @  9.11.2014,  13:38 Найти цитируемый пост)
Модуль router оформляется как librouter.so файл (с описанием объекта без каких либо префиксов в нем самом и с extern в соответствующем *.h файле) Главная программа линкуется с librouter.so, с ним же ликуются при компиляции все остальные загружаемые модули (они должны быть собраны в виде *.so файлов).
Тогда при загрузке этих *.so (через dlopen) они подхватят librouter.so, который к тому времени уже будет загружен в основной программе


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

я не понимаю, почему ld не может его слинковать с глобальным символом, если он находится в модуле router.so и грузится раньше остальных. Он же глобальный



Это сообщение отредактировал(а) fish9370 - 10.11.2014, 15:59


--------------------
undefined
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 10.11.2014, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
Описан dbus


Описан любой message oriented middleware. То есть вообще любой, от zeromq до CORBA/WebSphere.

И совершэнно необязательно брать сразу самый дебильно сделанный.
PM MAIL   Вверх
xvr
Дата 10.11.2014, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(fish9370 @  10.11.2014,  15:44 Найти цитируемый пост)
я не понимаю, почему ld не может его слинковать с глобальным символом, если он находится в модуле router.so и грузится раньше остальных.

Может, именно это я и предлагал. А что бы на этапе сборки линкер не ругался, ему этот router.so надо подать в линковку (при сборке модулей/динамических библиотек).


PM MAIL   Вверх
Guinness
Дата 10.11.2014, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(tzirechnoy @  10.11.2014,  18:41 Найти цитируемый пост)
И совершэнно необязательно брать сразу самый дебильно сделанный. 

А почему самый дебильный? Я просто его использовал в связке с Qt, не скажу, что получал удовольствие, скорее наоборот, но оно работало. Потом пытался найти какую-то межхостовую его замену и наткнулся на ZeroC Ice. По описанию понравилось, даже написал тестовый примерчик Python vs C++. К несчастью времени попользовать его в боевых условиях не хватило. Приведённые Вами
Цитата(tzirechnoy @  10.11.2014,  18:41 Найти цитируемый пост)
 от zeromq до CORBA/WebSphere

лучше или каждый хорош по своему?
PM MAIL   Вверх
fish9370
Дата 10.11.2014, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(xvr @  10.11.2014,  18:05 Найти цитируемый пост)
Может, именно это я и предлагал. А что бы на этапе сборки линкер не ругался, ему этот router.so надо подать в линковку (при сборке модулей/динамических библиотек).


я попробую поиграться в разделе описания, раньше у меня таких проблем не было

мне нужно было выговориться, слишком я долго носил это в себе


--------------------
undefined
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 10.11.2014, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



<quote>&gt;Если я описываю, объект как extern при связывании линкер пишет undefined symbol,</quote>

1) Ни в коем случае, никогда, never,  nie, nunca, jamais -- не делай глобальных объектов. И синглтонов тожэ не делай. Когда тебе будет можно -- ты ужэ прекрасно поймёшь, о чём я, и что я имел в виду, а пока не понял -- просто не делай.

2) Типичный -- вызываешь какую-нибудь функцыю init(), или connect("address") которая возвращает ссылку на нужный тебе объект. У объекта, если он действительно объект C++ -- хорошым тоном будет сделать какой-нибудь абстрактный предок, с несколькими чисто виртуальным функцыями. А если не C++, с простой C -- то, соответственно, можно сделать непрозрачную структуру, которая просто передаётся внутрь  функцый библиотеки-мессенджэра.

PM MAIL   Вверх
svlary
Дата 10.11.2014, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(fish9370 @  10.11.2014,  15:44 Найти цитируемый пост)
все-таки msgget это механизм IPC


Разумеется. А в чём дело? Вы ведь писали:

Цитата
асинхронно вернуть результат,


Асинхронными могут быть только процессы (потоки/нитки). Иначе вся эта затея теряет смысл. Если изначально предполагалась многопоточность, т о почему же не использовать стандартные средства синхронизации?!

Добавлено через 10 минут и 43 секунды
Цитата(fish9370 @  10.11.2014,  15:44 Найти цитируемый пост)
я не понимаю, почему ld не может его слинковать с глобальным символом

Для того, что бы ответить на этот вопрос, необходимо:
  • Строчка исходного файла, в котором объект объявляется глобальным
  • Строчка исходного файла (другого) в котором он используется
  • Строчки из make-файла, в которых компиллируются и линкуются эти два объектных (so) файла.

PM MAIL   Вверх
tzirechnoy
Дата 10.11.2014, 20:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
А почему самый дебильный?


Не знаю, как-то куда в нём ни ткнёшь -- в publish/subscribe, в marshalling (с системой типов из VBA, зато с обязательным юникодом), в релизацыю сервера, в его конфиг, в реальную поддержку tcp/ip -- всё как-то очень половинчато сделано. При  этом да, жыть можно -- да что там, я и на VBA писал, тожэ вполне себе язык программирования.

Цитата
лучше или каждый хорош по своему?


У каждого свои плюсы. У того жэ 0mq -- вообще не маршаллинга, всё относительно с очередями (впрочем, в dbus с очередями примерно такжэ) -- зато скорость высокая. У полувзрослых брокеров (rabbitMQ, например) -- много приятностей, вообще, на мой взгляд, из распространённого и подо все языки, rabbitMQ -- самый вменяемый вариант. Плюсов и возможностей совсем взрослых (webSphere той жэ) я пока не ощутил, но вполне допускаю, что отказоустойивость и интэроперабельность с джавой у них более на высоте.
PM MAIL   Вверх
fish9370
Дата 10.11.2014, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(tzirechnoy @  10.11.2014,  19:33 Найти цитируемый пост)
Ни в коем случае, никогда, never,  nie, nunca, jamais -- не делай глобальных объектов. И синглтонов тожэ не делай. Когда тебе будет можно -- ты ужэ прекрасно поймёшь, о чём я, и что я имел в виду, а пока не понял -- просто не делай.


я не буду это комментировать, просто выражу свое несогласие


Цитата(tzirechnoy @  10.11.2014,  19:33 Найти цитируемый пост)
А если не C++, с простой C -- то, соответственно, можно сделать непрозрачную структуру, которая просто передаётся внутрь  функцый библиотеки-мессенджэра


1) не С++ 2) непрозрачную структуру - это как? 3) может пора уже что-то с русским языком сделать? сколько Вас читаю, ничего у Вас не меняется


Цитата(svlary @  10.11.2014,  19:48 Найти цитируемый пост)
Разумеется. А в чём дело?


Цитата(svlary @  10.11.2014,  19:48 Найти цитируемый пост)
Асинхронными могут быть только процессы (потоки/нитки). Иначе вся эта затея теряет смысл. Если изначально предполагалась многопоточность, т о почему же не использовать стандартные средства синхронизации?!


разумеется потоков несколько, но разница, между передачей данных через IPC и напрямую существенна. Нужно ли это объяснять?



Цитата(svlary @  10.11.2014,  19:48 Найти цитируемый пост)
Для того, что бы ответить на этот вопрос, необходимо:
- Строчка исходного файла, в котором объект объявляется глобальным
- Строчка исходного файла (другого) в котором он используется
- Строчки из make-файла, в которых компиллируются и линкуются эти два объектных (so) файла.


Код

/* router.so */
struct hashtable users;


Код

/* monitor.so */
struct hashtable users;              /* либо так, */
extern struct hashtable users;    /* либо так - оба успешно компилируются*/


Код

#nm -n ./router.so | grep users
0000000000217180 B users

#nm -n ./monitor.so | grep users
0000000000217580 B users          <--- первый случай
                           U users          <--- второй случай



компилится с ключами -fPIC и -shared

линукуется динамически

Это сообщение отредактировал(а) fish9370 - 10.11.2014, 21:33


--------------------
undefined
PM MAIL WWW ICQ   Вверх
tzirechnoy
Дата 10.11.2014, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 3
Всего: 16



Цитата
2) непрозрачную структуру - это как? 


Это структура, поля которой не опубликованы для кода, который её использует. То есть как в stdio (stdin/stdout) или много где ещё. Доступ внутрь имеет только библиотека, которая обеспечивает интэрфейс к ней.

Да, передаётся обычно через указатель. 
PM MAIL   Вверх
fish9370
Дата 10.11.2014, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



Цитата(tzirechnoy @  10.11.2014,  21:35 Найти цитируемый пост)
Это структура, поля которой не опубликованы для кода, который её использует. То есть как в stdio (stdin/stdout) или много где ещё. Доступ внутрь имеет только библиотека, которая обеспечивает интэрфейс к ней.


как это должно помочь в моем вопросе?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.