Программирование в GPSS

Синтаксис, семантика и прагматика языка GPSS

В алфавит языка GPSS входят следующие символы:

A, B, ..., Z - большие буквы латинского алфавита,

1, 2, ...., 9, 0 - цифры,

? – вопросительный знак (для вызова помощи),

@ - коммерческое по (знак остатка от деления),

# - решетка (номер) - используется как знак умножения,

$ - знак доллара,

^ - «карет» - знак возведения в степень,

+ - плюс,

- - минус,

_ - подчеркивание,

* - звездочка,

/ - косая черта (знак деления),

( - левая скобка,

) - правая скобка,

‘ - апостроф,

. - точка,

, - запятая,

- пробел.

Формальные правила написания программ на языке GPSS образуют его синтаксис.

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


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


Описываемые на GPSS абстрактные системы строятся из набора простых объектов. Эти объекты делятся на четыре класса: динамические, оборудование, статистические и операционные.

Динамические объекты называются транзактами. Эти объекты могут возникать и уничтожаться. Транзакты движутся в системе и производят при движении ряд действий. Транзакты могут также «размножаться» и «склеиваться».

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


Ниже приводятся некоторые интерпретации транзактов.

Моделируемая система

 

Интерпретация транзакта

Кинотеатр

Зритель

ЭВМ

Задание

Универсам

Покупатель

Сеть перекрестков

Автомобиль

Сеть ЭВМ

Сообщение

Производственный участок

Изделие

Оборудование в GPSS подразделяется на следующие типы: устройства, памяти и логические ключи. Оборудование подвергается определенным воздействиям со стороны транзактов.

Устройство может находиться в одном из трех состояний: свободном, занятом или захваченном. В начальный момент все устройства свободны. Переходы устройства из одного состояния в другое происходят в результате воздействия транзактов, которые могут соответственно освобождать, занимать или захватывать устройства. Устройство в каждый момент времени может быть занято или захвачено не более чем одним транзактом.


 

Моделируемая система

Интерпретация устройства

Кинотеатр

Кассир

ЭВМ

Процессор

Универсам

Продавец

Сеть ЭВМ

Канал связи

Производственный участок

Станок

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


Моделируемая система

Интерпретация памяти

Кинотеатр

Зрительный зал

ЭВМ

Запоминающее устройство

Универсам

Место для очереди

Сеть ЭВМ

Буферная память

Производственный участок

Бункер для изделий

Логический ключ имеет 2 состояния: S (включен) и R (выключен). Состояния ключа устанавливаются одними транзактами и могут проверяться другими. Результаты проверки могут учитываться в последующих действиях транзактов. В начальном состоянии все ключи в системе выключены.

При моделировании сети перекрестков ключ может соответствовать светофору.


Представителями статистических объектов являются очереди и таблицы. Эти объекты вводятся в модель в подавляющем числе случае не с целью отображения каких-либо реальных объектов, а только для сбора необходимой пользователю статистики о модели. Следовательно, статистические объекты ориентированы не на семантику, а на прагматику языка GPSS и для них нельзя привести таблицу.

Каждая очередь в GPSS-системе имеет выход и вход. Очередь подсчитывает статистические данные о проходящих через нее транзактах: число проходящих тран­зактов, среднее время задержки транзактов в очереди и т.д.

Таблица может для любой указанной пользователем величины фиксировать и об­рабатывать последовательность ее значений. По наблюдаемым значениям ука­зан­ной величины таблица вычисляет определенную статистическую информацию об этой величине: ее математическое ожидание, среднее квадратичное отклонение и т.д.


Операционные объекты в GPSS называются блоками. Блоки являются ячей­ка­ми пространственной структуры GPSS-системы: ее функциональное пространство име­ет вид последовательности блоков. Транзакты в системе всегда находятся в ка­ких-либо ее блоках. Движение транзактов в системе есть их перемещение из одних блоков в другие. В то же время каждый блок представляет собой некоторый алгоритм преобразования объектов системы. Этот алгоритм выполняется, если транзакт находится в блоке.

Динамика GPSS-системы характеризуется тем, как проходят изменения состояний ее объектов во времени.


Все объекты системы изменяют свои состояния скачкообразно. Модельное время складывается из интервалов постоянства состояний объектов и из отдельных моментов мгновенного изменения состояний. Изменения состояний объектов называются событиями. Каждое событие происходит в момент перемещения какого-либо транзакта из одного блока в другой. Последовательность разделенных интервалами времени мгновенных событий, происходящих при движении в модели фиксированного транзакта, называется процессом.


Прежде чем начать изучение основных объектно-ориентированных средств языка GPSS, целесообразно ознакомиться с его общеалгоритмической частью. Общеалгоритмические средства GPSS включают способы записи постоянных и переменных величин, способы указания вычислений и запоминания их результатов и т.д.

Для любого общеалгоритмического средства GPSS можно найти аналог почти в любом алгоритмическом языке.


Алгоритм, выполняемый при входе транзакта в блок, определяется типом бло-ка, указанным в поле операции, и операндами, которые записаны в поле операндов. Операнды дают выполняемому алгоритму информацию о текущем состоянии объектов системы в виде значений стандартных числовых атрибутов (СЧА).

В общем случае любой СЧА имеет вид:

tj, где t - идентификатор выражаемой атрибутом характеристики, j - указание, к какому именно объекту относится данная характеристика. Например, СЧА, значение которого равно текущему содержимому (числу занятых единиц) памяти номер 1, имеет вид:

Q1, где буква Q обозначает «текущая длина очереди», а число 1 указывает, что имеется в виду очередь номер 1.

В общем случае идентификатор характеристики t состоит из одной или двух букв, а указатель j является либо номером объекта (как в S1), либо присоединенным именем объекта, либо косвенным номером объекта.

Присоединенное имя состоит из знака $ и метки объекта. Так, значение атрибута

S$MEM

равно текущему содержимому памяти, которая имеет метку МЕМ.

Косвенный номер объекта состоит из знака * и номера параметра транзакта. При этом имеются в виду параметры того транзакта, который обрабатывается в данный момент времени. В качестве косвенного номера объекта принимается содержимое указанного параметра транзакта. Например, значение атрибута

Q*2

равно текущей длине очереди, номер которой записан во втором параметре транзакта.

Примеры СЧА:

R2 - число свободных единиц памяти номер 2;

SM$MEM1 - максимальное содержимое памяти, имеющей метку МЕМ1;

F70 - состояние устройства 70; F70 равно нулю, если устройство 70 свободно и единице в остальных случаях;

Р3 - содержимое третьего параметра транзакта;

Р*3 - содержимое того параметра транзакта, номер которого записан в третьем параметре этого параметра;

PR - приоритет транзакта;

С1 - текущее значение модельного времени;

W179 - число транзактов, находящихся в данный момент в 179 -ом блоке модели;

W$ABC00 - число транзактов в блоке, имеющем метку АВС00;

Q1 - длина очереди номер 1;

FN$NORM - значение функции с меткой NORM;

V$COST - значение арифметической переменной с меткой COST;

RN1 - псевдослучайное число, равномерно распределенное в интервале от 0 до 1000. В GPSS имеется практически неограниченное число таких СЧА (RN1, RN2, …, RN100…). Для вычисления каждого из этих СЧА используется свой генератор псевдослучайных чисел.


Для большей универсальности языка GPSS у некоторых СЧА стандартизировано лишь обозначение, а смысл этих СЧА и алгоритмы их вычисления определяются пользователем при описании модели. К таким СЧА относятся арифметические переменные. Обозначение арифметической переменной имеет вид V$name. Использовать любой конкретный СЧА вида V$name в качестве операнда можно лишь при условии, что этот СЧА описан пользователем в данной модели.

Описание атрибута V$name осуществляется в строке описания арифметической переменной. В одной строке описывается одна переменная. В поле метки обязательно записывается имя описываемой переменной, в поле операции записывается слово VARIABLE или FVARIABLE, а в поле операндов - арифметическое выражение, составляемое из СЧА, знаков арифметических операций и круглых скобок.

В арифметическом выражении можно использовать следующие знаки арифметических операций:

+ - сложить,

- - вычесть,

# - умножить,

/ - разделить,

@ - взять остаток от деления,

^ - возведение в степень.

Пусть, например, переменная V$SUM описана строкой

SUM VARIABLE S1+S2.

Тогда значение V$SUM будет определяться как суммарное содержимое первой и второй памяти. Если переменную V$CAP описать в виде

CAP VARIABLE R#8+5#8,

то её значением будет сумма числа свободных и числа занятых единиц той памяти, номер которой записан в восьмом параметре транзакта.

При описании арифметических переменных необходимо иметь в виду следующее:

1) Равноприоритетные операции в арифметическом выражении при отсутствии скобок выполняются слева направо. Операции #, /, @ имеют приоритет по отношению к операциям +, -.

2) Если в строке описания арифметической переменной в поле операции записано VARIABLE, переменная считается целой, в случае записи FVARIABLE - вещественной. При вычислении целой переменной от результатов всех промежуточных операций берется целая часть. При вычислении вещественной переменной этого не делается. Однако окончательный результат округляется в меньшую сторону, как в целой, так и в вещественной переменной. Например, если в модель включены строки

ABC1 FVARIABLE 10#(11/3)
ABC2 VARIABLE 10#(11/3)
ABC3 FVARIABLE 1/5

то описанные в этих строках переменные будут иметь следующие значения:

V$ABC1 = 36,
V$ABC2 = 30,
V$ABC3 = 0.

3) Синтаксис арифметических выражений соответствует синтаксису, принятому в языках программирования высокого уровня. Например, аргументы стандартных функций типа SIN, EXP,SQR, и т.п. должны заключаться в скобки.


Обозначение булевской переменной имеет вид BV$name. Этот СЧА, как и арифметическая переменная, описывается в тексте модели пользователем. Булевская переменная описывается в строке описания булевской переменной. В одной строке описывается одна переменная. В поле метки обязательно записывается имя переменной, в поле операций - слово BVARIABLE, а в поле операндов - булевское выражение. Булевское выражение составляется из элементов пяти типов: СЧА, отношений, стандартных логических атрибутов (СЧА), знаков логических операций и скобок. Значением булевской переменной является число 1, когда булевское выражение истинно и число 0 - в противном случае. Подчеркнем, что значением булевской переменной являются именно числа.

Отношение представляет собой запись двух СЧА, соединенных одним из знаков:

‘G’ - больше чем,

‘L’ - меньше чем,

‘E’ - равно,

‘NE’ - не равно,

‘LE’ - меньше или равно,

‘GE’ - больше или равно.

Отношение имеет значение «истинно» в том и только в том случае, если значения входящих в него СЧА отвечают смыслу соединяющего знака. Например, переменные BV$LOG1 и BV$LOG2 , описанные строками:

LOG1 BVARIABLE V$ABC1’G’5

LOG2 BVARIABLE V$ABC1’NE’V$ABC2,

всегда равны единице, если V$ABC1 и V$ABC2 описаны так, как в предыдущем параграфе.

Если СЧА в логическом выражении не входит в отношение, то ему приписывается логическое значение (в этом случае СЧА должен быть заключен в скобки). Логическое значение «ложно» приписывается в случае, если численно СЧА равен нулю, во всех остальных случаях приписывается значение «истинно».

Стандартные логические атрибуты (СЛА) в GPSS отражают состояние оборудования в модели. Это следующие атрибуты.

СЛА устройств:

FIj - устройство j захвачено,

FNIj - устройство j не захвачено,

FUj - устройство j занято,

FNUj - устройство j свободно,

Fj - устройство j не свободно,

FVj – устройство j доступно,

FNVj – устройство j недоступно.

СЛА памятей:

SFj - память j заполнена,

SNFj - память j не заполнена,

SEj - память j пуста,

SNEj - память j не пуста,

SVj – память j доступна,

SNVj – памятьj недоступна.

СЛА ключей:

LSj - логический ключ j включен,

LRj - логический ключ j выключен.

СЛА блоков MATCH:

M – в j-ом блоке синхронизации есть транзакт того же семейства,

NM – в j-ом блоке синхронизации нет транзакта того же семейства.

Последние два СЛА могут быть использованы только в блоке GATE.

СЛА имеет значение «истинно» тогда и только тогда, когда выполняются соответствующие ему условие - в приведенном перечне оно записано напротив вида индикатора. Указатель j в обозначении индикатора задается так же, как и в обозначении СЧА, т.е. может быть номером, косвенным номером или именем объекта.

Знаки логических операций в описании булевской переменной - это знак логического сложения (+) и знак логического умножения (#). Операция умножения имеет приоритет по отношению к операции сложения. Например, булевская переменная BV$RESURS, описанная строкой:

RESURS BVARIABLE FNU1#FNU2+SNF1#SNF2,

равна единице тогда и только тогда, когда устройства 1 и 2 оба свободны, или памяти 1 и 2 обе не заполнены.

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


Функция — это СЧА, обозначаемый в виде FN$name и описываемый пользователем в виде численной зависимости FN$name от другого СЧА. Рассмотрим на примерах, как это делается.

Пусть необходимо, чтобы значение FN$KL1 вычислялось в модели через S$MEM в соответствии с графиком, изображенным на приведенных ниже рисунках.

Рис. *1

Функция, вычисляемая в соответствии с таким кусочно-постоянным графиком, называется дискретной функцией. Она описывается следующими строками:

KL1 FUNCTION S$MEM,D3
5.5,12.2,/9,20/12,6.1.

Первая строка описания функции должна содержать метку функции в поле метки, слово FUNCTION в поле операции и два операнда в поле операндов. Первый операнд является обозначением того СЧА, который выбран в качестве аргумента функции. В данном примере это S$MEM – количество занятых единиц памяти MEM. Второй операнд состоит из буквы D, обозначающей, что данная функция дискретная, и из числа точек, которыми задается график функции. Координаты точек, задающих график, записываются в последующих строках описания функции. Из примера видно, что каждая точка задается парой координат, разделенных запятой, причем вначале указывается абсцисса точки, потом ордината. Координаты разных точек разделяются косой чертой. Функция может задаваться любым числом точек. Запись координат точек начинается с 1-й позиции строки и может быть продолжена на последующих строках.

Перенос записи координат на следующую строку следует производить, начиная с новой пары координат. При этом ту пару координат, которая оказывается на строке последней, не обязательно заканчивать разделяющей косой чертой.

Абсциссы точек графика, указываемые в строках описания функции, должны быть все упорядочены по возрастанию.

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

Кроме того, если значение аргумента в процессе моделирования окажется за пределами диапазона, охваченного графиком, то соответствующий крайний отрезок графика автоматически «продолжается» до нужного места. Так что описанная выше дискретная функция FN$KL1 будет иметь в зависимости от S$MEM следующие значения:

? 12.2 , при - ? < S$MEM < 5.5,

FN$KL1 = ? 20, при 5.5 < S$MEM < 9,

? 6.1 , при 9 < S$MEM < ? .

График функции FN$KL2, изображенный на рис.*1, получен путем соединения нескольких точек ломаной линией. Функция, задаваемая таким графиком, называется непрерывной. Функция FN$KL2 в данном случае описывается строками:

KL2 FUNCTION V$PO,C5
0,1.6/0.5,4/0.8,12.4/1.3,9.5/1.5,3.3.

Как видим, отличие описания непрерывной функции от дискретной состоит лишь в том, что в первой строке вместо признака D дискретной функции должен быть признак С непрерывной функции.

Если при вычислении непрерывной функции значение ее аргумента выходит за диапазон, заданный в графике, то график автоматически «продолжается» горизонтальными прямыми: влево - на уровне первой заданной точки графика, вправо – на уровне последней.

Важным частным случаем рассмотренных видов функций являются функции с аргументом RNj. Если в строке FUNCTION в поле A записан аргумент RNj , то подразумевается, что в действительности используется не сам СЧА RNj , а полученное с его помощью псевдослучайное число, заключенное в диапазоне от 0 до 0,999999 включительно, т.е. RNj берется в масштабе 1:1000. Когда аргументом функции является случайное число, то функция также будет принимать случайные значения. Функция от аргумента RNj используется для моделирования случайных величин, имеющих требуемые законы распределения вероятностей. Например, дискретная функция, описанная строками:

DIS FUNCTION RN1,D4
0.1,1/0.3,5/0.4,7/1.0,8 ,

будет принимать значение 1 с вероятностью 0,1, значение 5 с вероятностью 0,2, значение 7 с вероятностью 0,1 и значение 8 с вероятностью 0,6.

Действительно, график функции FN$DIS имеет вид, показанный на рис.*4. По­э­тому функция FN$DIS примет при ее очередном вычислении значение 1, если RN1 попадет в интервал от 0 до 0,1. Вероятность этого равна 0,1. Значение 5 для FN10 будет получено с вероятностью попадания RN1 в интервал от 0,1 до 0,3. Эта ве­роятность равна 0,3 - 0,1 = 0,2. Аналогично определяются вероятности значений 7 и 8.

Рис. *4

Дискретные функции от RNj применяются для моделирования дискретных случайных величин, непрерывные для непрерывных. Реализация непрерывных случайных величин осуществляется методом обращения. Функция от RNj в этом случае является обратной по отношению к требуемой функции распределения вероятностей моделируемой случайной величины.

Пример. Функция с меткой EXP , если ее описать так, как показано ниже, будет иметь случайные значения, распределенные по экспоненциальному закону с математическим ожиданием единица:

EXP FUNCTION RN1,C24
0,0/1,.104/.2,.222/.3,.355/.4,.509/.5,.69
.6,.915/.7,1.2/.75,1,38/.8,1.6/.84,1.83/.88,2.12
.9,2.3/.92,2.52/.94,2.81/.95,2.99/.96,3.2/.97,3.5
.98,3.9/.99,4.6/.995,5.3/.998,7/.9997,8.

В GPSS World содержится операция вычисления натурального логарифма, то можно задавать преобразование RN1 в экспоненциальную случайную величину без такого громоздкого набора чисел, как в приведенном примере функции FN$EXP. Аналитически такое преобразование выражается формулой:

у = - M?ln (z),

где z – равномерная случайная величина, заданная на интервале (0,1),

M – произвольный положительный числовой множитель,

y – функция от z, (т.е. тоже случайная величина). Распределение случайной величины y будет экспоненциальным с математическим ожиданием M.

В GPSS World содержится стандартная функция задания экспоненциального распределения, например

Generate (Exponential(1,0,65))

генерирует тракзакты по экспоненциальному закону распределения, в среднем 65 тракзактов.

С другой стороны применение в GPSS функций FUNCTION позволяет значительно ускорить вычисления. Это ускорение обеспечивается за счет того, что числовая информация о функции FUNCTION представляется в памяти ЭВМ в виде таблицы, в которой для возможных значений аргумента уже хранятся готовые, заранее заданные значения функции или же они могут быть определены с помощью простой линейной интерполяции.

В GPSS наряду с рассмотренными двумя видами функций (дискретной и непрерывной) имеются ещё несколько более специальных видов функций.


Для того чтобы в модели можно было организовать запоминание каких-либо данных, в языке GPSS имеются специальные СЧА, называемые ячейками сохраняемых величин или ячейками SAVEVALUE. Ячейка имеет обозначение вида Xj, где j – номер или имя ячейки.

Запись значений в ячейку осуществляется при входе транзакта в блок SAVEVALUE. Поле A этого блока интерпретируются как номер, косвенный номер или имя ячейки, поле В - как записываемое в нее значение.

Если в поле A записан СЧА, то его значение рассматривается как номер ячейки.

Пусть, например, транзакт проходит в модели через следующую цепочку блоков:

SAVEVALUE OPERATION_NUMBER,157
SAVEVALUE 1,Х$OPERATION_NUMBER
SAVEVALUЕ Х1,C1.

Тогда будут выполнятся следующие действия:

  • запись числа 157 в ячейку Х$OPERATIONS_NUMBER;
  • запись числа 157 в ячейку 1;
  • запись текущего времени в ячейку номер 157.

В начальный момент времени, когда в ячейки еще ничего не записывалось, все они имеют нулевое значение.

Если к обозначению СЧА в поле A блока SAVEVALUE приписать знак + или -, то в ячейке вместо записи значения будет производиться добавление или, соответственно, вычитание этого значения. Например, прохождение транзактом блоков

SAVEVALUE 11+,S1
SAVEVALUE 12-,V$DIFFERENCIAL

вызовет добавление числа занятых единиц памяти номер 1 в ячейку 11 и вычитание переменной DIFFERENCIAL из ячейки номер 12.

Наряду с ячейками в моделях на языке GPSS можно использовать матрицы ячеек. В отличие от простых ячеек матрицы перед использованием должны быть описаны. Для описания матрицы применяется строка описания матрицы. В поле метки этой строки записывается имя описываемой матрицы, в поле операции - слово MATRIX, в поле операндов - параметры матрицы: в поле A записывают любое слово или оставляют поле пустым, в поле В указывают число строк матрицы, в поле С - число столбцов. Например, описать матрицу ITOGI размерами 2 4 можно с помощью строки:

ITOGI MATRIX ,2,4.

В начальный момент любая матрица содержит только нулевые значения.

После того как матрицы описаны, можно использовать в качестве СЧА индексированные переменные - ячейки этих матриц. Ячейка матрицы имеет обозначение вида MX$name(a,b), где name – имя матрицы , a - СЧА, значение которого задает номер строки матрицы, b - СЧА, задающий номер столбца. Например, обозначение MX$ITOGI(1,2) соответствует ячейке в первой строке и втором столбце матрицы ITOGI.

Запись значений в ячейки матриц осуществляется с помощью блоков MSAVEVALUE. Поле A этого блока задает имя матрицы, поле В - номер строки, поле С - номер столбца, поле D - записываемое значение.

Например, при входе транзакта в блок

MSAVEVALUE ITOGI,2,4,V$ABC

в матрицу ITOGI коротких ячеек (в ячейку, расположенную на пересечении второй строки и четвертого столбца) записывается значение переменной V$ABC.

В поле A блока MSAVEVALUE после имени матрицы может быть приписан знак + или - . В этом случае значение операнда D добавляется или соответственно вы-читается в ячейке матрицы, аналогично тому, как это делается в блоке SAVEVALUE.


Начальные значения ячеек можно сделать отличными от нуля. Для этого применяется строка описания ячеек INITIAL. В поле A этой строки указывается СЧА, обозначающий ячейку или ячейку матрицы, в поле B – задаваемое начальное значение.

Например, строка

INITIAL X1,-10

установит в качестве начального значения ячейки номер 1 число –10, а с помощью строки

INITIAL MX$ITOGI(2,3),555

устанавливается начальное значение 555 в ячейку матрицы MX$ITOGI, расположенную во второй строке, третьем столбце.


Если общеалгоритмические средства языка GPSS предоставляют нам набор воз­можностей, которые в том или ином виде имеются в подавляющем большинстве язы­ков программирования, то объектно-ориентированные средства — это спе­цифическая часть языка GPSS, характерная лишь для него и его различных версий, как бы лицо этого языка.

Основой объектно-ориентированных средств является набор типовых моделей определенного класса реальных объектов, т.е. абстрактные объекты типа транзактов, устройств и т.д. В программах на языке GPSS можно обращаться с такими абстрактными объектами и операциями над ними так же, как в языках алгоритмических обращаемся с числовыми переменными и арифметическими операциями. В то же время абстрактные объекты языка GPSS, несомненно, соответствуют более "крупным" фрагментам реального мира, чем числовые переменные. Благодаря этому можно писать на GPSS компактные и легко обозримые модели сложных систем.

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

Модельное время представляется в памяти ЭВМ содержимым фиксированной ячейки С1. Численное значение времени С1 логически никак не связано с физическим временем, в котором работает применяемая ЭВМ.

В начальном состоянии модели время С1 - равно нулю. Симулятор анализирует модель и вычисляет, когда должно произойти первое событие, которое изменит состояние модели. После этого симулятор наращивает содержимое ячейки С1 - сразу до значения, соответствующего моменту наступления этого события, и имитирует событие путем соответствующего изменения состояния модели. Затем анализируется полученное новое состояние модели, вновь определяется, когда произойдет очередное событие, и время С1 устанавливается равным моменту его наступления. Эта процедура наращивания времени С1 по принципу "от события к событию" повторяется до тех пор, пока не будет достигнуто заданное конечное состояние модели.

Подобный принцип изменения модельного времени применяется почти во всех языках имитационного программирования дискретных систем. Модельное время измеряется в безразмерных единицах. Определение размерности единицы времени относится к вопросу интерпретации модели. В тексте модели размерность единицы времени нигде не указывается. Пользователь должен все интервалы времени в тексте модели задавать в одних и тех же единицах.

Кроме того, модельное время в GPSS всегда выражается целым числом единиц. Хотя известно, что в дискретных системах время не обязательно должно быть дискретным, в GPSS, тем не менее, введено дискретное время. Это сделано для того, чтобы результаты выполнения модели на ЭВМ не зависели от типа ЭВМ. Ведь в случае непрерывного времени его значения в ЭВМ неизбежно бы округлялись, а результат операции округления зависит от типа ЭВМ. В некоторых случаях это приводило бы к нарушениям последовательности событий в системе.

Так как время в модели может принимать только значения 0, 1, 2, ..., то любой интервал времени, меньший единичного, представляется нулем. Сле­до­ва­тель­но, если моделируемые события разделены менее чем единичным интервалом вре­мени, то в модели они наступят одновременно, как бы "слипнутся" во времени. От­сюда вытекает важный вывод, что единицу времени необходимо выбирать дос­та­точ­но мелкой, чтобы в модели не происходило «слипания» слиш­ком большого чис­ла событий.


Создание транзактов осуществляется блоком GENERATE (генерировать). Этот блок имеет 5 операндов, которые определяют моменты создания транзактов, количество транзактов и их приоритет.

Моменты модельного времени, в которые из блока GENERATE будут выходить транзакты, задаются операндами A,B и C.

Операнд A задает длительность интервалов времени между появлениями транзактов. Например, блок

GENERATE 100

будет генерировать транзакты через каждые 100 единиц модельного времени: первый транзакт выйдет в момент 100, второй – в момент 200, третий – в момент 300 и т.д. Число генерируемых транзактов будет неограниченным.

В поле B записывается модификатор. Если записанный в поле B СЧА является функцией FNj, то его называют «модификатор-функция», в противном случае – «модификатор-интервал». Модификатор используется для модификации дли­тель­ности интервалов времени, заданной полем А.

Рассмотрим вначале применение модификатора-интервала. Если он задан, то для каждого временного интервала поступления транзактов длительность опре­де­ля­ет­ся как значение случайной величины, равномерно распределенной от «А-В» до «А+В». Например, блок

GENERATE 10,5

будет генерировать транзакты через интервалы времени, длительность каждого из которых выбирается случайно в пределах от 5 до 15. Необходимо помнить, что время в GPSS всегда целое. Поэтому в пределах от 5 до 15 могут выбираться только целые значения времени. Каждое из этих 11-ти целых значений будет выбираться с одинаковой вероятностью. Таким образом, если в поле В задан модификатор-ин­тер­вал, то блок GENERATE генерирует случайный поток транзактов, в котором время между транзактами равномерно распределено в диапазоне «А±В» и имеет среднее значение «А».

Если же в поле В задан модификатор-функция, то для каждого временного интервала поступления транзактов длительность определяется как произведение «А*В».

Пусть, например, в модели имеются строки

DIS FUNCTION C1,D3
3000,3/5000,2/6000,1
GENERATE 10,FN$DIS

В этом случае блок GENERATE будет генерировать транзакты вначале через каждые 30 единиц времени, пока модельное время не достигнет 3000 единиц, затем - через каждые 20 единиц времени, пока время не достигнет 5000 единиц, а после этого - через каждые 10 единиц времени.

Если использовать блок

GENERATE 1000,FN$EXP,

где функция с меткой EXP описана ранее, то интервал времени между генерируемыми транзактами будет псевдослучайной величиной, распределенной экспоненциально и имеющей математическое ожидание 1000. Следовательно, данный блок GENERATE будет моделировать простейший (пуассоновский) поток транзактов.

В поле C записывается момент создания первого транзакта, в поле D - число генерируемых транзактов.

Ко всему сказанному об использовании полей A и В в блоке GENERATE необходимо добавить, что:

- операнды A - D могут быть не заданы; в этом случае принимаются их значения по умолчанию: A = 0, B = 0, C=1, D = Ґ.

- если при вычислении значения операнда C получен нуль, то симулятор игнорирует это значение и принимается C = 1;

- если операнд A не задан или равен нулю, то обязательно должен быть задан операнд D.

Приоритет создаваемых транзактов задается операндом Е. По умолчанию приоритет равен нулю.

Пример. Задания поступают в ЭВМ через каждые 5±5 мин.

Принимая минуту за единицу модельного времени, поступление заданий можно смоделировать блоком

GENERATE 5,5 ;ПОСТУПЛЕНИЕ ЗАДАНИЙ.

Однако при таком описании потока заданий возникает заметная численная ошибка дискретизации: Время между поступлениями реальных заданий распределено непрерывно в интервале от 0 до 10 мин, а модельное время между транзактами может принимать только значения 1,2,3,...,10. Для уменьшения роли такой численной ошибки можно в качестве единицы времени выбрать секунду. Тогда блок, моделирующий поступление заданий, примет вид:

GENERATE 300,300 ;ПОСТУПЛЕНИЕ ЗАДАНИЙ.

Пример. Задания поступают в ЭВМ через каждые 5 мин; первое задание поступает в 0 ч, последнее - в 6 ч. Принимая за единицу времени секунду, можно поступление заданий представить в модели следующим блоком:

GENERATE 3000,,0,73.

Уничтожение транзактов осуществляется блоком TERMINATE (уничтожить). Никаких других действий этот блок не выполняет, если единственный возможный операнд A в блоке не задан. Если же задан операнд А, то его значение вычитается из содержимого счетчика транзактов.

Начальное значение счетчика транзактов задается в команде START. Когда в результате входа очередного транзакта в блок TERMINATE значение счетчика становится нулевым или отрицательным, симулятор прекращает выполнение модели и передает управление программе вывода, которая распечатывает накопленные симулятором данные о модели.


Блок ADVANCE (задержать) предназначен для задержки транзактов на определенные интервалы модельного времени.

Обязательный операнд A задает время задержки транзакта в блоке ADVANCE. Необязательный операнд B является модификатором-функцией или модификатором-интервалом. Значение операнда B используется здесь для модификации значения операнда A так же, как в блоке GENERATE.

Любой транзакт входит в блок ADVANCE беспрепятственно. В нем транзакт задерживается на период модельного времени, величина которого определяется операндами A и В. После этого транзакт направляется из блокаADVANCE к следующему блоку.

В поле A задержка транзакта может быть задана нулевой. В этом случае транзакт будет задержан в блоке ADVANCE на нулевое время, т.е. момент выхода транзакта из блока будет равен моменту его входа в блок.

Например, в блоке

ADVANCE 0

транзакты не будут задерживаться.

Блок

ADVANCE 1000

будет задерживать транзакты ровно на 1000 ед. модельного времени.

В блоке

ADVANCE 1000,Р1

любой транзакт будет задерживаться на случайное время, выбранное из диапазона «1000 ± значение первого параметра транзакта».

Пусть функция FN$EXP описана в модели ранее. Тогда в блоке

ADVANCE 1000,FN$EXP

задержка транзакта представляет собой случайную величину, распределенную по экспоненциальному закону и имеющую среднее значение 1000 ед. времени.

Очевидно, суммарная задержка транзакта в двух блоках

ADVANCE 1000,FN$EXP
ADVANCE 1000,FN$EXP

есть сумма двух независимых экспоненциальных случайных величин (сл.в.), которые имеют математическое ожидание 1000 ед. времени. Отсюда следует, что эта суммарная задержка есть эрланговская случайная величина второго порядка, которая имеет математическое ожидание 2000 ед. времени.

Рассмотрим суммарную задержку транзактов в следующих 12-ти блоках:

ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100
ADVANCE 100,100.

Задержка в каждом из них имеет равномерное распределение вероятностей на интервале (0,200). Ее среднее значение составляет M = 100 ед. времени, дисперсия D=2002*(1/12). Поэтому сумма двенадцати таких задержек имеет среднее 12*M = 1200 и среднее квадратичное отклонение = 200. По центральной предельной теореме теории вероятностей заключаем, что закон распределения суммарной задержки приблизительно нормальный.

Заметим, что с помощью СЧА RNj такую задержку можно задать проще, если использовать арифметические переменные:

; ОПИСАНИЕ ПЕРЕМЕННЫХ:
D VARIABLE RN1+RN1+RN1+RN1
NORM VARIABLE (V$D+V$D+V$D)/5
; НОРМАЛЬНО РАСПРЕДЕЛЕННАЯ ЗАДЕРЖКА:
ADVANCE V$NORM.

Операции занятия и освобождения устройств выполняются в блоках SEIZE (занять) и RELEASE (освободить).

При вводе транзакта в блок SEIZE выполняется операция занятия устройства, номер или имя которого задается операндом A блока SEIZE. Номер устройства может быть задан в виде любого СЧА.

Занятие устройства транзактом выполняется следующим образом. Когда транзакт направляется из какого-нибудь блока в блок SEIZE, симулятор проверяет, свободно ли требуемое устройство. Если устройство не свободно, т.е. занято или захвачено, то транзакт не может войти в блок SEIZE. Он остается в предыдущем блоке до тех пор, пока устройство не освободится. Если же устройство свободно, то симулятор без задержки передвигает транзакт в блок SEIZE и транзакт занимает устройство. В этот же момент времени транзакт направляется к следующему за SEIZE блоку.

В последующем движении по модели транзакт может освободить занятое устройство. Освобождение устройства происходит в блоке RELEASE, в поле A которого указывается номер освобождаемого устройства.

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

Если несвободное устройство пытаются занять несколько транзактов с помощью одного или разных блоков SEIZE, то все они до момента освобождения устройства задерживаются в тех блоках, в которых находились в момент попытки перейти в блок (блоки) SEIZE. В момент освобождения устройства должен быть решен вопрос о том, какой из задержанных транзактов имеет право первым занять устройство. В GPSS этот вопрос решается следующим образом. Когда транзакты задерживаются на входе блока SEIZE, они регистрируются симулятором в списке. В этом списке транзакты упорядочиваются по приоритетам: любой транзакт с более высоким приоритетом находится впереди любого другого транзакта, имеющего более низкий приоритет. Если же приоритеты у каких-либо транзактов одинаковы, то такие транзакты упорядочиваются между собой по времени прихода: впереди оказывается транзакт, который раньше обратился к устройству. Такое упорядочение задерживаемых транзактов будем называть приоритетным. Приоритетное упорядочение является в GPSS основным способом упорядочения задерживаемых транзактов и применяется не только при обращениях к несвободному устройству, но и во многих других случаях. В момент освобождения устройства его занимает тот из задержанных транзактов, который находится в списке первым.

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

Пример. Пусть транзакты имеют одинаковые приоритеты и изображают кинозрителей, а устройство представляет кассира в кассе кинотеатра.

Каждый кинозритель приобретает у кассира билеты в течение 20 ± 5 с, в зависимости от числа билетов и необходимости получения сдачи. Кинозрители приходят через каждые 20 ± 10с, знакомятся в течение 15 ± 15с с обстановкой и занимают очередь. Общее число кинозрителей 200.

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

* МОДЕЛЬ РАБОТЫ КАССИРА
GENERATE 20,10,,200 ;ПРИХОД ЗРИТЕЛЕЙ
ADVANCE 15,15 ;ЗНАКОМСТВО С ОБСТАНОВКОЙ
SEIZE 1 ;ОБРАЩЕНИЕ К КАССИРУ
ADVANCE 20,5 ;ПОКУПКА БИЛЕТА
RELEASE 1 ;ОСВОБОЖДЕНИЕ КАССИРА
TERMINATE 1 ;УХОД ЗРИТЕЛЯ
START 200 ;СЧЕТЧИК=200.
Отчет об исследовании
START TIME END TIME BLOCKS FACILITIES STORAGES
0.000 4127.389 6 1 0
LABEL LOC BLOCK TYPE ENTRY COUNT CURRENT COUNT RETRY
1 GENERATE 200 0 0
2 ADVANCE 200 0 0
3 SEIZE 200 0 0
4 ADVANCE 200 0 0
5 RELEASE 200 0 0
6 TERMINATE 200 0 0
FACILITY ENTRIES UTIL. AVE. TIME AVAIL. OWNER PEND INTER RETRY DELAY
1 200 0.984 20.302 1 0 0 0 0 0

Рассмотрим логику выполнения этой модели. Первая строка модели является комментарием и симулятором не воспринимается. Блок GENERATE изображает приход зрителей: он генерирует транзакты через каждые 20 ± 10 единиц времени до тех пор, пока не будет выдано 200 транзактов. Каждый транзакт-зритель, поступивший из блока GENERATE, попадает в блок ADVANCE 15,15 и задерживается на время «ознакомления с обстановкой». Заметим, что, поскольку эта задержка случайная и может для разных транзактов отличаться на 30 единиц времени, то возможны случаи, когда позже попавшие в этот блок транзакты будут выходить из него раньше.

Если транзакт направляется из блока ADVANCE 15,15 в блок SEIZE 1, в то время как устройство 1 свободно, то он входит в этот блок, занимает устройство, переходит в блок ADVANCE 20,5 и задерживается в нем. Таким образом, в течение 20 ± 5 ед. модельного времени устройство 1 будет занято. Транзакты, пытающиеся в это время перейти из блока ADVANCE 15,15 в блок SEIZE, будут задержаны и упорядочены по приоритетам. Поскольку приоритеты у всех транзактов одинаковы и равны нулю (см. блок GENERATE), то транзакты будут упорядочены в порядке времени их обращения к устройству. Следовательно, задерживаемые транзакты будут в точности изображать живую очередь к кассиру.

Из блока ADVANCE 20,5 транзакт переходит в блок RELEASE 1 и освобождает устройство 1. В этот же момент времени транзакт переходит в блок TERMINATE и уничтожается. В результате из содержимого счетчика строки START вычитается 1. Моделирование будет продолжаться до тех пор, пока счетчик не станет равным нулю. В строке START задано начальное значение счетчика, которое равно 200. Следовательно, выполнение модели закончится в тот момент модельного времени, когда последний транзакт будет обслужен и освободит устройство. Строка START не только задает начальное значение счетчика. Ввод строки START является командой симулятору начать выполнение модели.


Операция захвата устройства выполняется транзактом с помощью блока PREEMPT (прервать). Номер захватываемого устройства задается в этом блоке в поле А. Если транзакт захватил устройство посредством блока PREEMPT, то освобождать его он должен в блоке RETURN (восстановить). Номер освобождаемого устройства задается в блоке RETURN в поле А.

Блок PREEMPT позволяет транзакту использовать устройство на более льготных условиях, чем блок SEIZE.

Рассмотрим наиболее простой режим работы блока PREEMPT. В этом режиме блок работает в случае, если задан только операнд А. Здесь возможны следующие три ситуации.

1) При входе транзакта в блок PREEMPT устройство свободно. В этом случае транзакт беспрепятственно входит в блок и захватывает устройство. Устройство из состояния "свободно" переходит в состояние "захвачено". Когда транзакт войдет в соответствующий блок RETURN, устройство из состояния "захвачено" вновь перейдет в состояние "свободно".

2) При переходе транзакта в блок PREEMPT устройство занято другим транзактом, прошедшим блок SEIZE. В этом случае транзакт беспрепятственно входит в блок PREEMPT, а устройство прерывает обслуживание занимающего его транзакта и переключается на обслуживание транзакта, вошедшего в блок PREEMPT. При этом из состояния "занято" устройство переходит в состояние "захвачено". Когда транзакт, захвативший устройство, войдет в блок RETURN, устройство освободится, возобновит прерванное обслуживание другого транзакта и перейдет в состояние "занято".

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

3) При входе транзакта в блок PREEMPT устройство захвачено другим транзактом, прошедшим блок PREEMPT. В этом случае транзакт задерживается в предыдущем блоке до момента освобождения устройства.

Все транзакты, задержанные при обращении к устройству, упорядочиваются по приоритету.

Более сложные режимы прерывания задаются с помощью большего числа операндов. Кроме операнда A в блоке PREEMPT могут быть заданы какие-либо из операндов B,C,D,E.

Операнд B записывается в виде обозначения PR, задающего приоритетный режим работы блока PREEMPT. В этом режиме транзакт захватывает устройство, если оно свободно или если оно обслуживает менее приоритетный транзакт. Прерывание обслуживания менее приоритетного транзакта происходит с его последующим дообслуживанием. Прерванные транзакты упорядочиваются по приоритету совместно с вновь приходящими транзактами, т.е. образуют с ними одну очередь к устройству. Вновь приходящий транзакт задерживается на входе блока PREEMPT только тогда, когда устройством обслуживается не менее приоритетный транзакт.

Для определения последующего движения прерванных транзактов блок PREEMPT предоставляет пользователю следующие возможности .

  1. В поле C может быть указано имя какого-либо блока, на который будет пере­дан прерванный транзакт. При этом прерванный транзакт продолжает претендовать на данное устройство.
  2. В поле D блока PREEMPT может быть задан номер параметра транзакта. Тог­да, если прерванный транзакт находится в блоке ADVANCE, то вычисляется ос­таток времени обслуживания (время дообслуживания), и полученное значение помещается в параметр, заданный в поле D. Прерванный транзакт при этом будет послан в блок, указанный в поле C. Прерванный транзакт продолжает претендовать на данное устройство.
  3. Если в поле E блока PREEMPT записано обозначение RE, то будут производиться те же операции, что и в случае 1), за исключением того, что прерванный транзакт больше не претендует на данное устройство.

Пример. Оперативная память однопроцессорной ЭВМ разбита на три раздела с номерами 0, 1, 2. В каждом разделе находится по одной программе. Приоритет программы тем выше, чем меньше номер ее раздела. Программы вызываются на выполнение по требованиям пользователей, поступающим в случайные моменты времени.

Программа нулевого раздела вызывается с интервалами длительностью 10 8 с. Время ее выполнения процессором в зависимости от обрабатываемых данных колеблется в пределах 3 ± 2с.

Программа первого раздела вызывается через каждые 2 мин. и выполняется процессором в течение 30 ± 15с.

Через полчаса после начала поступления требований в нулевой и в первый разделы начинают поступать требования во второй раздел с интервалами по 5±4 мин. Такие требования обрабатываются 1 мин.

В случае конфликтных ситуаций, когда при поступлении какого-либо тре­бо­ва­ния процессор выполняет другое требование, используется дисциплина аб­со­лют­ных приоритетов.

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

Будем представлять требования на выполнение программ транзактами.

Присвоим требованиям приоритеты 0, 1, 2. Согласно условию задачи нуле­вой — наименьший — приоритет должны иметь требования к третьему разделу, а приоритет 2 — требования к нулевому разделу. Процессор представим в модели устройством с номером 1. За единицу времени примем 1 с. Для подсчета требований воспользуемся ячейками SAVEVALUE. Тогда модель может быть написана в следующем виде.

* МОДЕЛЬ НУЛЕВОГО РАЗДЕЛА:
GENERATE 10,8,,,2 ;ПЕРВЫЙ ПОТОК ТРЕБОВАНИЙ
SAVEVALUE 1+,1 ;ПОДСЧЕТ ИХ ЧИСЛА
PREEMPT 1,PR ;ЗАХВАТ ПРОЦЕССОРА
ADVANCE 3,2 ;ВЫПОЛНЕНИЕ ТРЕБОВАНИЯ
RETURN 1 ;ОСВОБОЖДЕНИЕ ПРОЦЕССОРА
SAVEVALUE 2+,1 ;ПОДСЧЕТ ОБСЛУЖЕННЫХ ТРЕБ.
TERMINATE
* МОДЕЛЬ ПЕРВОГО РАЗДЕЛА:
GENERATE 120,,,,1 ;ВТОРОЙ ПОТОК ТРЕБОВАНИЙ
SAVEVALUE 3+,1 ;ПОДСЧЕТ ИХ ЧИСЛА
PREEMPT 1,PR ;ЗАХВАТ ПРОЦЕССОРА
ADVANCE 30,15 ;ВЫПОЛНЕНИЕ ТРЕБОВАНИЯ
RETURN 1 ;ОСВОБОЖДЕНИЕ ПРОЦЕССОРА
SAVEVALUE 4+,1 ;ПОДСЧЕТ ОБСЛУЖ-Х ТРЕБ-Й
TERMINATE
* МОДЕЛЬ ВТОРОГО РАЗДЕЛА:
GENERATE 300,240,1800;ТРЕТИЙ ПОТОК ТРЕБОВАНИЙ
SAVEVALUE 5+,1 ;ПОДСЧЕТ ИХ ЧИСЛА
PREEMPT 1,PR ;ЗАХВАТ ПРОЦЕССОРА
ADVANCE 60 ;ВЫПОЛНЕНИЕ ТРЕБОВАНИЯ
RETURN 1 ;ОСВОБОЖДЕНИЕ ПРОЦЕССОРА
SAVEVALUE 6+,1 ;ПОДСЧЕТ ОБСЛУЖ-Х ТРЕБ-Й
TERMINATE
* ОСТАНОВ. МОДЕЛИ ПРИ T=1 ЧАСУ = 3600 СЕКУНДАМ:
GENERATE 3600
TERMINATE 1
START 1

В результате моделирования наряду с информацией об устройстве 1 автоматически будет выведено значение ячеек X1-X6 в виде таблицы, содержащей номера этих ячеек и их содержимое.

Значение ячейки X1 будет равно числу требований, поступивших в нулевой раздел оперативной памяти, а ячейки X2 - числу обслуженных таких требований. Аналогично интерпретируются значения ячеек X3, X4 для требований первого раздела и ячеек X5, X6 - для второго.

Отчет об исследовании.

START TIME END TIME BLOCKS FACILITIES STORAGES
0.000 3600.000 23 1 0
LABEL LOC BLOCK TYPE ENTRY COUNT CURRENT COUNT RETRY
1 GENERATE 363 0 0
2 SAVEVALUE 363 0 0
3 PREEMPT 363 0 0
4 ADVANCE 363 1 0
5 RETURN 362 0 0
6 SAVEVALUE 362 0 0
7 TERMINATE 362 0 0
8 GENERATE 30 0 0
9 SAVEVALUE 30 1 0
10 PREEMPT 29 0 0
11 ADVANCE 29 0 0
12 RETURN 29 0 0
13 SAVEVALUE 29 0 0
14 TERMINATE 29 0 0
15 GENERATE 7 0 0
16 SAVEVALUE 7 0 0
17 PREEMPT 7 0 0
18 ADVANCE 7 0 0
19 RETURN 7 0 0
20 SAVEVALUE 7 0 0
21 TERMINATE 7 0 0
22 GENERATE 1 0 0
23 TERMINATE 1 0 0
FACILITY ENTRIES UTIL. AVE. TIME AVAIL. OWNER PEND INTER RETRY DELAY
1 399 0.653 5.893 1 402 0 0 0 1
SAVEVALUE RETRY VALUE
1 0 363.000
2 0 362.000
3 0 30.000
4 0 29.000
5 0 7.000
6 0 7.000

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

Блокирование устройств выполняется с помощью блока FUNAVAIL (устройство недоступно):

FUNAVAIL A [ , B, C, D, E, F, G, H ]

у которого поле A обязательно, а поля B – H могут отсутствовать.

В полях задаются:

A - устройство или диапазон устройств;

B – это обозначение RE или CO. Если задано RE, то транзакт, который в момент блокирования занимает (возможно) устройство, с обслуживания снимается и в дальнейшем не претендует на его занятие. В этом случае в поле C задается метка, на которую пересылается снятый с обслуживания транзакт. Если в поле B записано CO, то обслуживаемый транзакт продолжает обслуживаться до конца;

C – метка или номер блока;

D – номер параметра управляющего транзакта,

E – определяет поведение ранее прерванных транзактов на период недоступного состояния устройства. Здесь может быть записано RE или CO: при RE они исключаются из борьбы за устройство и передаются по метке поля F, а при CO продолжают претендовать на дообслуживание после восстановления доступности устройства и его освобождении от более приоритетных транзактов;

F – номер или метка блока;

G – определяет поведение транзактов, которые будут обращаться к устройству в период его недоступности. Запись CO означает, что они будут ожидать устройство в обычном порядке, запись RE – что они исключаются из борьбы и передаются по метке поля H;

H – метка или номер блока.

Разблокирование устройств выполняется блоком FAVAIL (устройство доступно):

FAVAIL A,

где A – номер или диапазон номеров устройств (например, FUNAVAIL 4-8 ).


В отличие от устройства память в GPSS имеет параметр, от которого зависят результаты операций с нею. Этот параметр - емкость памяти - должен быть известен симулятору. Поэтому для каждой применяемой памяти пользователь должен указать ее емкость.

Для указания емкостей памятей применяется строка STORAGE . Эта строка является строкой описания объекта, а не блоком , поэтому транзакты в нее не входят.

Поле метки строки STORAGE содержит номер или метку памяти, поле операции - слово STORAGE, а поле A указывает емкость памяти. Емкость памяти должна выражаться целым числом. Например, строка описания памяти MEM емкостью 40 единиц может быть записана (с комментариями) следующим образом:

MEM STORAGE 40 ;ПАМЯТЬ MEM ИМЕЕТ ЕМКОСТЬ 40 ЕД.

В начальный момент времени все памяти пустые. Если в ходе моделирования транзакт обращается к неописанной памяти, ее объем принимается равным 231 - 1 единиц.

Транзакты обращаются к памяти посредством блоков ENTER (войти) и LEAVE (выйти).

Блок ENTER применяется для занятия памяти. В поле A указывается номер памяти, в поле B - число занимаемых единиц. Когда транзакт входит в блок ENTER, определяется число свободных единиц памяти, равное емкости памяти минус число занятых единиц. Если значение операнда B не превышает числа свободных единиц памяти, то число занятых единиц увеличивается на значение операнда B. В этом случае транзакт входит в блок ENTER без задержки. Если же значение операнда B превышает число свободных единиц памяти, то транзакт задерживается перед входом в блок ENTER. Задержанные при обращении к памяти, транзакты упорядочиваются по приоритету.

Число занимаемых единиц памяти должно быть целым .

Если поле B в блоке ENTER пустое, то число занимаемых единиц памяти принимается равным 1.

Пусть транзакт «x» задержан перед входом в блок ENTER. Из описания блока ENTER видно, что если для транзакта «y», приходящего после «x», свободной емкости памяти достаточно, то «y» войдет в блок ENTER без задержки.

Блок LEAVE служит для освобождения памяти. В поле A указывается номер памяти, в поле B - число освобождаемых единиц. В случае пустого поля B число освобож-даемых единиц памяти принимается равным единице .

При входе транзакта в блок LEAVE количество занятых единиц памяти, указанной в поле A, уменьшается на значение операнда B. Перед входом в блок LEAVE транзакты не задерживаются. Транзакт не должен освобождать большее число единиц памяти, чем их всего занято. Если же транзакт пытается это сделать, то симулятор выдает на печать сообщение об ошибке и прекращает выполнение модели .

В тот момент модельного времени, когда транзакт освобождает память, симулятор просматривает от начала до конца список задержанных у памяти транзактов, если они есть. Для каждого очередного транзакта проверяется, может ли он теперь быть обслужен памятью. Если такая возможность есть, то симулятор перемещает этот транзакт в блок ENTER, и в результате число занятых единиц памяти соответствующим образом увеличивается.

Транзакт не обязан освобождать такое же число единиц памяти, какое занимал. Он может также освобождать память, которую не занимал. Транзакт имеет право занимать и освобождать любое количество памятей и операции занятия и освобождения могут при этом чередоваться в произвольном порядке.

Число освобождаемых единиц памяти должно быть целым.

Пример. Оперативная память (ОП) однопроцессорной ЭВМ имеет емкость 16 Мбайт. Из них 3 Мбайт постоянно занимают управляющие программы операционной системы (ОС). Остальной объем ОП используется для выполнения заданий абонентов ЭВМ.

В каждом задании абонентом записан приоритет задания и требуемый для его выполнения объем ОП. При поступлении задания управляющие программы ОС проверяют, достаточен ли свободный объем ОП для загрузки. Если свободного места в ОП достаточно, то задание загружается и занимает часть памяти требуемого объема. В противном случае задание записывается на НМД в очередь, упорядоченную по приоритетам.

При завершении задания занимаемая им часть памяти освобождается. Управляющие программы ОС обеспечивают непрерывность всего свободного объема ОП за счет возможности сдвига адресов загрузки у выполняемых заданий. После освобождения части ОП завершенным заданием и обеспечения непрерывности свободной памяти управляющие программы просматривают по порядку все задания в очереди на НМД и загружают из них те, для которых в ОП находится достаточное место. Время выполнения управляющих программ по сравнению со временем выполнения заданий можно считать равным нулю.

ОП, используемая заданиями, имеет объем 16 - 3 = 13 Мбайт. При моделировании ЭВМ эта ОП может быть описана с помощью строки name STORAGE 13. Если заданиям поставить в соответствие транзакты, то вход заданий в ОП можно моделировать с помощью блока ENTER, а выход из ОП - с помощью блока LEAVE .

Памяти могут также блокироваться и разблокироваться, как и устройства.

Блокирование памятей выполняется с помощью блока

SUNAVAIL A,

где A – номер (имя) или диапазон номеров памятей. Во время недоступности памяти блок ENTER задерживает транзакты, а блок LEAVE – нет.

Доступность памятей восстанавливается посредством блока

SAVAIL A,

В котором в поле A задается номер (имя) памяти или диапазон номеров памятей.


Для управления состоянием логических ключей применяется блок LOGIC.

Все ключи в модели в нулевой момент времени выключены, т.е. находятся в состоянии R. При входе транзакта в блок LOGIC состояние логического ключа, указанного в поле A, изменяется одним из трех способов. Способ изменения определяется символом, записанным в позиции 14 поля операции. Символ R означает, что ключ требуется установить в состояние R (выключить), символ S - установить в состояние S (включить), а символ I - инвертировать состояние ключа, т.е. включить его, если он выключен и выключить, если он включен.

Ниже приведены примеры записи блока LOGIC с комментариями.

МЕТКА

 

ОПЕРАЦИЯ

А,В,...

LOGIC S

41 Включить ключ 41

LOGIC R

155 Выключить ключ 155

LOGIC I

4 Инвертировать ключ 4

Начальное состояние логических ключей можно задавать с помощью строки INITIAL.


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

В поле операции блока GATE записывается слово GATE и через пробел - символ проверяемого условия.

Существует десять условий, которые проверяются в блоке GATE для оборудования:

NU - устройство свободно (т.е. не используется),

U - устройство не свободно (т.е. используется),

NI - устройство не захвачено,

I - устройство захвачено,

SE - память пуста (все единицы памяти свободны),

SNE - память не пуста,

SF - память заполнена (все единицы заняты),

SNF - память не заполнена,

LR - ключ выключен,

LS - ключ включен.

В поле A блока GATE записывается номер или имя проверяемого объекта.

Поле B определяет режим работы блока GATE. Блок GATE может работать в режиме отказа или в режиме условного перехода.

1) Если поле B пустое, блок работает в режиме отказа. В этом случае направляемый в блок GATE транзакт при невыполнении условия задерживается перед входом в блок до момента, когда условие будет выполнено. Когда условие выполнится, транзакт войдет в блок GATE и перейдет к следующему в тексте модели блоку.

2) Если поле B не пустое, то в нем должна быть записана метка какого-нибудь блока. В этом случае блок GATE работает в режиме условного перехода. Транзакт входит в такой блок беспрепятственно. При выполнении требуемого условия транзакт тут же переходит к следующему за GATE блоку, а при невыполнении - к блоку, метка которого указана в поле B.


Любые элементы в системах прямо или опосредованно связаны, взаимодействуют. Зависимость между процессами, протекающими в разных частях системы, нередко выражается в форме синхронизации, т.е. в форме взаимного согласования этих процессов по времени. Для моделирования различных видов синхронизации в GPSS применяются блоки SPLIT, ASSEMBLE, GATHER, MATCH, GATE .

Блок SPLIT предназначен для моделирования одновременного начала нескольких процессов. В момент входа транзакта в блок SPLIT создается несколько копий этого транзакта. Число копий задается в поле A. Исходный (порождающий) транзакт переходит в блок, определенный в поле B. Все копии переходят к блоку, следующему за SPLIT. Если поле C блока SPLIT пустое, то все копии идентичны породившему их транзакту. Например, при входе транзакта в блок

SPLIT 4,NEXT

порождаются четыре транзакта, идентичные вошедшему, и передаются в следующий по тексту блок. Исходный транзакт переходит в блок, в поле метки которого записано NEXT. Всего из этого блока SPLIT выходит пять транзактов.

Если поле C не пустое, то его значение интерпретируется как номер параметра транзакта. Пусть N - значение этого параметра в момент входа транзакта в блок SPLIT. Тогда в момент выхода из SPLIT данный параметр у исходного транзакта будет иметь значение N+1 , а у копий соответственно N+2, N+3, ... , N+K , где K - общее число вышедших из блока SPLIT транзактов. Например, если транзакт, имеющий нуль в десятом параметре, войдет в блок

SPLIT 2,ABCDE,10,

то параметр P10 у этого транзакта приобретет значение 1, а у копий соответственно 2 и 3 .

Транзакты - копии могут двигаться в модели независимо друг от друга. Копии могут проходить блоки SPLIT и порождать новые копии .

Множество, состоящее из исходного транзакта и всех его копий, называется семейством транзактов. Копия члена семейства является членом того же семейства. Любой транзакт - член одного и только одного семейства .

Блок ASSEMBLE используется для моделирования одновременного завершения нескольких процессов. Он собирает заданное в поле A число транзактов одного семейства и превращает их в один транзакт. Первый из транзактов какого-либо семейства, вошедший в блок, задерживается до тех пор, пока в этом блоке не накопится заданное число транзактов того же семейства. После этого первый транзакт выходит из блока ASSEMBLE, а остальные транзакты этого семейства уничтожаются.

В одном блоке ASSEMBLE могут одновременно проходить сборку транзакты, принадлежащие к разным семействам. Например, если в блок

ASSEMBLE 4

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

Аналогично применяется и блок GATHER. Отличие состоит лишь в том, что транзакты в этом блоке не уничтожаются. Когда в нем накапливается заданное в поле A число транзактов одного семейства, все они переходят к следующему блоку.

Блок MATCH синхронизирует продвижение двух транзактов, принадлежащих к одному семейству и двигающихся в модели по различным путям. В поле A блока MATCH задается имя другого блока, который называется сопряженным блоком MATCH. Два транзакта, принадлежащие к одному семейству и поступающие в пустые сопряженные блоки MATCH в моменты времени T1 и T2 і T1, выходят из этих блоков одновременно в момент T2.

Пример. Необходимо промоделировать сборку изделий рабочими A,B и C. Изделия в разобранном виде поступают каждые 300 ± 100 мин. Каждое из них разделяется между рабочими A и B, которые параллельно готовят свою часть изделия к сборке. Подготовка изделия состоит из двух фаз, причем после окончания первой фазы производится сверка с одновременным участием обоих рабочих A и B. После сверки рабочие независимо друг от друга выполняют вторую фазу. На выполнение первой фазы рабочий A тратит 100 ± 20 мин, а рабочий B 80 ± 20 мин.

Вторую фазу рабочий A выполняет 50 ± 5 мин, а рабочий B 70 ± 10 мин.

После окончания работы рабочими A и B рабочий C выполняет сборку изделия. Сборка занимает 50 ± 5 мин. и не может быть начата до тех пор, пока рабочие A и B не закончили выполнение своих операций .

Модель описанного процесса может быть написана с применением блоков синхронизации транзактов:

*

* МОДЕЛЬ СБОРКИ ИЗДЕЛИЙ
GENERATE 300,100 ;ПОСТУПЛЕНИЕ ИЗДЕЛИЙ
SPLIT 1,MANB ;РАЗДЕЛЕНИЕ ИЗДЕЛИЙ
SEIZE 1 ;ЗАНЯТЬ РАБОЧЕГО А
ADVANCE 100,20 ;ПЕРВАЯ ФАЗА
ARB1 MATCH ARB2 ;ЖДАТЬ РАБОЧЕГО В
ADVANCE 50,5 ;ВТОРАЯ ФАЗА
RELEASE 1 ;ОСВОБОДИТЬ РАБОЧЕГО А
TRANSFER ,MANC ;ПЕРЕДАЧА ИЗДЕЛИЯ В СБОРКУ
MANB SEIZE 2 ;ЗАНЯТЬ РАБОЧЕГО В
ADVANCE 90,20 ;ВРЕМЯ ПЕРВОЙ ФАЗЫ
ARB2 MATCH ARB1 ;ЖДАТЬ РАБОЧЕГО А
ADVANCE 70,10 ;ВТОРАЯ ФАЗА
RELEASE 2 ;ОСВОБОДИТЬ РАБОЧЕГО В
MANC ASSEMBLE 2 ;ЖДАТЬ ОБЕ ЧАСТИ ИЗДЕЛИЯ
SEIZE 3 ;ЗАНЯТЬ РАБОЧЕГО С
ADVANCE 50,5 ;СБОРКА ИЗДЕЛИЯ
RELEASE 3 ;ОСВОБОДИТЬ РАБОЧЕГО С
TERMINATE 1 ;СБОРКА ЗАВЕРШЕНА
START 1000 ;МОДЕЛИРОВАТЬ 1000 СБОРОК
Отчет об исследовании.
START TIME END TIME BLOCKS FACILITIES STORAGES
0.000 300781.128 18 3 0
NAME VALUE
ARB1 5.000
ARB2 11.000
MANB 9.000
MANC 14.000
LABEL LOC BLOCK TYPE ENTRY COUNT CURRENT COUNT RETRY
1 GENERATE 1000 0 0
2 SPLIT 1000 0 0
3 SEIZE 1000 0 0
4 ADVANCE 1000 0 0
ARB1 5 MATCH 1000 0 0
6 ADVANCE 1000 0 0
7 RELEASE 1000 0 0
8 TRANSFER 1000 0 0
MANB 9 SEIZE 1000 0 0
10 ADVANCE 1000 0 0
ARB2 11 MATCH 1000 0 0
12 ADVANCE 1000 0 0
13 RELEASE 1000 0 0
MANC 14 ASSEMBLE 2000 0 0
15 SEIZE 1000 0 0
16 ADVANCE 1000 0 0
17 RELEASE 1000 0 0
18 TERMINATE 1000 0 0
FACILITY ENTRIES UTIL. AVE. TIME AVAIL. OWNER PEND INTER RETRY DELAY
1 1000 0.509 153.112 1 0 0 0 0 0
2 1000 0.576 173.246 1 0 0 0 0 0
3 1000 0.166 49.908 1 0 0 0 0 0

Синхронизация транзактов может производиться и с помощью уже известного нам блока GATE, если в нем указано условие синхронизации М или NM, а в поле A - имя блока ASSEMBLE, GATHER или MATCH. Условие М означает «в указанном блоке находится транзакт одного семейства с тем, который обращается к блоку GATE». Условие NM противоположно условию М. Например, если в модели имеются строки:

CPU GATE M PROG1
.
.
PROG1 MATCH PROG2
.
.
DISK GATE NM PROG2
.
.
PROG2 MATCH PROG1,

то в блок CPU транзакт сможет войти лишь при условии, что в блоке PROG1 в состоянии синхронизации находится другой транзакт из этого же семейства. В блок DISK транзакт какого - либо семейства сможет войти при условии, что в блоке PROG2 нет транзакта этого семейства .


Основным средством задания параметров транзактов является блок ASSIGN (назначить). В поле A этого блока указывается номер параметра, в поле В определяется записываемое в параметр значение.

Приписывая к номеру параметра в поле A символ + или -, можно обеспечить не запись значения поля В в параметр, а добавление или вычитание этого значения из значения параметра.

Если в поле C указано какое-либо имя, оно интерпретируется как имя функции. В этом случае вычисляется указанная функция и значение поля В модифицируется путем умножения на значение функции. Примеры:

ASSIGN 1,475 ;ЗАНЕСТИ 475 В Р1
ASSIGN 12+,45 ;ДОБАВИТЬ 45 В Р1
ASSIGN 11,С1 ;ЗАПИСАТЬ ВРЕМЯ В Р11
ASSIGN 8,42,FFF ;ЗАПИСАТЬ 42*FN$FFF В Р8.

В блоке ASSIGN P1,P2 содержимое второго параметра будет записано в па­раметр, номер которого нужно прочесть в первом параметре. В блоке ASSIGN P*1,P2 содержимое второго параметра будет записано в параметр, номер ко­торого записан в другом параметре, номер которого нужно прочесть в параметре Р1.

При моделировании на GPSS часто возникают случаи, когда нужно менять стандартные числовые атрибуты транзактов. К атрибутам транзактов относятся приоритет и отметка времени.

Для задания приоритетов транзактов кроме блока GENERATE можно использовать блок PRIORITY. Поле A этого блока определяет значение присваиваемого приоритета. Например, при прохождении через блок

PRIORITY 3

транзакту будет присвоен приоритет 3.

Отметка времени — это запись в транзакте текущего момента времени, которая автоматически производится в момент порождения транзакта блоком GENERATE и может меняться только в блоке MARK. Если транзакт не проходил блока MARK, то время существования транзакта в модели может быть определено как разность между текущим значением модельного времени и отметкой времени транзакта. При прохождении блока MARK с пустым полем A отметка времени транзакта заменяется на новую, равную моменту прохождения этого блока.

Если в поле A указано некоторое значение, то оно рассматривается как номер параметра транзакта и текущее время записывается в этот параметр. Отметка времени транзакта при этом не меняется, т.е. сохраняет свое старое значение.

Например, блок

MARK

записывает текущее время в отметку времени проходящего через него транзакта, а блок

MARK 1

записывает текущее время только в Р1.

Блок MARK можно применять для измерения времени прохождения транзактом определенного участка модели. В начале этого участка блоком MARK делается отметка времени в транзакте, а в конце участка определяется разность между текущим модельным временем и отметкой времени, сделанной в транзакте.


В тех случаях, когда естественный порядок движения транзактов сверху вниз по блокам модели необходимо определенным образом нарушить, можно воспользоваться блоками TRANSFER (переслать), LOOP (повторить) или TEST (проверить). В некоторых частных случаях для этого могут подойти, конечно, и ранее изученные блоки SPLIT и GATE.

Блок TRANSFER имеет в общем случае четыре операнда. Операнд A задает режим выполнения блока, операнды В и С являются метками блоков.

Наиболее простым является режим безусловного перехода блока TRANSFER. В этом режиме поле A в блоке пустое. Все транзакты переходят к блоку, указанному в поле B. Пример:

TRANSFER ,NEXT.

Если в поле A записана десятичная дробь, начинающаяся точкой, то производится случайный выбор между блоками, определенными в полях B и C. Десятичная дробь в поле A задает вероятность перехода к блоку поля С. Например, блоком

TRANSFER .370,CCC,BBB

37% всех транзактов будет передано в блок с меткой ВВВ, остальные 63% - в блок ССС. Описанный режим называется статистическим.

Если в поле A блока TRANSFER записано мнемоническое обозначение BOTH, то для каждого транзакта, поступающего в этот блок, проверяются два пути. Сначала проверяется возможность перехода к блоку поля В, и, если транзакт не может войти в этот блок, он пытается перейти к блоку поля С. Если транзакт не может войти и в этот блок, он задерживается в блоке TRANSFER и опрос блоков, заданных в полях В и С, повторяется при каждом изменении модельного времени, пока не появляется возможность выхода.

Примечание 1. Этот режим выбора может существенно увеличить время обработки модели, т.к., если оба выхода заблокированы, то проверка их состояния производится симулятором очень часто.

Примечание 2. Если в блоке TRANSFER поле В, интерпретируемое как адрес блока, пустое, то считается, что оно указывает на блок, следующий за данным блоком TRANSFER.

С помощью режима BOTH блока TRANSFER можно промоделировать, например, выбор заявками одного из двух каналов в двухканальной СМО:

TRANSFER BOTH,,SAM ;ВЫБОР СВОБ-ГО КАНАЛА
SEIZE 1 ;ЗАНЯТИЕ 1-ГО КАНАЛА
.
.
.
SAM SEIZE 2 ;ЗАНЯТИЕ 2-ГО КАНАЛА.

Обобщением режима ВОТН является режим ALL, задаваемый мнемоническим обозначением ALL в поле A блока TRANSFER. Первый из блоков, возможность перехода к которым проверяется, определяется полем В, последний - полем С. В поле D задается индексная константа N. Транзакт проверяет по порядку возможность входа в блоки с номерами В, В+N, В+2N,..., B+MN=C и входит в первый из них, который это разрешает. Если же такой возможности не представляется, проверка повторяется при каждом изменении модельного времени.

С помощью режима ALL можно промоделировать, например, выбор заявками одного из трех каналов в трехканальной СМО.

Кроме описанных - безусловного, статистического режима, а также режимов ВОТН и ALL возможны еще пять режимов выполнения блока TRANSFER: SIM, PICK, SBR, FN и P. Эти режимы более специальные и могут быть изучены при необходимости с помощью документации и «помощи», имеющихся в составе пакета программ GPSS.

Для организации циклического прохождения транзактов по определенному сегменту модели служит блок LOOP. В поле A указывается номер параметра транзакта, а в поле B задается метка какого-нибудь блока. Каждый раз, когда транзакт входит в блок LOOP, значение указанного параметра транзакта уменьшается на 1. Если после этого параметр не равен нулю, транзакт пересылается по заданной метке, в противном случае - к блоку, записанному под данным блоком LOOP.

В следующем примере транзакты проходят через блок ADVANCE по 4 раза.

ASSIGN 1,4 ;ЗАНЕСТИ 4 в Р1
WAIT ADVANCE 15,FN$EXP ;ЖДАТЬ
LOOP 1,WAIT ;ИДТИ К WAIT при Р1 >< 0.

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

Необходимо также учитывать, что в случае, когда в LOOP входит транзакт с нулевым или отрицательным значением параметра, указанного в поле A, симулятор выдает сообщение об ошибке и прекращает выполнение модели.

Наиболее универсальными возможностями для управления маршрутами сообщений располагает блок TEST. В поле операции этого блока через пробел после слова TEST записывается мнемоническое обозначение одного из шести отношений: L, LE, E, NE, G или GE. В полях A и В записываются обозначения сравниваемых СЧА. Движение транзакта зависит от того, задана ли метка какого-нибудь блока в поле С.

Если поле C пустое, то блок TEST выполняется в режиме отказа. В этом случае транзакт будет задерживаться на входе блока TEST при невыполнении указанного отношения между СЧА в полях A и В, или передаваться к следующему после TEST блоку - при выполнении отношения. Например, в следующих блоках транзакт будет задерживаться при невыполнении условий, расшифрованных в комментариях:

TEST E V1,X342 ;ЗНАЧЕНИЯ V1 И Х342 РАВНЫ
TEST L S$DD,10 ;СОДЕРЖИМОЕ ПАМЯТИ DD<10
TEST LE Q6,17 ;В 6-й ОЧЕРЕДИ 17 ТРАНЗ-В
TEST NE X903,X104 ;Х903№Х104

Если поле C содержит метку блока, то транзакт при невыполнении отношения между операндами A и B будет передан к указанному блоку. При выполнении отношения транзакт перейдет к следующему после TEST блоку. Режим выполнения блока TEST с меткой в поле C называется режимом условного перехода.

Например, в следующих блоках транзакты будут передаваться по метке, записанной в поле C, если не выполняются условия, расшифрованные в комментариях:

TEST GE V$A,V$D,OTHER ;V$A V$D
TEST L RN1,600,ALTRN ;RN1<600.

В блоке TEST можно в качестве СЧА использовать и булевские переменные, например:

TEST E BV$PROV,1 ПРОПУСТИТЬ,ЕСЛИ BV$PROV=1
TEST E BV7,0,ABC ЕСЛИ BV7=1, ИДТИ К АВС.

Применение булевских переменных позволяет проверять в блоке TEST условия произвольной сложности.


Некоторые виды статистических данных накапливаются симулятором автоматически. Другие виды данных могут быть получены при помощи блоков для сбора статистики . Эти блоки связаны с объектами типа очередь и таблица .

Очередь - это множество, в которое транзакты включаются в момент прохождения ими блока QUEUE (войти в очередь) и из которого они исключаются в момент прохождения блока DEPART (выйти из очереди). В поле A этих блоков задается номер очереди.

Очередь характеризуется стандартным числовым атрибутом, называемым длиной очереди. В начальный момент времени, когда очередь пуста, ее длина равна нулю. Длина очереди меняется в моменты входа транзактов в блоки QUEUE и DEPART. Если поле В пустое, то при входе транзакта в блок QUEUE длина соответствующей очереди увеличивается на единицу, а при входе в блок QUEUE - на единицу уменьшается. Следовательно, при использовании пустого поля В длина очереди равна текущему числу транзактов в этой очереди. В поле В блоков QUEUE и DEPART можно задавать произвольное число единиц, на которое должна увеличиваться или уменьшаться длина очереди. Транзакты могут проходить любое число блоков QUEUE и DEPART с произвольными значениями полей A и В, чередующихся в любом порядке, лишь бы это не приводило к отрицательным длинам образуемых очередей.

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

Пример. Модель, построенную в условиях примера о работе кассира, изменим путем добавления блока QUEUE 1 перед блоком SEIZE 1 и блока DEPART 1 после блока SEIZE 1. В результате эта модель примет вид:

* МОДЕЛЬ РАБОТЫ КАССИРА
SIMULATE
GENERATE 20,10,0,200 ;ПРИХОД ЗРИТЕЛЕЙ
ADVANCE 15,15 ;ЗНАКОМСТВО С ОБСТ-КОЙ
QUEUE 1 ;ВКЛЮЧЕНИЕ В ОЧЕРЕДЬ
SEIZE 1 ;ОБРАЩЕНИЕ К КАССИРУ
DEPART 1 ;ВЫХОД ИЗ ОЧЕРЕДИ
ADVANCE 20,5 ;ПОКУПКА БИЛЕТА
RELEASE 1 ;ОСВОБОЖДЕНИЕ КАССИРА
TERMINATE 1 ;УХОД ЗРИТЕЛЯ
START 200 ;СЧЕТЧИК=200

Отчет об исследовании.

START TIME END TIME BLOCKS FACILITIES STORAGES
0.000 4127.389 8 1 0
LABEL LOC BLOCK TYPE ENTRY COUNT CURRENT COUNT RETRY
1 GENERATE 200 0 0
2 ADVANCE 200 0 0
3 QUEUE 200 0 0
4 SEIZE 200 0 0
5 DEPART 200 0 0
6 ADVANCE 200 0 0
7 RELEASE 200 0 0
8 TERMINATE 200 0 0
FACILITY ENTRIES UTIL. AVE. TIME AVAIL. OWNER PEND INTER RETRY DELAY
1 200 0.984 20.302 1 0 0 0 0 0
QUEUE MAX CONT. ENTRY ENTRY(0) AVE.CONT. AVE.TIME AVE.(-0) RETRY
1 9 0 200 4 2.574 53.113 54.197 0

В этой модели момент включения каждого транзакта в очередь 1 совпадает с моментом обращения его к блоку SEIZE, т.к. блок QUEUE выполняется в модельном времени мгновенно. В очереди каждый транзакт находится до тех пор, пока не займет устройство 1. Момент занятия устройства совпадает с моментом выхода транзакта из очереди. Таким образом, очередь 1 состоит из транзактов, задержанных при обращении к блоку SEIZE из-за занятости устройства 1. Следовательно, в данной модели очередь 1 имеет естественную интерпретацию как очередь зрителей к кассиру, а длина очереди 1 интерпретируется как число зрителей в очереди .

При наличии в модели очередей симулятор выдает статистику по очередям в виде таблицы.

Применение блоков QUEUE и DEPART в рассмотренном примере является типичным. Другой типичный способ применения этих блоков состоит в обхватывании ими произвольного сегмента модели, по пребыванию транзактов в котором нужна статистика. Так, рассмотренную в примере модель можно расширить еще одной парой блоков QUEUE и DEPART, а именно: блок QUEUE 2 можно вставить непосредственно после блока GENERATE, а блок DEPART 2 - перед блоком TERMINATE.


В отличие от очередей таблицы позволяют определять любые статистические характеристики любых случайных величин в модели .

Объект типа таблица представляет собой эквивалент понятия «статистическая гистограмма». Гистограммы применяются для статистического анализа такой случайной величины, функция распределения которой неизвестна, но зато имеется достаточно большое число независимых реализаций этой величины.

Гистограмма задается набором каких-либо выделенных интервалов изменения случайной величины и количеством попаданий ее реализованных значений в каждый из интервалов. Графически гистограмма изображается набором прямоугольников, основания которых совпадают с выделенными интервалами, а высоты изображают соответствующие количества попаданий. Например, для некоторой случайной величины Х реализовано 200 значений и в результате получена следующая гистограмма.

Рис **3.

Выделяемые в таблице интервалы называются частотными, а количество попаданий случайной величины в эти интервалы - частотами.

Для рис.**3 частотные интервалы - это интервалы х -10, -10< х -5, ..., х 10, а частоты - это величины 0,31,73,80,16 и 0. Исследуемая случайная величина, которая фиксируется в таблице, называется аргументом таблицы.

Для того, чтобы таблицы можно было использовать в модели, они должны быть описаны.

Для описания таблицы применяется строка TABLE. В поле метки этой строки задается номер или имя таблицы, в поле A - аргумент таблицы в виде СЧА, в поле B - верхняя граница первого частотного интервала, в поле C - ширина интервалов, а в поле D - их число, включающее оба полубесконечных интервала. Например, если аргументом табл. GIS должна быть переменная V$ABC, а интервалы выделяются так, как на рис.**3, то строка описания таблицы будет иметь вид

GIS TABLE V$ABC,-10,5,6.

Если таблица описана, то транзакты могут фиксировать в ней информацию с помощью блока TABULATE. В поле A этого блока указывается имя таблицы, в которой накапливается информация. Если поле В пустое, то при входе транзакта в блок TABULATE вычисляется значение аргумента указанной таблицы и определяется, в какой из интервалов таблицы это значение попадает. После этого счетчик соответствующей интервальной частоты увеличивается на 1. В поле В может быть задано некоторое число - тогда счетчик частоты увеличивается на это число.

В результате моделирования по каждой таблице выдается. Графическое представление гистограмм таблиц отображается в окне таблиц.


В приведенных ниже обозначениях СЧА индекс j соответствует номеру объекта, косвенному номеру объекта или присоединенному имени объекта.

СЧА могут записываться в качестве операндов практически в любом типе блоков.

Если конкретный операнд конкретного блока имеет ограничения на вид используемых в нем СЧА, то при его вводе осуществляется автоматический контроль допустимости СЧА. Кроме того, при вводе СЧА можно обратиться к контекстной помощи (клавиша «?»), которая покажет перечень всех СЧА, допустимых для данного операнда.


Pj - параметр транзакта.

М1 - время прохождения участка модели транзактом, обрабатываемым в данный момент. Вычисляется по формуле М1 =(текущее время)-(отметка времени).

МРj - время прохождения участка модели транзактом, обрабатываемым в данный момент. Вычисляется по формуле МРj = (текущее время) - Рj. Для использования СЧА МРj нужно в Рj предварительно занести отметку времени блоком MARK.

PR - приоритет обрабатываемого в данный момент транзакта.


Nj - число входов транзактов в блок j.

Wj - число транзактов, находящихся в блоке j.


RNj - псевдослучайное число. Если RNj используется как аргумент функции, то 0 Ј RNj < 1.

В остальных случаях 0 Ј RNj < 1000 .


Sj - содержимое памяти j.

Rj - свободный объем памяти j.

SAj - среднее содержимое памяти j (целая часть).

SRj - коэффициент использования памяти j в частях от тысячи. Рассчитывается по формуле: SRj = 1000* SAj / (емкость памяти j).

SMj - максимальное содержимое памяти j.

SCj - число входов в память j.

STj - среднее время пребывания транзактов в памяти j (целая часть).

Fj - состояние устройства j (0 - свободно, 1 - в остальных случаях).

FRj - коэффициент использования усройства j в частях от 1000.

FCj - число входов в устройство j.

FTj - среднее время использования устройства j одним транзактом (целая часть).


Qj - длина очереди j.

QАj - средняя длина очереди j (целая часть).

QМj - максимальная длина очереди j.

QСj - число входов в очередь j.

QZj - число нулевых входов в очередь j.

QTj - среднее время пребывания в очереди j с учетом нулевых входов (целая часть).

QXj - среднее время пребывания в очереди j без учета нулевых входов (целая часть).

TBj - среднее значение аргумента таблицы j (целая часть).

TCj - число входов в таблицу j.

TDj - оценка стандартного отклонения для таблицы j (целая часть).


Хj - содержимое ячейки j.

МХj(а, b) - содержимое ячейки j-ой матрицы ячеек, а - номер строки матрицы, b - номер столбца (а и b могут быть любыми СЧА).


FNj - значение функции j. Если это значение не используется в качестве модифика-тора в блоках GENERATE, ASSIGN и ADVANCE или в качестве аргумента веществен-ной переменной, то сохраняется только целая часть.

Vj - значение j-ой арифметической переменной.

BVj - значение булевской переменной (0 или1).


СНj - число транзактов в j-ом списке пользователя.

СAj - среднее число транзактов в j-ом списке пользователя (целая часть).

СMj - максимальное число транзактов в j-ом списке пользователя.

СCj - число входов в j-ый список пользователя.

СTj - среднее время пребывания транзакта в j-ом списке пользователя (целая часть).


Gj -число элементов j-ой группы.


AC1 – абсолютное время (сбрасывается командой CLEAR).

TG1 – количество окончаний прогонов, поступающее в счетчик текущих запусков.

XN1 – номер активного транзакта.

В приведенных выше обозначениях СЧА индекс j соответствует номеру объекта, косвенному номеру объекта или присоединенной метке объекта.

СЧА могут записываться в качестве операндов практически в любом типе блоков.


Блок COUNT служит для определения количества элементов, удовлетворяющих указанному условию. Он может содержать до пяти полей:

COUNT lo A, B, C [ , D, E]

где lo – логический оператор. Если поля D, E отсутствуют, то lo представляет собой мнемонику СЛА, т.е. для устройств это будет FU, FNU, и т.д., для памятей – SE, SNE и т.д., для ключей – LR или LS;

A – номер параметра входящего транзакта, в который помещается результат подсчета объектов;

B – нижний предел номер анализируемых объектов;

C – верхний предел номеров объектов.

Тип объектов задавать не нужно, т.к. он однозначно определяется мнемоникой логического оператора. Множество объектов просматривается и подсчитывается число таких из них, для которых указанный СЛА имеет значение «истина». Полученное число заносится в параметр транзакта, заданный в поле A.

Если заданы также поля D и E, то логический оператор lo является оператором сравнения, т.е. имеет вид L, или LE, E, NE и т.д. В поле D тогда задается некоторая величина, а в поле E – СЧА объектов, сравниваемый с величиной поля E. СЧА задается в виде мнемоники без указания номера объекта, т.к. диапазон номеров объектов определен в полях B и C. Например, СЧА может быть задан в виде обозначения SR – тогда будут просматриваться памяти и их коэффициент использования будет сравниваться с величиной в поле E.

Пример:

COUNT LE 1, 1, 5, X10, FC.

Здесь в параметр 1 будет записано число устройств из множества от 1-го до 5-го устройства, у которых атрибут FC (счетчик входов) меньше или равен X10.

Блок SELECT применяется для нахождения номера первого объекта (из определенного диапазона объектов), удовлетворяющего заданному условию. Операции и операнды этого блока такие же, как и у блока COUNT, с той лишь разницей, что вместо числа соответствующих условию объектов находится номер первого такого объекта. И еще одно отличие состоит в том, что логический оператор здесь может быть задан не только теми обозначениями, которые предусмотрены для блока COUNT, но также еще двумя: MIN и MAX.

Пример:

SELECT MIN 1,1,8,,Q.

Здесь будет найден номер самой короткой очереди из восьми (с первой по восьмую) и записан в первый параметр транзакта.

 
Оглавление
Программирование в GPSS
прагматический аспект
Классы объектов языка GPSS
Интерпретации транзактов
Интерпретаций устройст
Элементы реальных систем
Очереди и таблицы
Блоки
Модельное время
Общеалгоритмические средства GPSS
Стандартные числовые атрибуты
Арифметические переменные
Логические (булевы) переменные
Функции
Ячейки и матрицы ячеек
Задание начальных значений ячеек и матриц
Объектно-ориентированные средства GPSS
Создание и уничтожение транзактов
Задержка транзактов в блоках ADVANCE
Операции занятия и освобождения устройств
Операции захвата и освобождения устройств
Операции блокирования и разблокирования устройств
Описание памятей и работа с ними
Операции с ключами
Блок GATE
Синхронизация транзактов
Изменение параметров транзактов
Управление маршрутами транзактов в модели
Сбор статистики с помощью очередей
Сбор статистики с помощью таблиц
Стандартные числовые атрибуты
Атрибуты транзактов
Атрибуты блоков
Системные атрибуты
Атрибуты оборудования
Статистические атрибуты
Атрибуты ячеек SAVEVALUE
Функции и переменные
Атрибуты списков пользователя
Атрибуты группы
Системные атрибуты
Блоки COUNT и SELECT
Все страницы