Взгляд На Раздел «Вычислительный Граф» Библиотеки Intel Threading Building Blocks С Точки Зрения Разработчика Bpms-Системы

Разрабатываем систему управления бизнес-процессами и административным регламентом.

Нас заинтересовал раздел tbb::flow библиотеки C++ шаблонов Intel Threading Building Blocks (TBB), поэтому картинки, которые мы видели в описании библиотеки, показались очень похожими на картинки графа бизнес-процессов систем автоматизации процессов.

При ближайшем рассмотрении TBB выяснилось, что объект, с которым работает секция tbb::flow, сильно отличается от классических бизнес-процессов, но он оказался настолько интересным, что мы решили написать, как его воспринимают разработчики BPMS. Библиотека TBB была разработана Intel для параллельного программирования.

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

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

Все операции в библиотеке рассматриваются как «задачи», которые динамически распределяются между ядрами процессора.

Программа, написанная с использованием TBB, создает, синхронизирует и уничтожает графы зависимостей задач в соответствии с алгоритмом.

Затем задачи выполняются в соответствии с зависимостями.

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



Структура библиотеки
Библиотека представляет собой набор шаблонов классов и функций для параллельного программирования.

В библиотеке реализовано:

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

Далее библиотека сама оптимально сопоставит задачи с потоками.



Описание вычислительного графа
Этому дизайну посвящен раздел библиотеки — tbb::flow. Зависимости многих приложений, работающих в операционной системе, хорошо описаны с точки зрения сообщений, перемещающихся между узлами в графе потока сообщений.

Эти сообщения могут содержать данные или просто быть сигналами о том, что «предшественник» завершился.

Эти сообщения чем-то похожи на точки управления BPM-систем.

Узлы графа связаны с приложениями-исполнителями задач.

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



Основные компоненты раздела tbb::flow
Раздел состоит из трех основных компонентов:
  • Объект графа
  • Узел
  • Края
Объект Graph является владельцем всех задач, созданных от имени соответствующего графа потока сообщений.

Объекты Узлы инициируют объекты пользовательских функций или управляют сообщениями как входящими/исходящими относительно других узлов.

Ребра — это связи между узлами (аналогично переходам в BPMS).



Протокол передачи сообщений
Ребра динамически переключаются между протоколами Pull и Push. Граф можно представить в виде конструкции G = (V, S, L), в которой V — множество узлов, S — множество ребер по протоколу Push, L — множество ребер по протоколу Pull. Для каждого ребра (Vi, Vj) Vi является предшественником (предшественником или отправителем), а Vj — преемником или получателем.

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

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

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

Это очень интересная конструкция, ничего подобного в BPMS нет, где узел не может «отражать» контрольную точку.

Использование механизма переключения протоколов — ключевое отличие библиотеки TBB от других подобных библиотек, которые в случае сбоя просто периодически повторяют попытку передачи сообщения.

Этот механизм позволяет существенно повысить эффективность взаимодействия приложений.



Объекты — Объекты тела
Объекты тела используются в узлах графа.

Эти объекты предоставляются пользователями.

Эти объекты могут быть созданы объектами функций или специальными выражениями.

Объекты тела, передаваемые между узлами, копируются.

Таким образом, изменение объекта Body в узле-получателе не приводит к изменению соответствующего объекта Body в узле-отправителе.

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



Типы вершин (типы узлов графа) и описание того, как они работают



Блок буферного узла


Взгляд на раздел «вычислительный граф» библиотеки Intel Threading Building Blocks с точки зрения разработчика BPMS-системы

Узел буфер_узел.

Узел имеет неограниченный буфер для сообщений типа «Т».

Узел «транслирует» сообщения своим преемникам (одному из преемников) в случайном порядке.

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

Узел очередь_узел.

Узел имеет неограниченный буфер для сообщений типа «Т».

Узел пересылает сообщения в порядке FIFO (одному из преемников).

В этом случае наследники сортируются в том порядке, в котором они зарегистрированы в узле.

Если преемник отражает сообщение, то узел отправляет это сообщение следующему преемнику в списке.

Priority_queue_node. Узел пересылает сообщения в порядке приоритета.

(То есть из всех доступных сообщений узел сначала пытается переслать сообщение с наивысшим приоритетом).

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

Если кто-то из наследников получил сообщение, то оно удаляется из буфера.

Узел-sequencer_node. Узел имеет неограниченный буфер для сообщений типа «Т».

Узел «пересылает» сообщения в последовательном порядке.

Если преемник отражает сообщение, то узел отправляет это сообщение следующему преемнику.



Блок узла разделения/соединения


Взгляд на раздел «вычислительный граф» библиотеки Intel Threading Building Blocks с точки зрения разработчика BPMS-системы

join_node. Узел создает кортеж (вектор) из сообщений, полученных по всем входящим ребрам, умножает и «транслирует» этот кортеж всем своим преемникам.

Узел поддерживает три политики буферизации сообщений: резервирование, очередь и сопоставление тегов.

Политика организации очередей: Все входящие сообщения на каждом ребре располагаются по принципу «первым пришел — первым обслужен».

Если на каждом ребре есть хотя бы одно сообщение, то все сообщения, отправленные первыми, удаляются с ребер, и кортеж отправляется всем преемникам.

Политика резервирования: На каждом ребре разрешено только 1 или 0 сообщений.

Отражаются входящие сообщения на ребре, на котором уже есть сообщение.

Далее предпринимаются попытки вытянуть предшественников, у которых нет сообщений по краям.

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

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

Затем сообщения на каждом ребре группируются в хеш-таблицу согласно их тегам.

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

Узел или_узел.

Узел реплицирует и «транслирует» сообщение всем своим преемникам, независимо от того, с какого входящего ребра пришло это сообщение.

Узел Split_node. Узел, имеющий одно входящее ребро и несколько исходящих ребер.

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

Узел — это вариант multifunction_output_node, где тело отправляет каждый элемент входящего кортежа вдоль исходящего ребра в соответствии с индексом элемента в кортеже.



Функциональный узловой блок


Взгляд на раздел «вычислительный граф» библиотеки Intel Threading Building Blocks с точки зрения разработчика BPMS-системы

Узел Source_node. Этот узел может не иметь предшественника.

Узел никогда не выполняется параллельно.

Узел выполняет свою основную функцию и отправляет результат одновременно всем своим преемникам.

Продолжить_узел.

После того как узел получает сообщение от своего предшественника, он выполняет объекты своего тела.

Только после этого он перенаправляет continue_msg его преемнику.

Узел Function_node. Узел имеет ограничение на одновременные действия.

Если узел не может обработать сообщение немедленно, он помещает сообщение в буфер FIFO. Можно сделать такую настройку, что если буфер FIFO заполнен, то узел отказывается обрабатывать входящее сообщение.

Multioutput_function_node. Узел, имеющий только одно входящее ребро и более одного исходящего ребра.

Узел имеет ограничение на количество одновременно обрабатываемых входящих сообщений.

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

Эти органы создают сообщения, которые отправляются преемникам.



Другой блок узлов


Взгляд на раздел «вычислительный граф» библиотеки Intel Threading Building Blocks с точки зрения разработчика BPMS-системы

Broadcast_node. Узел реплицирует и пересылает входящее сообщение всем своим преемникам.

Узел write_once_node. Этот узел имеет буфер только с одним элементом, который не может быть заменен динамически.

Только после явной команды очистки буфер может принять новое сообщение.

Узел overwrite_node. Этот узел имеет буфер только с одним элементом, который можно динамически перезаписывать.

Узел Limiter_node. Узел, который подсчитывает и ограничивает количество проходящих через него сообщений.

Узел реплицирует и пересылает входящее сообщение всем своим преемникам, но перестает принимать новые сообщения, если лимит сообщений превышен.

Мы видим, что функционал этих узлов значительно богаче, чем функционал узлов BPMS. Аналогично узлам секции tbb::flow, в BPMS можно перемножать контрольные точки для всех исходящих из узла переходов, также можно объединять контрольные точки, пришедшие в узел для всех входящих переходов, можно «перебрасывать» контрольные точки, поступившие от любого входящего перехода, на одиночный исходящий переход. Однако в BPMS полностью отсутствует такое понятие, как буфер, нет «пересылки» сообщения в случайном порядке, нет приоритетов для контрольных точек BPMS, нет понятия кортежа контрольных точек, нет такие понятия, как толкание и вытягивание контрольной точки.



выводы

Таким образом, знакомство с разделом tbb::flow библиотеки TBB показывает разработчику BPMS, с каким простым объектом он работает и насколько этот объект можно усложнить, расширив поведение элементов графа.

Также становится понятно, насколько можно увеличить функциональность BPMS, добавив в ее схему дополнительные элементы, аналогичные элементам секции TBB tbb::flow. Ссылка на описание библиотеки TBB Теги: #bpms #Чулан

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.