Последовательность выполнения модели
Каждый объект GPSS имеет имя и номер. Имена объектам даются в различных операторах исходной программы, а соответствующие им номера транслятор присваивает автоматически. Блокам присваиваются их порядковые номера в исходной программе. «Прогон» текущей модели, то есть собственно моделирование, выполняется с помощью специальной управляющей программы, которую называют симулятором (от английского SIMULATE — моделировать, имитировать). Работа GPSS-модели под управлением симулятора заключается в перемещении транзактов от одних блоков к другим, аналогично тому, как в моделируемой СМО перемещаются заявки, соответствующие транзактам.
В начальный момент времени в GPSS-модели нет ни одного транзакта. В процессе моделирования симулятор генерирует транзакты в определенные моменты времени в соответствии с теми логическими потребностями, которые возникают в моделируемой системе. Подобным же образом транзакты покидают модель в определенные моменты времени в зависимости от специфики моделируемой системы. В общем случае в модели одновременно существует большое число транзактов, однако в каждый момент времени симулятор осуществляет продвижение только какого-либо одного транзакта.
Если транзакт начал свое движение, он перемещается от блока к блоку по пути, предписанному блок-схемой. В тот момент, когда транзакт входит в некоторый блок, на исполнение вызывается подпрограмма симулятора, соответствующая типу этого блока, а после ее выполнения, при котором реализуется функция данного блока, транзакт «пытается» войти в следующий блок. Такое продвижение транзакта продолжается до тех пор, пока не произойдет одно из следующих возможных событий:
1) транзакт входит в блок, функцией которого является удаление транзакта из модели;
2) транзакт входит в блок, функцией которого является задержка транзакта на некоторое определенное в модели время;
3) транзакт «пытается» войти в следующий блок, однако блок «отказывается» принять его.
В этом случае транзакт остается в том блоке, где находился, и позднее будет повторять свою попытку войти в следующий блок. Когда условия в модели изменятся, такая попытка может оказаться успешной, и транзакт сможет продолжить свое перемещение по блок-схеме.
Если возникло одно из описанных выше условий, обработка данного транзакта прекращается, и начинается перемещение другого транзакта. Таким образом, выполнение моделирования симулятором продолжается постоянно.
Проходя через блоки модели, каждый транзакт вносит изменения в содержимое счетчиков блоков. Значения этих счетчиков доступны программисту через СЧА блоков. Каждое продвижение транзакта в модели является событием, которое должно произойти в определенный момент модельного времени. Для того, чтобы поддерживать правильную временную последовательность событий, симулятор имеет таймер модельного времени, который автоматически корректируется в соответствии с логикой, предписанной моделью.
Таймеры большинства версий GPSS имеют следующие особенности:
1) регистрируются только целые значения (все временные интервалы в модели изображаются целыми числами);
2) единица модельного времени определяется разработчиком модели, который задает все временные интервалы в одних и тех же единицах;
3) симулятор не анализирует состояние модели в каждый следующий момент модельного времени (отстоящий от текущего на единицу модельного времени), а продвигает таймер к моменту времени, когда происходит ближайшее следующее событие.
Значения таймера доступны программисту через системные СЧА.
Всякое изменение состояния модели, например, переход транзакта от одного блока к другому, рассматривается как некоторое событие, происходящее в определенный момент условного (системного) времени, задаваемого таймером системы Фактически, таймер в интерпретаторе GPSS - это целочисленная переменная, значение которой соответствует текущему моменту условного времени модели.
При построении модели пользователь должен задаться соотношением единицы системного времени, используемого в модели, к реальному времени, в котором происходит функционирование моделируемой системы. Следует отметить, что системное время никак не связано с машинным временем, затрачиваемым на выполнение моделирования.
Центральной задачей, выполняемой симулятором, является определение того, какой транзакт нужно выбрать следующим для продвижения в модели, когда его предшественник прекратил свое продвижение. С этой целью симулятор рассматривает каждый транзакт как элемент некоторого списка.
В относительно простых моделях используются лишь два основных списка событий: список текущих событий и список будущих событий.
Список текущих событий включает в себя те транзакты, планируемое время продвижения которых равно или меньше текущего модельного времени (к последним относятся транзакты, движение которых было заблокировано ранее). Он организуется в порядке убывания приоритетов транзактов, а в пределах каждого уровня приоритета —в порядке поступления транзактов.
Список будущих событий включает в себя транзакты, планируемое время продвижения которых больше текущего времени (то есть события, связанные с продвижением этих транзактов, должны произойти в будущем). Этот список организуется в порядке возрастания планируемого времени продвижения транзактов.
Симулятор GPSS помещает транзакты в зависимости от условий в модели в тот или иной список и переносит транзакты из списка в список, просматривает списки, выбирая следующий транзакт для обработки, корректирует таймер модельного времени после обработки всех транзактов в списке текущих событий. Таким образом, в процессе моделирования интерпретатор автоматически определяет правильную очередность наступления событий. В случае, если нужные действия в намеченный момент времени выполнены быть не могут (например, занято устройство, к которому обращается транзакт), интерпретатор временно прекращает обработку «застрявшего» транзакта, но продолжает следить за причиной, которая вызвала блокировку его обработки.Как только эта причина исчезает (например, освобождается занятое устройство), интерпретатор возвращается к обработке задержанного транзакта.
Программа на GPSS представляет собой последовательность предложений, изображающих объекты того или иного типа, а ее работу нужно представить как движение транзактов через блоки модели. Таким образом, в отличие от традиционных языков программирования, в GPSS программируется не последовательность вычислений, а структура системы массового обслуживания, а также правила генерации и обработки транзактов.