multi-threading
Rewrited on Golang model from Babichev.org
original programm https://www.babichev.org/ds/source/model/
Директория содержит файлы для лабораторных работ по распределённым системам.
Цель: дать студентам (пользователям) небольшую инфраструктуру, позволяющую создавать модели распределённых процессов.
Требования:
Максимальная простота вхождения (требуется написать минимум кода и исправлять/дописывать минимальное количество файлов)
Моделирование распределённых процессов, обменивающихся сообщениями.
Моделирование синхронного режима работы (процессы, получившие сообщения в течении такта
синхронизации отправляют сообщения другим процессам, которые получают их в начале следующего такта.
Моделирование асинхронного режима работы (каждое сообщение доставляется процессу в течение времени, определённого весом связи
между процессами).
Моделирование потерь сообщений. Параметр errorRate (0 <= errorRate <= 1) определяет вероятность потери сообщения.
Робастные алгоритмы должны быть относительно устойчивы к потерям сообщений.
Типы алгоритмов для моделирования:
Топологические алгоритмы.
Построение остовных деревьев.
Определение достижимости узла.
Определение кратчайшего пути.
Алгоритмы выборов
Алгоритмы синхронизации
Алгоритмы определения завершения
Алгоритмы упорядоченной рассылки
.....
Как это реализуется:
Вся модель реализована на языке C++.
Имеются несколько простых классов (наследование не применяется) для реализации общих функций.
Они находятся в одном файле DSSimul.h. Файлы компилируются в операционных системах
Windows, OS X и linux, но не содержат функции main(). Цель лабораторной работы - написать
подходящий main() и функцию-обработчих сообщений (об этом далее). Пример приведён в проекте.
Главный класс проекта - мир, World. Он создаёт модели распределённых процессов (далее - просто процессы),
регистрирует (register) функции-обработчики (общие для всех процессов системы) и назначает обработчик для
конкретного процесса (assign).
Класс NetworkLayer отвечает за связи между процессами и доставку сообщений между процессами.
В одном мире может быть несколько сетей и каждый процесс может принадлежать нескольким сетям.
Он моделирует асинхронный и синхронный режимы посылки сообщений между процессами а также
может привносить ошибки в передачу (например, сообщение может быть потеряно с некоторой вероятностью).
Класс DistributedProcess моделирует сам распределённый процесс. Каждый процесс должен зарегистрироваться
в своей сети для того, чтобы известить сеть о своём появлении. Сеть теперь знает, куда посылать
сообщения, предназначенные для данного процесса. Для пробуждения процесса про получании сообщения используется класс Event.
Ведётся две очереди сообщений - входящая и рабочая.
Запускается два исполнительных потока - receiveThread и workerThread.
Первый из этих потоков обнаруживает появление сообщений во входящей очереди и если
сообщение требует обработки перекладывает её в рабочую.
Рабочий процесс анализирует по сообщению, какой функции-обработчику
предназначено сообщение и вызывает сообветствующий обработчик.
Названия остальных классов говорят сами за себя: Error, Exception, Thread, Mutex, Event, Message, MessageQueue.
Немного подробнее о рабочей функции.
Она вызывается с двумя аргументами. Первый - контекст класса DistributedProcess, который
даёт возможность определить топологию сети (непосредственных соседей) и свой номер.
Пользователь может добавить в класс DistributedProcess свой контекст, который будет использовать рабочая функция.
Для этого требуется:
- описать свою структуру или класс, поместить это описание в отдельный заголовочный файл или добавить описание в файл contextes.h (см. пример в файле).
- описать объект этого типа с уникальным именем (см. там же)
- добавить соответствующий #include в файл contextes.h (если нужно)
Этот контекст будет включён в общий контекст класса DistributedProcess и может быть использован как самой рабочей функцией,
так и любыми другими (это позволяет, например, в одной рабочей функции определить список всех доступных процессов, не только соседей,
а в другой рабочей функции посылать этим процессам сообщения.
Рабоча функция должна проверять сообщение, возвращать истину, если она готова и может обработать это сообщение и ложь,
если она не может его обработать (например, если сообщение предназначено другой рабочей функции)
Топология сети описается в файле config.data
Его команды:
processes 1 11
создать процессы от 1 до 11
link from 1 to 2 [latency 10]
link from 1 to all [latency 5]
link from all to all [latency 1]
setprocesses 2 5 TEST
send from 4 to 10 TEST_BEGIN 1
send from -1 to 1 TEST_BEGIN
wait all
Для примера имеется готовая рабочая функкция TEST