Pull to refresh

Среда моделирования Ptolemy

Reading time6 min
Views2K

Ptolemy


Ptolemy – это среда моделирования параллельных гетерогенных систем, работающих в режиме реального времени. Проект разрабатывается студентами университета Беркли под руководством профессора Эдварда Ли (Edward Lee). В качестве языка разработки используется Java. Ptolemy постоянно развивается. Добавляется поддержка новых моделей вычислений и новые демонстрационные модели, расширяется документация.

Ptolemy позволяет работать с десятком различных моделей вычислений, среди которых есть, например, дискретно временная модель (discrete-event modeling) и конечный автомат (finite-state machine). В основе моделирования лежат понятия Actor и Director, которые можно перевести как «Исполнительное звено» и «Управляющее звено» соответственно. Director задаёт модель вычисления, в которой работает симулируемая система. Множество Actor'ов в сочетании со связями между ними определяют собственно устройство системы. В рамках первой статьи я хочу обратиться к дискретно-временной модели.


Discrete Event


DE предоставляет основные инструменты для симуляции систем реального времени, например, систем массового обслуживания и сетей связи. Процесс имитационного моделирования представляет собой перемещение маркеров (token) между Actor'ами. Маркер по своей сути представляет какую-либо структуру данных. Когда маркер попадает в Actor, он запустить какое-либо действие, которое может изменить внутренне состояние Actor'а и породить новые события. DE-планировщик гарантирует, что все события происходят строго синхронно. Передача маркера между Actor'ами не занимает времени. Важно помнить, что маркеры не могут самопроизвольно появляться или исчезать.

Соберём простую дискретно-временную модель. Пусть это будет канал передачи данных, в котором моделируется задержка и потеря пакетов. В роли пакетов будут выступать маркеры. Для начала откроем окно редактора (File — New — Graph Editor). Большую часть окна занимает рабочая область, на которой предстоит собирать модель. Слева от рабочей области находится библиотека Actor'ов и Director'ов. Добавим на рабочую область DE Director из раздела Directors. Вместо английского слова Actor, которе в данном контексте лаконично на русский никак не переводится, далее я буду использовать слово «блок».

Поскольку маркеры не могут самопроизвольно появляться и исчезать, нам понадобится какой-нибудь источник. Используем блок SingleEvent из раздела Actors/DomainSpecific/DescreteEvents. Работает этот блок не хитро: выдаёт один маркер в указанный момент времени. Значение маркера и время можно указать в настройках блока (окно настройки параметров открывается двойным щелчком на блоке). Далее нам потребуется смоделировать задержку передачи пакетов в канале. Для этого добавим блок Server из того же раздела библиотеки. image Как следует из названия — этот блок моделирует работу сервера в понятиях системы массового обслуживания. Если маркер пришёл в свободный сервер, то он выдается на выход с задержкой, равной значению параметра serviceTime, а сервер на это время переходит в состояние «занят». Если маркер пришёл, а сервер занят, то он помещается в очередь сервера (размер которой определяет параметр capacity). Очередь работает по принципу FIFO, соответственно, когда сервер освобождается, самый старший маркер в очереди подаётся на выход с задержкой serviceTime. Сервер хорош тем, что в отличие, например, от простого блока Delay определяет задержку для каждого маркера в момент выборки из очереди (если сервер был свободен, то выборка происходит в момент прихода маркера). Простыми словами это означает, что в задержке не приходится учитывать время ожидания в очереди.

Соединим выход SingleEvent со входом сервера.image Если запустить модель, то при стандартных параметрах обоих блоков произойдёт следующее: в момент времени равный 0.0 на выходе блока SingleEvent появляется маркер типа boolean со значением true, попадёт в незанятый сервер, в тот же момент будет задержан на модельное время равное 1.0. В момент времени 1.0 маркер выйдет из сервера. Чтобы в этом убедить добавим плоттер (Actors/Sinks/TimedSinks/TimedPlotter). Плоттер принимает маркеры типа Double и отображает их на графике (время-значение). Белый цвет входного порта плоттера означает, что к нему можно подключить более одной линии. На графике маркеры разных линий будут отображаться разными цветами.

imageПоменяем значение маркера в SingleEvent на ноль, чтобы плоттер мог его отобразить. Для наглядности подадим выход сервера на вход блока Const (Actors/Sources/GenericSources), который будет генерировать маркер со значением 1 в момент прихода любого маркера на вход. Выход Const подадим на плоттер. После запуска модели должно открыться окно плоттера.
image В настройках формата отображения установим вид точек «dots». Плоттер оказывается незаменимым инструментом в отладке моделей, поскольку наглядно отображает не только значение маркера, но и соответствующий момент времени.

Пока что блок Server задерживает любой маркер на строго определенное время, указанное в его параметрах. Внесём элемент случайности. Для этого понадобится блок Uniform из раздела Actors/Random, который при поступлении маркера на вход генерирует новый маркер со случайным значением, распределенным по нормальному закону между нижней и верхней границами (задаются в параметрах). image Подадим выход сервера на вход trigger блока Uniform, а его выход — на вход serviceTime блока Server. Таким образом, маркер, прошедший через сервер вызывает генерацию нового значения задержки, которое применяется к следующему маркеру.
image

Для грубого соответствия смоделированного канала реальному не хватает только потерь пакетов при их передаче. Для моделирования потерь используем блок DiscreteRandomSource из того же раздела Random. В его параметре values указывается массив генерируемых значений, а в параметре pmf (Probability mass function) — массив вероятностей генерации каждого значения. Укажем в values значения 0 и 1, а в pmf — 0.85 и 0.15.
image

При приходе маркера на вход trigger блок с вероятность 85% будет генерировать ноль и с вероятность 15% — единицу. Соединим вход trigger с выходом сервера. (Для ветвления линий используются узлы — черный ромб на панели инструментов) Используем эти значения в качестве признака потери (единица — пакет потерян).

imageТеперь, когда в модели случайным образов определяется наличие потери пакета, осталось реализовать саму потерю. Для этого воспользуемся элементом Switch (раздел Actors/FlowControl/Aggregators). Пакет, поступающий на его вход, передается на один из выходов, номер которого определяет значение на входе control. Первая линия, подключенная к выходу Switch, имеет индекс 0, следующая — 1, и так далее. Подключим выход сервера через узел ко входу input блока Switch. Если теперь к его входу control подключить признак потери пакета, а к выходу всего одну линию, то при генерации признака потери (единица на входе control) маркер будет передаваться на линию с индексом 1, а для линии с индексом 0, которая и есть продолжение нашего канала, он будет «потерян».

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

Ptolemy позволяет создавать новые Actor'ы, собирая их из уже существующих. В разделе библиотеки Utilities находится блок CompositeActor, в который можно поместить любые другие блоки, в том числе и CompositeActor. Поместим модель канала в CompositeActor. Рабочая область CompositeActor открывается командой OpenActor из контекстного меню. Блок SingleEvent больше не нужен. Вместо этого добавим один входной и один выходной порт.
image
Соединим вход Server со входным портом, а выход Switch — с выходным. Блок, инкапсулирующий в себе простую модель канала готов.

Можно упростить работу с каналом, если «вывести наружу» все важные параметры: нижнюю и верхнюю границы диапазона временных задержек и вероятность потери пакета. Для этого в окне настройки параметров блока добавим параметры lowDelayBorder, highDelayBorder и lossProbability. Кнопка Add вызывает соответствующий диалог, в котором в частности можно указать значения по-умолчанию для добавляемых параметров. Имена новых параметров теперь доступны внутри блока. Заменим конкретные значения именами параметров в блоках Uniform и DiscreteRandomsource.
image
Теперь с каналом можно работать как с любым другим блоком даже не заглядывая внутрь — все настройки доступны извне.

Собрав примитивный источник пакетов:
image

можно протестировать работу канала:
image

В настройках DE Director'а есть важный параметр — stopTime. По-умолчанию он выставлен в бесконечность, но для наблюдения за такой простой моделью будет вполне достаточно значения 50.

На этом разрешите закончить знакомство с Птолемеем. Если тема окажется востребованной, то вскоре последует продолжение.
Tags:
Hubs:
+9
Comments5

Articles