Логика работы интерпретатора
В системе генерируются транзакты, которые упорядочиваются в цепях. В системе моделирования имеются следующие цепи:
- цепь текущих событий (одна цепь в системе);
- цепь будущих событий (одна цепь в системе).
Цепь текущих событийсостоит из транзактов, для которых планируется их продвижение в одном или нескольких блоках в течение текущего значения модельного времени или в ближайшем будущем. В эту цепь входят так же те транзакты, движение которых заблокировано из-за соответствующих текущих условий модели.
В цепь будущих событий входят транзакты, движение которых не планируется до наступления некоторого момента времени в будущем. Такая ситуация может возникнуть в двух случаях:
1. Транзакт попал в блок ADVANCE и, до некоторого момента, нет возможности продвинуть его в следующий блок модели.
2. Транзакт должен войти в модель в некоторый более поздний момент времени через блок GENERATE.
Транзакт, в один и тот же момент времени, может находиться только в одном блоке и только в одной цепи. Система моделирования изменяет свое состояние при просмотре цепи текущих событий от начала к концу, рассматривая транзакт за транзактом. Интерпретатор выбирает транзакт из цепи текущих событий и продвигает его от блока к блоку до тех пор, пока не встретится одна из следующих ситуаций:
1. Транзакт входит в блок ADVANCE, в котором он должен пробыть некоторый отрезок времени. В этом случае интерпретатор отправляет этот транзакт в цепь будущих событий, помещая его в ту позицию, которая соответствует времени выхода транзакта из цепи в следующий блок.
2. Возникает условие блокировки, означающее, что транзакт не может войти в следующий блок. Тогда он остается в цепи текущих событий.
3. Транзакт входит в блок TERMINATE. В этом случае интерпретатор удаляет его из цепи текущих событий и из всей модели.
Когда транзакт прекратит свое движение, интерпретатор выполняет одно из двух действий:
1. Выбирается следующий по очереди транзакт из цепи текущих событий.
2. Следующий транзакт берется не следующий по очереди, а интерпретатор начинает просматривать цепь текущих событий сначала. Это происходит тогда, когда последний блок, прошедший через интерпретатор, прошел блоки SEIZE или RELEASE. В этом случае, блокировки для некоторых транзактов могут быть сняты, а это значит, что их можно будет двигать дальше.
После того, как был обработан последний транзакт в цепи текущих событий, интерпретатор начинает работать с цепью будущих событий:
Интерпретатор продвигает модельное время (в счетчике) к значению, запланированному к движению следующего транзакта. Этот транзакт, как и другие транзакты с таким же временем, переносятся из цепи будущих событий в цепь текущих событий, в которой они занимают место в соответствии со своим приоритетом (чем выше уровень приоритета, тем ближе к началу встанет транзакт). Затем, начинается новый просмотр транзактов в цепи текущих событий.
Обработка транзактов, имеющих одно и то же время, например, прибытия и обслуживания в устройстве, может привести к неправильным результатам. Для предотвращения ошибки, надо следить за тем, чтобы приоритет у транзакта, пребывающего на устройство был ниже, чем приоритет у транзакта, находящегося на обслуживании в устройстве.
Дата добавления: 2016-11-04; просмотров: 1805;