или ALL для вывода всех находящихся в списке транзактов.
Операнды в полях D и E вместе со вспомогательным операндом X
определяют способ и условия вывода транзактов из списка пользовате-
ля. Если поля D и E пусты, то и операнд X не используется, а тран-
закты выводятся с начала списка пользователя. Если поле D содержит
ключевое слово BACK, то поле E и вспомогательный операнд X не
используются, а транзакты выводятся с конца списка. В остальных
случаях значение поля D интерпретируется как номер параметра тран-
зактов, находящихся в списке пользователя, а из списка выводится
заданное число тех транзактов, у которых значение этого параметра
по отношению к значению операнда в поле E удовлетворяет условию,
заданному вспомогательным операндом X. Операнд X принимает те же
значения, что и в блоке TEST.
В поле F указывается имя блока, куда переходит транзакт, выхо-
дящий из блока UNLINK, если из списка пользователя не выведен ни
один транзакт. Если это поле пусто, то выводящий транзакт переходит
в следующий блок независимо от количества выведенных транзактов.
Например, блок
UNLINK 5,NEXT,1
выводит из списка пользователя с номером 5 один транзакт с начала
списка и направляет его в блок с именем NEXT. Блок
UNLINK BUFER,ENT1,1,BACK
выводит из списка пользователя с именем BUFER один транзакт с конца
списка и направляет его в блок с именем ENT1. Блок
UNLINK E P$UCH,MET2,ALL,COND,P$COND,MET3
выводит из списка пользователя, номер которого записан в параметре
UCH выводящего транзакта, и направляет в блок с именем MET2 все
транзакты, содержимое параметра COND которых равно содержимому од-
ноименного параметра выводящего транзакта. Если таких транзактов в
списке не окажется, то выводящий транзакт будет направлен в блок с
именем MET3, в противном случае - к следующему блоку.
Следует отметить следующие особенности выполнения блока
UNLINK. Во-первых, если поля D и E содержат ссылки на СЧА транзак-
тов, то поле D вычисляется относительно транзактов в списке пользо-
вателя, а поле E - относительно активного транзакта. Во-вторых,
после вывода транзактов из списка симулятор продолжает или начинает
продвижение транзакта с наивысшим приоритетом, а при равенстве при-
оритетов отдает предпочтение транзакту-инициатору вывода.
Каждый список пользователя имеет следующие СЧА: CH - текущая
длина списка; CA - средняя длина списка (целая часть); CM - макси-
мальная длина списка; CC - общее число транзактов, вошедших в
список; CT - целая часть среднего времени пребывания транзакта в
списке.
Воспользуемся рассмотренными блоками для моделирования много-
канальной СМО с ожиданием транзактов в списке пользователя (рис.
17). Если МКУ с именем STO2 не заполнено, блок GATE впускает вновь
прибывший транзакт в блок ENTER, и в МКУ занимается один канал.
Если же МКУ заполнено, то блок GATE направляет транзакт в блок LINK
с именем WAIT, помещающий транзакт в конец списка пользователя с
именем BUFER, моделирующего очередь к МКУ. Каждый транзакт, покида-
ющий МКУ по завершении обслуживания и освобождающий один канал,
проходит блок UNLINK и выводит один транзакт с начала списка (если
список не пуст), направляя его в блок с именем ENT1 на занятие ка-
нала в МКУ.
STO2 STORAGE 2
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.85/.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,6.2/.999,7/.9998,8
GENERATE 100,FN$EXP
GATE SNF STO2,WAIT
ENT1 ENTER STO2
ADVANCE 160,FN$EXP
LEAVE STO2
UNLINK BUFER,ENT1,1
TERMINATE 1
WAIT LINK BUFER,FIFO
Рис. 17
Заметим, что для изменения дисциплины обслуживания на "позже
пришел - раньше обслужен" достаточно или заменить в поле B блока
LINK FIFO на LIFO, или записать в поле D блока UNLINK операнд BACK.
Следует также обратить внимание на то, что блоки QUEUE-DEPART для
сбора статистики об ожидающих транзактах не используются, так как
почти все те же данные можно получить из статистики о списке поль-
зователя.
Рассмотрим еще один пример, иллюстрирующий использование
списков пользователя для организации нестандартных дисциплин обслу-
живания. Пусть в одноканальной СМО с ожиданием требуется организо-
вать такую дисциплину, при которой приоритет отдается заявкам с на-
именьшим временем обслуживания. Такая модель будет иметь вид, пока-
занный на рис. 18.
В параметр TSRV поступающих в модель транзактов в блоке ASSIGN
записывается случайное время обслуживания, вычисляемое с использо-
ванием функции EXP. Если устройство SYSTEM свободно, то блок GATE
впускает транзакт в блок SEIZE, и устройство занимается на время
P$TSRV. Если же в момент поступления транзакта устройство занято,
то блок GATE направляет транзакт в блок LINK, который вводит тран-
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.85/.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,6.2/.999,7/.9998,8
GENERATE 100,FN$EXP
ASSIGN TSRV,80,EXP
GATE NU SYSTEM,WAIT
SFAC SEIZE SYSTEM
ADVANCE P$TSRV
RELEASE SYSTEM
UNLINK LINE,SFAC,1
TERMINATE 1
WAIT LINK LINE,P$TSRV
Рис. 18
закт в список пользователя LINE, упорядочивая транзакты по воз-
растанию времени обслуживания, записанного в параметре P$TSRV. Блок
UNLINK по освобождении устройства выводит с начала списка транзакт
с наименьшим временем обслуживания, обеспечивая тем самым заданную
дисциплину.
3. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ GPSS/PC
Для управления прогоном модели используются управляющие опера-
торы GPSS/PC. С одним из них - оператором START - мы уже сталкива-
лись при рассмотрении блока TERMINATE. Оператор START (начать) име-
ет следующий формат:
START A,B,C,D
Поле A содержит константу, задающую начальное значение счетчи-
ка завершений. В поле B может быть записано ключевое слово NP -
признак подавления формирования стандартного отчета по завершении
моделирования. Если поле B пусто, то по окончании прогона модели
формируется отчет со стандартной статистической информацией о всех
объектах модели (см. разд. 5). Поле C не используется и сохранено
для совместимости со старыми версиями GPSS. Поле D может содержать
1 для включения в отчет списков текущих и будущих событий. Если по-
ле D пусто, то выдача в отчет содержимого этих списков не произво-
дится.
Оператор SIMULATE (моделировать) устанавливает предел реально-
го времени, отводимого на прогон модели. Если прогон не завершится
до истечения этого времени, то он будет прерван принудительно с вы-
дачей накопленной статистики в отчет.
Оператор SIMULATE имеет единственный операнд A, содержащий
предельное время моделирования в минутах, задаваемое константой.
Оператор размещается перед оператором START, начинающим лимитиро-
ванный прогон.
Оператор RMULT (установить значения генераторов) позволяет пе-
ред началом прогона установить начальные значения генераторов слу-
чайных чисел RN, определяющие генерируемые ими последовательности.
Поля A-G оператора могут содержать начальные значения генераторов
соответственно RN1-RN7, задаваемые константами. Начальные значения
генераторов, не установленные операторами RMULT, совпадают с номе-
рами генераторов.
Оператор RESET (сбросить) сбрасывает всю статистическую инфор-
мацию, накопленную в процессе прогона модели. При этом состояние
аппаратных, динамических и запоминающих объектов, а также генерато-
ров случайных чисел сохраняется, и моделирование может быть возоб-
новлено с повторным сбором статистики. Оператор не имеет операндов.
С оператором RESET связано различие между относительным (СЧА
C1) и абсолютным (СЧА AC1) модельным временем. Таймер относительно-
го времени C1 измеряет модельное время, прошедшее после последнего
сброса статистики оператором RESET, а таймер абсолютного времени
AC1 - модельное время, прошедшее после начала первого прогона моде-
ли. Если не использовалось ни одного оператора RESET, то значения
этих таймеров совпадают. Оператор RESET устанавливает таймер C1 в
ноль и не влияет на таймер AC1.
Оператор RESET используется обычно при моделировании нестацио-
нарных процессов, когда требуется собрать статистику по отдельным
интервалам стационарности или исключить влияние переходного периода
на собираемую статистическую информацию.
Пусть, например, в модели, приведенной на рис. 18, необходимо
отбросить статистику, собираемую на первой тысяче транзактов. Это
может быть сделано способом, показанным на рис. 19.
Первый оператор START начинает прогон модели длиной 1000 тран-
зактов (переходный период). Поскольку статистика, накопленная на
этом периоде, не используется, в поле B оператора указан признак
подавления формирования отчета NP. Оператор RESET сбрасывает накоп-
ленную статистику, не изменяя состояния модели. Второй оператор
START начинает основной прогон модели с формированием отчета по за-
вершении прогона.
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.85/.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,6.2/.999,7/.9998,8
GENERATE 100,FN$EXP
ASSIGN TSRV,80,EXP
GATE NU SYSTEM,WAIT
SFAC SEIZE SYSTEM
ADVANCE P$TSRV
RELEASE SYSTEM
UNLINK LINE,SFAC,1
TERMINATE 1
WAIT LINK LINE,P$TSRV
START 1000,NP
RESET
START 10000
Рис. 19
Оператор CLEAR (очистить) очищает модель, подготавливая ее к
повторному прогону. При этом сбрасывается вся накопленная в преды-
дущем прогоне статистика, из модели удаляются все транзакты, и она
приводится к исходному состоянию, как перед первым прогоном. Уста-
навливаются в ноль сохраняемые величины и матрицы, что следует учи-
тывать при использовании этих объектов для хранения исходных дан-