GENERATE 480 ;фиктивный блок времени
TERMINATE 1
START 1
Транзакты, рождённые в первом GENERATE, просто уничтожаются. А единственный транзакт, рождённый во второмGENERATE, заходя в блок TERMINATE, уменьшает значение счётчика завершений на 1, а он был равен 1, т. е. счётчик обнуляется, и процесс моделирования останавливается. Таким образом, в этой модели гарантируется завершение прогона в определённый момент модельного времени, а точное количество транзактов, прошедших через модель, непредсказуемо.
Моделирование работы одноканальных устройств
Устройства используются при моделировании систем для имитации работы оборудования единичной ёмкости, например, процессор, канал передачи данных, человек, компьютер. Устройство в любой момент времени может обрабатывать только одно сообщение (транзакт). Одноканальные устройства заранее не описываются.
Для использования одноканального устройства транзакту необходимо выполнить следующие шаги:
· ждать очереди, если необходимо;
· когда подходит очередь, занять устройство;
· пропустить время, необходимое на обслуживание;
· когда обслуживание закончится, освободить устройство.
Второй и четвёртый шаги реализуются блоками SEIZE и RELEASE.
БлокSEIZE(занять устройство)имеет следующий формат:
SEIZE A
Аргумент А задаёт номер или имя занимаемого устройства.
Свободный блок SEIZE позволяет вошедшему в него сообщению занять указанное устройство. Блок SEIZE задерживает сообщение, если устройство занято или находится в состоянии недоступности. Сообщение, занявшее устройство, затем пытается перейти к следующему по номеру блоку. Устройство остаётся занятым до тех пор, пока занимающее его сообщение не войдёт в соответствующий блок RELEASE. Прежде чем освободить устройство, сообщение может пройти через неограниченное число блоков.
БлокRELEASE(освободить устройство)имеет следующий формат:
RELEASE A
Освободить устройство может лишь тот транзакт, который его занимает, иначе возникает сообщение об ошибке.
Транзакты обслуживаются устройствами в течение некоторого промежутка времени. Для моделирования такого обслуживания, т. е. для задержки транзактов на определённый отрезок модельного времени служит блокADVANCE (задержать), имеющий следующий формат:
ADVANCE A,B
Операнды A и B имеют тот же смысл, что и в соответствующих полях блока GENERATE. Операнд А обязателен. Любой транзакт входит в блок ADVANCE беспрепятственно.
Пример.
GENERATE 5,2
SEIZE 1
ADVANCE 4,2
RELEASE 1
В момент освобождения устройства должен быть решён вопрос о том, кто имеет право первым его занять. Транзакты регистрируются симулятором в списке перед блоком SEIZE и упорядочиваются согласно приоритетам и времени прихода. Первый из этого списка занимает устройство.
Моделирование очередей
В GPSS объекты типа "очередь" вводятся для сбора статистических данных. Необходимо понимать, что блоки очереди не влияют на реальное образование очередей транзактов (очереди образуются перед входами в устройства сами по себе), блоки являются регистраторами статистики. Статистика об очередях собирается в моменты входа транзакта в блок QUEUE(вход в очередь) или в блок DEPART (выход из очереди). Формат записи блока QUEUE:
QUEUE A,[B]
Операнд А задаёт номер или имя очереди. Может быть именем, положительным целым числом, СЧА. Поле Вопределяет число единиц, на которое увеличивается текущая длина очереди. Если поле В пусто, то по умолчанию прибавляется единица.
Когда транзакт входит в блок QUEUE, то ищется очередь с именем, определённым операндом А. Если необходимо, очередь создаётся. Значение текущей длины очереди хранится в СЧА Q$имя. Поскольку очередь обычно используется для измерения времени ожидания, за блоком QUEUE обычно следует такой блок, как SEIZE, который может задержать сообщение. Одно и то же сообщение может одновременно увеличить длину нескольких очередей, т. е. сообщение может войти в несколько блоков QUEUE перед тем, как войти в соответствующие блоки DEPART.
Блок DEPARTимеет следующий формат:
DEPART A,[B]
Блок DEPART служит для уменьшения счётчика длины очереди. В поле В задаётся число единиц, на которое уменьшается длина очереди. Это число не должно превышать текущую длину очереди, иначе возникает ошибка «длина очереди отрицательна». Если поле В пусто, длина очереди по умолчанию уменьшается на единицу.
Пример.Посетители приходят в кассу кинотеатра через 20 ± 10 сек, знакомятся с обстановкой 15 ± 15 сек и занимают очередь. Каждый посетитель приобретает билет у кассира в течении 20 ± 5 сек. Построить модель в течении 8 часов.
Запишем модель на языке GPSS.
SIMULATE ;управляющий блок на выполнение программы
GENERATE 20,10 ;приход посетителей
ADVANCE 15,15 ;знакомство с обстановкой
QUEUE 1 ;очередь к кассиру
SEIZE KASSA ;занять кассира
DEPART 1 ;освободить очередь
ADVANCE 20,5 ; покупка билета
RELEASE KASSA ;освободить кассира
TERMINATE ;уход из кассы
GENERATE 2880 ;таймер времени
TERMINATE 1
START 1
При наборе блоков удобно пользоваться окном Insert GPSS blocks (вставить блок), которое вызывается в меню Edit/Insert GPSS blocks.Выбрав в нём нужный блок, заполняем последовательно поля ввода для каждого операнда. Здесь удобно вводить метки и комментарии.
Моделирование многоканальных устройств (МКУ)
Многоканальное устройство (памяти) – особый объект языка для имитации разного рода накопителей, конвейеров, в которых одновременно могут находиться несколько транзактов. В отличие от одноканального устройства, для указания ёмкости (количества каналов) используется оператор описания памяти STORAGE. Как любой оператор описания он помещается между блоками SIMULATE и GENERATE. Формат оператора:
Имя STORAGE А
Сначала определяется имя МКУ, А – ёмкость МКУ (количество каналов).
Блок ENTER(занять МКУ) позволяет вошедшему транзакту использовать многоканальное устройство. Транзакт может быть задержан на входе в блок, если многоканальное устройство заполнено, или имеющейся ёмкости недостаточно, или устройство в данный момент недоступно. Формат записи:
ENTER A,[B]
Операнд А указывается номер или имя МКУ, определённое блоком STORAGE. В необязательном поле В содержится число занимаемых каналов. Если поле В пусто, то по умолчанию занимается один канал. Одно и то же сообщение может входить в неограниченное число многоканальных устройств, а впоследствии освобождать их (или часть из них).
Блок LEAVE(покинуть устройство) имеет формат:
LEAVE A,[B]
Блок LEAVE освобождает определённое число единиц многоканального устройства, указанных в поле В. Если это поле пусто, по умолчанию предполагается равным 1. Число освобождаемых единиц не должно превышать текущее содержимое многоканального устройства. Транзакт не обязан освобождать столько же единиц каналов, сколько занимал. Поле А блока LEAVE определяет номер или имя многоканального устройства.
Пример.Машины подъезжают на СТО с интервалом 4±2 мин и обслуживаются у одного из 3-х свободных мастеров в течении 60±4 – 5 мин , затем покидают станцию. Можно промоделировать следующим образом.
SIMULATE
CTO STORAGE 3
GENERATE 4,2
ENTER CTO
ADVANCE 60,45
LEAVE CTO
TERMINATE