Блоки и команды GPSS World



В данном разделе приводится описание основных блоков языка GPSS World, взятое из [9] и несколько переработанное.

Изменения состояния в моделях GPSS World происходят в результате входа сообщений в блоки и выполнения подпрограмм, связанных с этими блоками. В данном разделе описываются следующие типы блоков: GENERATE, TERMINATE, ADVANCE, ASSIGN, INDEX, MARK, COUNT, SELECT, PRIORITY и BUFFER.

Блок GENERATE

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

Блок GENERATE имеет следующий формат записи:

GENERATE [<A>],[<B>],[<C>],[<D>],[<E>]

В поле А указывается время, которое определяет интервал между моментами генерации сообщений блоком GENERATE. Операнд А может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры транзакта.

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

Может быть два типа модификаторов:

– модификатор — интервал;

– модификатор — функция.

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

Например:

GENERATE 25, 10

В этом случае генерация сообщений производится по равномерному закону из интервала — (15,35).

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

Следует обратить внимание на то, что транзакта генерируются с заданными интервалами только в том случае, если у блоков, следующих за блоком GENERATE (например, GATE, TEST, SEIZE, PREEMPT или ENTER), не выставлены блокирующие условия. Каждое последующее транзакт формируется только тогда, когда транзакт из блока GENERATE входит в следующий блок. Формирование последующих сообщений включает вычисление интервала времени, в течение которого подготовленное транзакт остается в блоке GENERATE. Вычисленное значение при сложении со значением абсолютного условного времени дает значение времени, при котором транзакт войдет в модель.

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

Если первый из вычисленных интервалов между моментами генерации сообщений равен 0, то этот интервал принимается равным 1. Если поля А и В пустые, что указывает на нулевой интервал между моментами генерации сообщений, то блок GENERATE будет генерировать транзакта до тех пор, пока не использует все транзакта, которые могут быть активными в какой-то определённый момент времени. Чтобы предупредить это, следует либо задать предел генерации (поле D), либо за блоком GENERATE должен следовать блок, который вызывает блокирующее условие.

В поле С задается начальная задержка. Начальная задержка относится к моменту формирования первого транзакта в блоке GENERATE как при первом просчете модели, так и после выполнения операции CLEAR. Начальная задержка — это момент времени, в который первое сгенерированное транзакт должно выйти из блока GENERATE; поля А и В на задержку транзакта влияния не имеют. Начальная задержка может быть меньше, равна или больше среднего времени, заданного в поле А. Операнд С может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры транзакта.

В поле D задается предел генерации. Эта величина представляет собой максимальное число сообщений, которое будет создано в блоке GENERATE. Операнд D может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры транзакта. Если поле D пусто, блок генерирует неограниченное число сообщений. Предел генерации инициализируется повторно операцией CLEAR.

Поле Е определяет приоритет сообщений. Операнд Е может быть именем, положительным целым числом или непосредственно СЧА. Нельзя использовать в качестве операнда параметры транзакта. Если поле Е не задано, приоритет по умолчанию равен 0.

В начальный момент времени в каждом блоке GENERATE производится подготовка к выходу одного транзакта. На этой стадии модель еще полностью не инициализирована для выполнения. По этой причине все СЧА, описанные в блоке GENERATE, должны быть уже определёны. В модели блоку GENERATE должны предшествовать операторы описания INITIAL, FUNCTION и VARIABLE. Это делается для того, чтобы СЧА в блоке GENERATE, который ссылается на них, давали желаемые результаты.

Когда транзакт покидает блок GENERATE, счётчик общего числа прошедших через блок сообщений (Nj) увеличивается на единицу. Так как последующее транзакт не генерируется до тех пор, пока предыдущее транзакт не покидает блок GENERATE, то содержимое счётчика текущего числа находящихся в блоке сообщений (Wj) никогда не превышает 1.

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

При использовании блока GENERATE необходимо помнить, что транзакт не должно входить в блок GENERATE. Если транзакт пытается это сделать, возникает ошибка выполнения.

Оператор CLEAR удаляет из модели GPSS все транзакта, в том числе и те, которые связаны с блоками GENERATE. После завершения действия оператора CLEAR, транзакта генерируются в каждом блоке GENERATE, как если бы команда GENERATE встретилась в первый раз. Всем СЧА придаются новые значения, и начальная задержка снова воздействует на первое генерируемое транзакт. Предел генерации вновь устанавливается равным значению, полученному при повторном задании значений СЧА.

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

1) выполнены операции, заданные оператором CLEAR, и производится повторный запуск всех блоков GENERATE;

2) блок GENERATE описан повторно.

Блок TERMINATE

Блок TERMINATE имеет следующий формат записи:

TERMINATE [<A>]

Блок TERMINATE удаляет из модели входящие транзакта.

В поле А задается число единиц, на которое этот блок изменяет содержимое счётчика завершений, определяющего момент окончания моделирования. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>. По умолчанию значение, определяемое полем А, равно 0. Если поле А пусто, то транзакт уничтожается, а содержимое счётчика не изменяется.

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

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

GENERATE 1000
TERMINATE 1
START 5
...............
START 20

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

Каждое транзакт, входящее в блок TERMINATE, будет уменьшать содержимое счётчика на единицу. Предположим, что все остальные блоки TERMINATE в модели имеют пустые поля А, что означает, что содержимое счётчика не уменьшается. Тогда программа будет считать до тех пор, пока условное время не станет равным 5000, поскольку в первой карте START начальное содержимое счётчика задано равным 5. Поскольку блок GENERATE генерирует по одному транзакту через каждые 1000 единиц условного времени, пятое транзакт войдет в блок TERMINATE в момент, когда условное время будет равно 5000. Во второй команде START начальное значение счётчика задано равным 20, поэтому второй прогон будет продолжаться в течение 20000 единиц условного времени.

Каждый раз, когда транзакт входит в блок TERMINATE, общее число сообщений, вошедших в блок TERMINATE (Nj), увеличивается на единицу. Число сообщений, находящихся в данный момент времени в блоке TERMINATE, всегда равно нулю, т. е. Wj = 0.

Стандартным числовым атрибутом, связанным с описываемым оператором, является TG1 — число, равное текущему значению счётчика завершений. TG1 возвращает содержимое счётчика завершений, которое уменьшается блоком TERMINATE при заданном операнде А. Эта величина первоначально задается оператором START и указывает на завершение моделирования, когда становится равной 0.

Блок ADVANCE

Блок ADVANCE имеет следующий формат записи:

ADVANCE <A>,[<B>]

Блок ADVANCE задерживает продвижение транзакта на заданный период времени. В поле А задается среднее время пребывания транзакта в блоке ADVANCE. Содержимое поля А может быть именем, любым целым числом, в том числе и 0, СЧА или СЧА*<параметр>. Если время задержки равно 0, транзакт помещается в список текущих событий перед транзактами с таким же приоритетом. Транзакты с положительным временем задержки помещаются в список будущих событий.

В поле В указывается способ модификации среднего значения, заданного в поле А. Операнд В может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Может быть два типа модификаторов:

– модификатор-интервал;

– модификатор-функция.

Интервал изменения среднего времени задержки может быть задан константой, значение которой не должно превосходить среднего времени задержки, вычисленного для данного транзакта. Эта константа определяет интервал, в котором времена задержки распределены равномерно. Все времена задержки выражаются целыми числами. Любое из (2В+1) целых чисел, заключенных в интервале (А-В, А+В), будет выбираться с вероятностью 1/(2B+1).

Например, если среднее время задано равным 10, а константа, определяющая интервал изменения, равна 5, то время задержки транзакта в блоке изменяется от 5 до 15. Для каждого из входящих в блок ADVANCE сообщений выбирается только одно из возможных значений времени задержки. Любое целое число из интервала (5—15), включая границы 5 и 15, будет выбираться с вероятностью 1/11. Дробные значения времени задержки не допускаются, поскольку условное время интерпретатора принимает только целые значения. Константа, определяющая интервал времени задержки, не должна превосходить среднего времени задержки, в противном случае может быть получено отрицательное время задержки в блоке ADVANCE. Отрицательное значение задержки всегда считается ошибкой.

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

Операции блока ADVANCE

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

1) генерированное другим транзактм прерывание является для данного транзакта первым;

2) данное транзакт уже было прервано на каком-либо из занятых им устройств.

В первом случае происходит следующее:

1) остаток времени, в течение которого транзакт должно было находиться в блоке ADVANCE, равен разнице вычисленного времени выхода транзакта из блока ADVANCE и текущего значения абсолютного условного времени;

2) транзакт удаляется из списка будущих событий;

3) транзакт рассматривается, как находящееся в состоянии прерывания;

4) указывается, что транзакт находится в списке прерывания;

5) счётчик прерываний устанавливается в единицу.

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

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

Когда прерываемое транзакт входит в блок ADVANCE выполняются следующие операции:

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

2) индикатор состояния прерывания устанавливается в единицу;

3) транзакт удаляется из списка текущих событий;

4) транзакт помещается в список прерываний.

Когда вычисленное значение времени задержки транзакта в блоке ADVANCE отлично от нуля, значения счётчика текущего числа сообщений в блоке (Wj) и счётчик общего числа входов (Nj) увеличиваются на единицу. Если вычисленное время задержки равно нулю, и транзакт может перейти к следующему блоку, то увеличивается только счётчик Nj. Если же транзакт не может войти в следующий блок, то увеличивается и счётчик Wj.

Блок ASSIGN

Блок ASSIGN имеет следующий формат записи:

ASSIGN <A>,<B>,[<C>]

Блок ASSIGN заменяет, увеличивает или уменьшает текущее значение параметра транзакта на заданное значение.

В поле А задается номер параметра, которому присваивается значение. Операнд А может быть именем, положительным целым числом, СЧА, СЧА*<параметр> и следующими за ними знаками +, –. Если значение параметра нужно увеличить или уменьшить, то справа в поле А ставится знак сложения или вычитания. Например, аргумент поля А может быть закодирован следующим образом:

1) 2 — заменяется текущее значение параметра 2;

2) 2– — вычитается заданное значение из текущего значения параметра 2;

3) 2+ — прибавляется заданное значение к текущему значению параметра 2;

Поле В определяет значение, которое следует добавить или вычесть из значения параметра, заданного аргументом поля А, или заменить его. Если такой параметр не существует, то он создается. Операнд В может быть именем, любым целым числом, СЧА, или СЧА*<параметр>.

Пример:

ASSIGN 2000+,-3

В этом примере значение поля В, равное –3, добавляется к значению параметра с номером 2000, который задан операндом А. Если такой параметр в транзакте отсутствует, то он создается со значением, равным 0, до того, как будет произведено добавление. Тогда значение параметра транзакта становится равным –3.

Поле С задает номер модификатора-функции. При использовании поля С значение аргумента поля В умножается на значение модификатора-функции (от функции берется целая часть). Полученное произведение, от которого выделяется целая часть, становится значением, которое изменяет значение параметра, заданного в поле А. Следует отметить: если в поле С записано FN1, это не означает, что номер модификатора-функции равен 1, он равен целому значению FN1.

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

10 FUNCTION RN16 C3
0.075, 1/0.55, 2/.999, 3
1 FUNCTION...
.
.
.
2 FUNCTION...
.
.
.
3 FUNCTION...
.
.
.
GENERATE 200,12
ASSIGN 8,FN10
ASSIGN 2,FN*P8

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

Блок ASSIGN может использоваться для управления логикой модели. Предположим, что система последовательно обрабатывает по одному символу поступившего информационного транзакта. Рассмотрим часть модели, в которой блок ASSIGN используется для построения цикла обработки транзакта.

.
MET1 ASSIGN 1+,1
ADVANCE X1
TEST E P1,P2,MET1

 

Каждое транзакт представляет собой одно информационное транзакт и должно повторять блоки, изображающие процесс обработки символа, в данном случае блок ADVANCE, столько раз, сколько символов в соответствующем информационном транзакте. Длина информационного транзакта записана в параметр 2.

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

Блок ASSIGN добавляет единицу к счётчику числа выполненных циклов обработки транзакта (счётчик организован в параметре 1). Предполагается, что параметр 1 устанавливается в "0" перед входом в цикл обработки. Пока не выполнится условие Р1 = Р2, блок TEST будет возвращать транзакт к началу цикла. После выполнения условия из блока TEST транзакт перейдет к следующему по номеру блоку.

СЧА, связанным с описанным оператором, является Р<параметр> или *<параметр> — значение параметра. P<параметр> возвращает значение параметра, заданного <параметром>.

Блок INDEX

Блок INDEX имеет следующий формат записи:

INDEX <A>,<B>

Блок INDEX к определённому в поле А значению параметра транзакта прибавляет величину, определённую полем В. Результат записывается в параметр 1. Поле А задает номер параметра, значение которого увеличивается на значение аргумента поля В. Если параметра с таким номером не существует, то возникает ошибка выполнения. Однако, если для обрабатываемого транзакта не существует параметра с номером 1, то он создается.

Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле В задает числовую величину, которая прибавляется к содержимому параметра. Операнд В может быть именем, любым целым числом, СЧА или СЧА*<параметр>.

Пример:

INDEX 2,1

В этом примере, когда транзакт входит в блок INDEX, его параметру с номером 1 присваивается сумма 1 и значения параметра 2 данного транзакта.

СЧА, связанным с описываемым оператором, является P<номер параметра> или *<номер параметра> — значение параметра. Возвращает значение параметра с указанным номером.

Блок MARK

Блок MARK имеет следующий формат записи:

MARK [<A>]

Блок MARK либо заменяет значение отметки времени транзакта на текущее значение абсолютного условного времени (операнд А не определён), либо записывает значение условного времени в заданный параметр транзакта (при использовании операнда А).

Поле А содержит номер параметра, в который записывается значение абсолютного условного времени. Если такого параметра не существует, то он создается. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Примеры:

MARK BEGINNING

В этом примере, когда транзакт входит в блок MARK, его параметру с именем BEGINNING присваивается значение абсолютного условного времени АС1.

MARK

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

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

1) М1 — время прохождения транзактм модели. Вычисление значения этого СЧА производится следующим образом:

 

M1= Текущее значение условного времени Отметка времени обрабатываемого в данный момент транзакта

 

2) MPj — промежуточное прохождение транзактм участка модели. Вычисление значения этого СЧА производится следующим образом:

 

MPj= Текущее значение абсолютного условного времени Значение j-го параметра обрабатываемого в настоящий момент транзакта

 

Блок COUNT

Блок COUNT имеет следующий формат записи:

 

COUNT <X> <A>,<B>,<C>,[<D>],[<E>]

<X> — здесь и далее обозначение используемого логического или условного операторов. Данный операнд может принимать следующие значения: FNV, FV, I, LS, LR, NI, NU, SE, SF, CNE, SNF, SNV, SV, U, 'E', 'G', 'GE', 'L', 'LE', MIN, MAX или 'NE'.

Блок COUNT определяет число объектов, удовлетворяющих заданному условию. Например, пользователю может понадобиться узнать число свободных устройств в определённом диапазоне номеров устройств или число памятей с коэффициентом использования меньше 50 (в частях от 1000) и т. д.

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

NU — устройство свободно (доступно);

U — устройство занято (в результате выполнения транзактм блока SEIZE или PREEMPT);

NI — устройство не прервано (т. е. либо оно свободно, либо занято транзактм, выполнившим блок SEIZE);

I — устройство прервано (устройство занято транзактм, выполнившим блок PREEMPT);

FV — устройство доступно;

FNV — устройство недоступно.

Многоканальные устройства имеют следующие логические условные операторы:

SE — многоканальное устройство пусто (нулевое содержимое);

SNE — многоканальное устройство не пусто (ненулевое содержимое);

SF — многоканальное устройство заполнено;

SNF — многоканальное устройство не заполнено;

SV — многоканальное устройство доступно;

SNV — многоканальное устройство недоступно.

Логические ключи имеют следующие логические операторы:

LR — проверка ключа на состояние "выключено";

LS — проверка ключа на состояние "включено";

При использовании логических операторов поля D и E могут быть пустыми.

В блоке COUNT можно использовать следующие условные операторы:

'L' — меньше. Условие выполняется, если значение стандартного числового атрибута, заданного в поле Е, меньше значения стандартного числового атрибута, заданного в поле D;

'LE' — меньше или равно. Условие выполняется, если значение СЧА, заданного в поле Е, меньше или равно значению СЧА, заданного в поле D;

'E' — равно. Условие выполняется, если значение СЧА, заданного в поле Е, равно значению СЧА, заданного в поле D;

'NE' — не равно. Условие выполняется, если значение СЧА, заданного в поле Е, не равно значению СЧА, заданного в поле D;

'G' — больше. Условие выполняется, если значение СЧА, заданного в поле Е, больше значения СЧА, заданного в поле D;

'GE' — больше или равно. Условие выполняется, если значение СЧА, заданного в поле Е, больше или равно значению СЧА, заданного в поле D;

MAX — наибольшее значение из всех значений СЧА объектов, удовлетворяющих заданному условию;

MIN — наименьшее значение из всех значений СЧА объектов, удовлетворяющих заданному условию.

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

В поле А задается номер параметра вошедшего в блок транзакта, в котором будет организован счётчик числа объектов. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

В поле В определяется нижняя граница диапазона изменения номеров или имен объектов, для которых проверяется заданное условие. Операнд В может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

В поле С определяется верхняя граница диапазона изменения номеров или имен объектов, для которых проверяется заданное условие. Операнд С может быть именем, положительным целым числом, СЧА или СЧА*<параметр>. Значение поля С должно быть больше либо равно значению, заданному в поле В. Номер проверяемых объектов не должен превышать 32768.

Поле D задает сравниваемое значение (величина сравнения) для аргумента поля Е. Операнд D может быть именем, любым целым числом, СЧА или СЧА*<параметр>. Это значение используется совместно с заданными условными операторами ('E', 'NE', 'G', 'GE', 'L', 'LE'). Значение СЧА сравнивается со значением объекта, заданного аргументом поля Е. Если условный оператор не используется, поле D можно не задавать.

Поле Е используется совместно с аргументом поля D и условным оператором. В поле Е задается какой-либо из стандартных числовых атрибутов просматриваемых объектов. Необходимо только записывать мнемоническое обозначение атрибута, поскольку диапазон изменения номеров объектов задан полями В и С.

Рассмотрим несколько примеров использования блока COUNT.

COUNT 'LE' 1,1,5,X10,FC

В этом примере подсчитывается число устройств (из устройств 1-5 включительно), у которых счётчик числа входов (FC) меньше или равен текущему значению ячейки 10. Результат подсчета будет записан в параметре 1 вошедшего в блок COUNT транзакта.

В нижеприведенном примере подсчитывается число заполненных многоканальных устройств (SF) при изменении номеров в интервале 10-20 (включительно). Результат подсчета записывается в параметре 5 вошедшего в блок транзакта.

COUNT SF 5,10,20

Блок SELECT

Блок SELECT имеет следующий формат записи:

SELECT <X> <A>,<B>,<C>,[<D>],[<E>],[<F>]

Блок SELECT выбирает первый объект в заданном диапазоне, который удовлетворяет определённому условию. Номер этого объекта записывается в заданный параметр вошедшего в блок транзакта. В основном, действия блока SELECT аналогичны действиям блока COUNT.

<X> — обозначение логического или условного операторов.

Логические и условные операторы имеют такой же смысл, как и в блоке СOUNT.

MIN и MAX задают работу блока соответственно в минимальном и максимальном режимах.

В поле А задается номер параметра вошедшего в блок COUNT транзакта, куда записывается номер объекта, удовлетворяющего заданному условию.

Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле В определяет нижнюю границу диапазона изменения номеров объектов, для которых проверяется заданное условие. Операнд В может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле С определяет верхнюю границу диапазона изменения номеров объектов, для которых проверяется заданное условие. Операнд С может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

В поле D задается величина сравнения. Это значение используется совместно с условными операторами ('E', 'NE', 'GE', 'L', 'LE'). Операнд D может быть именем, любым целым числом, СЧА или СЧА*<параметр>.

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

Поле Е используется совместно с полем D и условным оператором. В поле Е задается только мнемоническое обозначение СЧА объекта без указания конкретного номера, поскольку диапазон изменения номеров объектов задан полями В и С. В поле Е может быть задан любой из стандартных числовых атрибутов объекта.

Поле F задает номер альтернативного блока для входящего транзакта, если заданным условиям не удовлетворяет ни один объект в диапазоне. Операнд F может быть именем, положительным целым числом, СЧА или СЧА*<параметр>. Если операнд F не используется, то транзакт будет продвинуто к следующему по номеру блоку. Рассмотрим примеры использования блока SELECT.

SELECT MAX 1,5,10,,FR

В данном примере из устройств с номерами 5-10 (включительно) выбирается устройство с максимальным коэффициентом использования (FR). Номер выбранного устройства записывается в параметре 1 вошедшего транзакта.

В следующем примере из очередей с номерами 10-20 (включительно) выбирается первая очередь, длина которой (Q) больше или равна значению ячейки 5 (X5). Номер очереди, удовлетворяющей этому условию, записывается в параметре 10 вошедшего в блок транзакта.

SELECT 'GE' 10,10,20,X5,Q

Блок PRIORITY

Блок PRIORITY имеет следующий формат записи:

PRIORITY <A>,[<B>]

Блок PRIORITY присваивает транзакту нужный приоритет. Приоритет сообщений влияет на порядок обработки сообщений процедурой просмотра и порядок занятия транзактами объектов оборудования.

Поле А задает новое значение приоритета. Операнд А может быть именем, любым целым числом, СЧА или СЧА*<параметр>.

Новое значение приоритета может быть меньше, больше или равно текущему значению приоритета.

Поле В определяет режим BUFFER, в нем указывается значение "BU".

В общем случае процедура просмотра списка текущих сообщений пытается продвинуть обрабатываемое транзакт в следующий блок. Однако, если в поле В блока PRIORUTY записано слово BU, то после присвоения транзакту нового значения приоритета блок PRIORITY становится эквивалентным блоку BUFFER. Транзакт помещается в список текущих событий в конец своего нового приоритетного класса, процедура просмотра возвращается к началу списка текущих событий и начинает просмотр снова. Поскольку блок BUFFER не задерживает транзакта, вошедшие в этот блок, транзакт будет обработано процедурой просмотра снова при том же значении условного времени. Режим BUFFER подробно рассматривается при описании блока BUFFER.

Например:

PRIORITY 10

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

Внутренние операции блока PRIORITY

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

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

В режиме BUFFER интерпретатор немедленно возвращается к началу списка текущих событий. Флаг изменения состояния также сразу же устанавливается в "0".

СЧА, связанным с описываемым оператором, является PR — значение приоритета обрабатываемого транзакта.

Блок BUFFER

Блок BUFFER имеет следующий формат записи:

BUFFER

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

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

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

1) транзакт входит в блок ADVANCE с положительной задержкой и переводится в список будущих событий;

2) транзакт не может войти ни в один из указанных последующих блоков;

3) транзакт входит в блоки MATCH, ASSEMBLE или GATHER, которые производят следующие действия:

– либо уничтожают транзакта (последние n-1 транзакта в блоке ASSEMBLE);

– либо переводят транзакт в состояние синхронизации (блоки MATCH и GATHER и первое транзакт в блоке ASSEMBLE);

4) транзакт уничтожается блоком TERМINATE;

5) транзакт переводится в список пользователя в блоке LINK; обычно интерпретатор переходит к обработке другого транзакта.

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

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

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

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

ASSIGN 1,PR,PH
K PRIORITY 0,BUFFER
K+1 PRIORITY PH1

Блок PRIORITY с номером К помещает транзакт в конец списка текущих событий. Текущее значение приоритета транзакта записано в параметре 1 формата "полуслово" с тем, чтобы его можно было восстановить, когда транзакт войдет в блок К+1. В режиме BUFFER интерпретатор возвращается к началу списка текущих событий. Он просматривает все транзакта в списке текущих событий и опять встречает транзакт, вошедшее в блок PRIORITY с номером К. Это транзакт входит в блок PRIORITY с номером К+1, который восстанавливает первоначальный уровень приоритета транзакта, записанный в параметре 1 формата "полуслово".

Блоки, изменяющие порядок прохождения блоков
транзактами

Обычно интерпретатор пытается продвинуть транзакт к следующему по номеру блоку. Однако существуют четыре типа блоков, которые позволяют изменять номер следующего блока. Эти блоки TRANSFER, LOOP, TEST и GATE.

Блок TRANSFER

Блок TRANSFER имеет следующий формат:

TRANSFER [<A>],[<B>],[<C>],[<D>]

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

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

Существуют следующие режимы работы блока TRANSFER:

безусловный (пробел);

статистический (.);

BOTH;

ALL;

PICK;

функция (FN);

параметр (Р);

подпрограмма (SBR);

SIM.

Кроме того, операнд А может быть дробным числом, именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поля В и С задают возможные значения номеров следующих блоков или их положение. Использование значений описано при рассмотрении определённых режимов выбора. Операнды могут быть именем, положительным целым числом, СЧА или СЧА*<параметр>. Если поле В пусто, ассемблер записывает в нем номер блока, следующего за блоком TRANSFER.

Безусловный режим выбора

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

Например:

XFER TRANSFER,NEXT
NEXT SEIZE 1

Транзакта, входящие в блок TRANSFER XFER, переходят к блоку NEXT.

TRANSFER,V$TER

Транзакта, которые входят в вышеприведенный блок TRANSFER, сразу переходят в блок, номер которого определяется переменной FЕR.

Статистический режим выбора

Когда операнд А не является зарезервированным словом, блок TRANSFER работает в статистическом режиме выбора.

Значение аргумента, записанного после точки (.) в поле А, рассматривается как трехзначное число, показывающее (в частях от тысячи), какой процент входящих в блок сообщений следует направить к блоку, указанному в поле С. Остальные транзакта направляются к блоку, указанному в поле В, или к следующему по номеру блоку, если операнд В пропущен. Для каждого транзакта выбирается один из двух возможных вариантов; после того как выбор сделан, второй вариант для этого транзакта не рассматривается.

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

Например,

BCD TRANSFER.709,BLK1,BLK2

Из общего числа сообщений, входящих в блок BCD, в среднем.709 будут пытаться войти в блок BLK2. Остальные.209 будут пытаться войти в блок BLK1.

BCD TRANSFER.P1,BLK3,BLK4

Трехзначное число, записанное в параметре 1 сообщений, входящих в блок BCD, интерпретируется как вероятность (в частях от тысячи) того, что транзакт попытается войти в блок BLK4. В остальных случаях транзакт попытается войти в блок BLK3.

CDE TRANSFER.X1,BLK5,BLK6

Если в момент входа сообщений в блок CDE в ячейке SAVEVALUE 1 записано число 30, то в среднем 3 % от общего числа сообщений будет направлено к блоку BLK6, а остальные 97 % попытаются войти в блок BLK5.

Режим BOTH

Если в поле А стоит зарезервированное слово ВOTH, блок TRANSFER работает в режиме BOTH.

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

TRANSFER BOTH,TRY1,TRY2
TRY1 SEIZE 1
TRY2 SEIZE 2

Режим ALL

Если в поле А стоит зарезервированное слово ALL, блок TRANSFER работает в режиме ALL.

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

N + M, N + 2M, N + 3M,... L,

где:

N — номер блока, указанного в поле В;

М — значение шага, заданного в поле D;

L — номер блока, указанного в поле С.

Этот номер должен быть больше номера блока, указанного в поле В, на величину, кратную шагу М. Если операнд D не задан, то проверяется каждый блок, номер которого принадлежит этому ряду, включая блок, определённый операндом С. Блоки, номера которых выше номера блока, указанного в поле С, не проверяются. Как только первый блок, способный принять транзакт, будет найден, транзакт входит в этот блок и оттуда продолжает свое дальнейшее движение. Если транзакт не может перейти ни к одному из указанных блоков, оно остается в блоке TRANSFER и повторяет описанную выше процедуру при каждом просмотре списка текущих событий до тех пор, пока не выйдет из блока.

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

TRANSFER ALL,60,120,10

В этом примере транзакт будет последовательно пытаться перейти к блокам 60, 70, 80,... 120.

TRANSFER ALL,NEXT1,NEXT2,5

Здесь режим ALL допустим только в том случае, если разность между номерами, присвоенными блокам NEXT1 и NEXT2, кратна 5.

TRANSFER ALL, 60, 120, 25

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

Условными являются только режимы BOTH и ALL. Во всех остальных режимах выбор следующего блока производится в момент входа транзакта в блок. В режимах BOTH и АLL выбор следующего блока производится в момент снятия блокирующего условия. Следует отметить, что каждый раз, когда интерпретатор при просмотре списка текущих событий обнаруживает транзакт, задержанное в блоках TRANSFER BOTH или TRANSFER ALL, он пытается продвинуть транзакт, начиная с блока, указанного в поле В. Следовательно, в режиме BOTH в тех случаях, когда возможен переход к обоим блокам (В и С), блок В имеет некоторое преимущество. Аналогично, в режиме ALL в случае, когда возможен переход к нескольким блокам, блоки с меньшими номерами имеют некоторое преимущество перед блоками с большими номерами.

Режим PICK

Если в поле А стоит зарезервированное слово PICK, блок TRANSFER работает в режиме PICK. В этом режиме из последовательности блоков с номерами N, N+1, N+2,...M (N — номер блока, указанного в поле В, а М — номер блока, указанного в поле С) случайным образом выбирается один блок, к которому должно быть направлено транзакт. Все блоки, включая указанные в полях В и С, выбираются с одинаковой вероятностью, равной 1/(М-N)+1. Транзакт пытается перейти только к выбранному для него блоку. Если транзакт не может сразу перейти к следующему блоку, то оно будет ждать в блоке TRANSFER до тех пор, пока не будет снято блокирующее условие. Номер блока в поле С должен быть больше или равен N+1. Например:

TRANSFER PICK,30,39

Транзакт, вошедшее в блок TRANSFER, пытается войти в один из 10 блоков (30,31,...39) с равной вероятностью: 1/10.

Режим "функция" (FN)

Если в поле А стоит зарезервированное слово FN, блок TRANSFER работает в режиме "функция".

Вычисляется значение функции, номер которой задан в поле В блока TRANSFER; если результат нецелый, от него берется целая часть. Для определёния номера следующего блока полученное целое число складывается с аргументом поля С (в поле С может быть записан ноль). Транзакт пытается перейти только к блоку с вычисленным номером. Транзакт остается в блоке TRANSFER до тех пор, пока не сможет перейти именно к этому блоку. Например:

TRANSFER FN,3,PH3

 

Номер следующего блока = Значение функции FN3 + Значение параметра 3 формата "полуслово"

 

Режим "параметр"

Если в поле А стоит зарезервированное слово Р, блок TRANSFER работает в режиме "параметр".

Значение аргумента поля В интерпретируется как номер j параметра входящего транзакта. Для определёния следующего номера блока для данного транзакта, значение этого параметра складывается со значением аргумента поля С. Если операнд С не задан, номер следующего блока будет равен значению параметра.

Например:

TRANSFER P,12,37

 

Номер следующего блока = Значение параметра 12, вошедшего в блок транзакта + Значение записанное в ячейке 37

 

Режим "подпрограмма" (SBR)

Если в поле А стоит зарезервированное слово SBR, блок TRANSFER работает в режиме "подпрограмма".

Вошедшее в блок TRANSFER транзакт будет пытаться перейти к блоку, указанному в поле В. Значение аргумента поля С интерпретируется как номер параметра; в этом параметре записывается номер j данного блока TRANSFER. Если такого параметра нет, то он создается. Этот режим блока TRANSFER обычно используется для перехода к подпрограмме, началом которой является блок, указанный в поле В. Например,

TRANSFER SBR,NEXT,10

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

TRANSFER P,10,1,

то транзакт сможет вернуться к блоку, следующему за блоком TRANSFER SBR, где следующий блок равен текущему значению, записанному в параметре под номером 10 (в данном случае это номер блока TRANSFER SBR) плюс 1.

Режим SIM

Если в поле А стоит зарезервированное слово SIM, то блок TRANSFER работает в режиме SIM.

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

Если все условия перехода к следующему блоку удовлетворяются, то индикатор SIM остается равным нулю. Если не выполняется хотя бы одно из условий, то индикатор SIM данного транзакта устанавливается в единицу (в режимах BOTH и ALL индикатор SIM устанавливается в единицу только в том случае, когда переход невозможен ни к одному из указанных блоков). При входе транзакта в блок TRANSFER проверяется значение индикатора SIM. Если он равен нулю, транзакт направляется к следующему блоку, указанному в поле В. Если индикатор SIM равен единице, транзакт направляется к блоку, указанному в поле С, а индикатор SIM устанавливается в "0". В любом случае транзакт будет пытаться перейти только к выбранному для него блоку и будет находиться в блоке TRANSFER до выполнения соответствующих условий. В момент, когда создаются условия для выхода транзакта из блока TRANSFER, значение индикатора SIM не проверяется. Состояние индикатора SIM отмечается символом Х в колонке DELAY распечатки информации о транзактах.

При задержке сообщений в блоках ASSEMBLE, GATHER или MATCH индикатор SIM в единицу не устанавливается.

Изменение индикатора SIM в блоке ADVANCE

Каждый раз, когда транзакт выходит из блока ADVANCE с нулевым временем задержки, индикатор SIM становится равным нулю. После того, как транзакт покинуло блок ADVANCE, оно может быть снова задержано по каким-либо причинам прежде, чем дойдет до тех блоков, в которых проверяется одновременность выполнения ряда условий. Следовательно, индикатор SIM может быть установлен в единицу до того, как начнется проверка условий. В таком случае перед блоками, в которых проверяется одновременное выполнение условий, следует поместить блок TRANSFER SIM, в котором в полях В и С указан один и тот же блок — первый из блоков, проверяющих условия. После прохождения через этот блок, индикатор SIM транзакта снова станет равным нулю. Например,

TRANSFER SIM,10,10

Этот блок позволяет установить в "0" индикаторы всех сообщений, входящих в блок 10.

Внутренние операции блока TRANSFER

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

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

Блок LOOP

Блок LOOP имеет следующий формат:

LOOP <A>,[<B>]

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

В поле А задается параметр, который используется в качестве счётчика цикла. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Интерпретатор определяет значение параметра, заданного полем А. Если оказывается, что такой параметр не существует, то возникает ошибка выполнения и моделирование прекращается, иначе значение параметра уменьшается на единицу и записывается в том же параметре. Далее производится выбор следующего блока, к которому должно перейти транзакт из блока LOOP. Если новое значение параметра не равно нулю, то транзакт перейдет в блок, номер которого указан в поле В. Если же значение параметра — "0", то транзакт переходит к следующему по номеру блоку.

В поле В обычно указывается номер блока, являющегося началом цикла. Операнд В может быть именем, положительным целым, СЧА или СЧА*<параметр>. Один и тот же цикл может одновременно выполняться произвольным числом сообщений. Если транзакт входит в блок LOOP со значением параметра, равным n, то это транзакт войдет в блок LOOP n раз и вернется к началу этого цикла (n-1) раз. Если в момент первого входа транзакта в блок LOOP значение параметра, номер которого указан в поле А, нулевое или отрицательное, происходит ошибка выполнения.

Рассмотрим пример использования блока LOOP:

ASSIGN 4,10
RPT LOGIC S P4
LOOP 4,RPT

Здесь с помощью блока LOOP организован цикл прохождения транзактов через блок с именем RPT.

СЧА, связанным с описываемым оператором, является Р<параметр> — значение параметра. Возвращает значение параметра, номер которого задан <параметром>.

Блок TEST

Блок TEST имеет следующий формат:

TEST <X> <A>,<B>,[<C>]

Блок TEST в противоположность блоку LOOP, не изменяет никаких атрибутов транзакта; он определяет номер следующего блока для вошедшего в него транзакта в зависимости от того, выполняется требуемое условие или нет. Блок управляет потоком сообщений, проверяя выполнение алгебраических отношений между значениями СЧА, заданных в полях А и В.

Операнды А и В — сравниваемые величины, которые могут быть именем, любым целым числом, СЧА или СЧА*<параметр>.

Во вспомогательном поле операции оператора описания блока TEST — <X> — записывается один из шести условных операторов:

'L' — меньше. Отношение истинное, если значение аргумента поля А меньше значения аргумента поля В;

'LE' — меньше или равно. Отношение истинное, если значение аргумента поля А меньше или равно значению аргумента поля В;

'E' — равно. Отношение истинное, если значения обоих аргументов равны;

'NE' — не равно. Отношение истинное, если значения аргументов полей А и В не равны;

'G' — больше. Отношение истинное, если значение аргумента поля А больше значения аргумента поля В;

'GE' — больше или равно. Отношение истинное, если значение аргумента поля А больше или равно значению аргумента поля В.

Если отношение СЧА, заданных в полях А и В, истинно, транзакт переходит к следующему блоку. Если отношение ложно, транзакт переходит к блоку, номер которого задан полем С.

C — номер блока для входящего транзакта, если отношение величин, заданных в полях А и В, ложно. Операнд C может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Блок TEST может работать в двух режимах:

1) в режиме безусловного входа. Если в поле С задан номер следующего блока, транзакта никогда не задерживаются на входе блока TEST. Если заданное в блоке TEST отношение истинно, то транзакт пытается перейти к следующему по номеру блоку. Если отношение ложно, транзакт пытается перейти к блоку заданному полем С. Выбор следующего блока производится только один раз (в момент входа транзакта в блок TEST);

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

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

TEST 'L' C1,500,SNA

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

TEST 'GE' N$PATH1,N$PATH2

Когда счётчик числа входов в блок PATH1 (N$PATH1) больше или равен счётчику числа входов в блок PATH2 (N$PATH2), транзакта входят в блок TEST и переходят к следующему по номеру блоку. Когда счётчик блока PATH1 меньше счётчика блока PATH2, транзакта не могут войти в блок TEST.

TEST 'E' V6,O,SNA

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

TEST 'G' P7,R20

Транзакт может войти в блок TEST только в том случае, если значение параметра 7 больше свободного объема памяти 20 (R20). В противном случае транзакт не может войти в блок TEST.

Блок GATE

Блок GATE имеет следующий формат:

GATE <X> <A>,[<B>]

Блок GATE управляет потоком сообщений на основе значений логических операторов. Блок GATE, как и блок TEST, не изменяет никаких атрибутов сообщений, он определяет номер следующего блока, к которому должно перейти транзакт из блока GATE. Блок GATE может задержать транзакт на входе, если не задан альтернативный выход. Во вспомогательном поле операции <X> задается один из следующих логических операторов.

1) логические операторы, связанные с устройством:

NU — устройство j, заданное в поле А, свободно;

U — устройство j, заданное в поле А, занято (в результате выполнения транзактм блока SEIZE или PREEMPT);

NI — устройство j, заданное в поле А, не прервано;

I — устройство j, заданное в поле А, обслуживает прерывание;

FV — устройство j, заданное в поле А, доступно;

FNV — устройство j, заданное в поле А, не доступно;

2) логические операторы, связанные с многоканальными устройствами:

SE — многоканальное устройство j, заданное в поле А, пусто (S[j]=0);

SNE — многоканальное устройство j, заданное в поле А, не пусто (S[j]<>0);

SF — многоканальное устройство j, заданное в поле А, заполнено (R[j]=0);

SNF — многоканальное устройство j, заданное в поле А, не заполнено (R[j]<>0);

SV — многоканальное устройство j, заданное в поле А, доступно;

SNV — многоканальное устройство j, заданное в поле А, не доступно;

3) логические операторы, связанные с логическими ключами:

LS — логический ключ j, заданный в поле А, включен;

LR — логический ключ j, заданный в поле А, выключен;

4) логические операторы, связанные с транзактами:

М — в блоке j, заданном в поле А блока GATE, находится в состоянии синхронизации транзакт, принадлежащее к тому же семейству, что и транзакт, находящееся в блоке GATE или пытающееся войти в этот блок;

NM — в блоке j, заданном в поле А блока GATE, в состоянии синхронизации нет ни одного транзакта, принадлежащего к тому же семейству, что и транзакт, пытающееся войти в блок GATE.

Поле А содержит имя или номер объекта, для которого проводится проверка. Операнд А может быть именем, положительным целым числом, СЧА или СЧА*<параметр>.

Поле В содержит номер следующего блока для входящего транзакта, когда логический оператор имеет значение "ложь". Операнд В может быть именем, положительным целым числом, СЧА или СЧА*<параметр>. Если поле В определёно, то оно должно содержать номер блока, допустимый для текущей модели.

Режимы условного и безусловного входа блока GATE

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

В режиме условного входа, если поле В блока GATE пусто (альтернативный выход не задан), то транзакта не смогут войти в блок GATE до тех пор, пока указанный в этом блоке логический оператор не будет иметь значение "истина". Интерпретатор не проверяет значение логических операторов (исключениями являются операторы M и NM). В режиме условного входа задержанные транзакта помещаются в списки задержки и таким образом исключаются из числа сообщений, обрабатываемых интерпретатором, до тех пор, пока соответствующий логический оператор не примет значение "истина". Рассмотрим пример:

QUEUE LINE1
GATE SV LINE1
DEPART LINE1

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

Блоки GATE очень мощные, но они могут повлечь значительные расходы машинного времени на безуспешные попытки транзакта войти в блок. Чтобы уменьшить частоту безуспешных попыток вхождения в блок, можно поместить транзакта в список пользователя, используя блоки LINK и UNLINK.

СЧА класса МВ не могут быть использованы для спецификации условий блокировки в блоке GATE. Для этого необходимо использовать блоки MATCH.

Когда транзакт не может войти в блок GATE, его индикатор задержки становится равным 1 и остается таким до тех пор, пока транзакт не войдет в блок TRANSFER в режиме SIM.

Блоки для обработки сообщений,
принадлежащих одному семейству

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

Блок TERMINATE является основным средством уничтожения сообщений и удаления их из модели. Для удаления сообщений, принадлежащих к одному семейству, может быть также использован блок ASSEMBLE.

Блоки MATCH и GATHER предназначены для управления движением сообщений, принадлежащих к одному семейству. Для управления такими транзактами используются блоки GATE и GATE NM.

Блок SPLIT

Блок SPLIT имеет следующий формат:

SPLIT <A>,[<B>],[<C>]

Блок SPLIT выполняет функцию копирования входящего в него транзакта, которое называется исходным или порождающим.

В поле А задается число создаваемых копий. Операнд А может быть именем, положительным целым, СЧА, СЧА*<параметр>. Если вычисленное значение аргумента поля А равно нулю, то блок SPLIT не выполняет никаких операций. После создания копий транзакт пытается перейти к следующему по номеру блоку. Все копии формируются в момент входа порождающего транзакта в блок SPLIT.

Поле В задает номер следующего блока, к которому переходят копии исходного транзакта, причем значение вычисляется для каждой копии отдельно. Операнд В может быть именем, положительным целым, СЧА, СЧА*<параметр>.

В поле С может быть задан номер параметра, используемого для присвоения копиям последовательных номеров. Операнд С может быть именем, положительным целым, СЧА, СЧА*<параметр>.

Если, например, задан параметр j, то j-му параметру исходного транзакта и n — копиям этого транзакта будут присвоены значения, как показано ниже.


Дата добавления: 2015-12-17; просмотров: 47; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!