BMDX

English >>>
(binary modules data exchange)
Библиотека на C++ для обмена сообщениями и высокоуровневыми объектами между процессами и двоичными модулями внутри процесса.


Исходный код - полный архив: (zip) >>>

Исходный код - отдельные файлы (красным показаны возможности включения частями):
bmdx_cpiomt.h
arrows1.png
bmdx_config.h
vecm_hashx.h
arrows2.png
bmdx_main.h, bmdx_main.cpp
arch_notes.txt
Исходный код примеров: см. ниже >>>

BMDX - особенности

> Высокая эффективность передачи и хранения данных.

> Объекты всех основных классов BMDX могут передаваться по указателю
  между динамически загруженными библиотеками и основным модулем;
  обеспечено корректное функционирование и совместимость двоичной структуры объекта в пределах платформы
  независимо от набора используемых компиляторов.

> Реализованы унифицированные классы-обёртки над API основных операционных систем для настольных
  и мобильных устройств, для решения повседневных задач, не связанных с графическим интерфейсом и сетью

> Целевая системная архитектура: AMD64, x86, arm64-v8a.

> Совместимость с WebAssembly, за исключением разделяемой памяти и многопотоковости.

> Совместимость со стандартами С++98(C99),11,14,17.

> Упрощённая структура исходного кода (5 файлов), с возможностью включения частями.

> Краткий перечень ОС и компиляторов, с которыми код библиотеки тестируется на постоянной основе:
  Windows, Ubuntu, FreeBSD, macOS, Solaris, Android, iOS.
  GCC, Clang, MinGW32, MinGW-w64, MSVC, Intel C++, Embarcadero C++, Sun C++.
  (Прим. Некоторые из вышеперечисленных названий включают официальные названия компаний
  и зарегистрированные товарные знаки.)

BMDX - 10 ведущих классов

1. dispatcher_mt - адресный обмен сообщениями внутри процесса и между процессами.
  Обеспечена скоростная передача объёмных двоичных вложений, до 6..8 GB/s (продолжительно) на среднем 4-ядерном ЦП.
  Скорость - того же порядка, что и в известных реализациях MPI (MPICH, OpenMPI).
  Также допускает прямую передачу произвольных объектов внутри процесса, в обёртке, обеспечивающей управление памятью.

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

3. pcos - общее хранилище объектов, доступное основному модулю и всем динамическим библиотекам.

4. mod_handle - обёртка над хэндлами динамических библиотек (.dll, .so).

5. hashx - частично упорядоченный хэшированный ассоциативный массив.
  Располагает элементы в порядке вставки ключей, поддерживая его до первого удаления ключа.
  Оптимизирован для скоростной вставки ключей. Время вставки целочисленного ключа ~55 ns на среднем ПК.

6. cref_t - полиморфный умный указатель. Поддерживает хранение скрытого объекта в дополнение к основному,
  пользовательское создание нового объекта, пользовательские обработчики событий счётчика ссылок
  и удаления основного объекта.

7. critsec_t - обёртка над стандартными API блокировок (pthread_mutex_lock и т. п.), с настройкой времени ожидания.

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

9. vnnqueue_t - неблокирующая очередь объектов. Поставщик и приёмник могут работать в разных потоках.
  Объекты, поставленные в очередь, не копируются и не перемещаются при изменении её размера.
  Место, освобождённое при снятии объектов, автоматически используется повторно.
  Режим фиксации и изменения ёмкости очереди задаётся клиентом.

10. shmobj2s_t - обёртка для объекта пользователя, размещаемого в разделяемой памяти.

+. Полный API библиотеки включает также несколько десятков часто используемых контейнеров,
  вспомогательных классов и функций.
  Вот некоторые из них, с относительно понятными названиями:
  carray_t, cpparray_t, arrayref_t, processctl, multithread, shmqueue_s, file_io, file_utils, paramline, vec2_t.

BMDX - примеры использования

Исходный код - 5 примеров использования: (zip) >>>

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

Пример 1. dispatcher_mt: передача сообщений с большим объёмом двоичных вложений.
Пример 2. dispatcher_mt: "устойчивое к сбоям" распространение событий нажатий клавиш
  между группой (окон) терминалов. При выходе или прерывании процесса, выполняющего роль сервера,
  другой процесс автоматически занимает его место.
  (Этот небольшой пример иллюстрирует передачу сообщений по подписке.)
Пример 3. dispatcher_mt: сильно-связанный вызов между потоками.
  Поток А вызывает функцию, выполняемую потоком Б, и ожидает получения возвращаемого значения либо кода ошибки.
Пример 4. shmqueue_s: простая передача данных (вводимого текста) через разделяемую память.
Пример 5. Примитивный хост плагинов. Пример иллюстрирует высокоуровневое взаимодействие разнородных
  (т.е. собранных разными компиляторами) модулей: основного, и динамически загруженных библиотек.

BMDX - план дальнейшей разработки

1. Добавить в диспетчер сообщений контроллер TCP и абстрактный контроллер,
для унификации адресного обмена данными по сети и между нестандартными устройствами,
в дополнение к обмену внутри компьютера.

2. Создать обёртки API диспетчера сообщений для некоторых языков высокого уровня (Java, Python, C#).

Контактная информация

См. e-mail в начале любого из заголовочных файлов библиотеки.