46000 (665307), страница 4
Текст из файла (страница 4)
Оператор FUNCTION с такой таблицей, содержащей 24 точки для обеспе-
чения достаточной точности аппроксимации, имеет следующий вид:
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
Вычисление непрерывной функции производится следующим образом.
Сначала определяется интервал (Xi;Xi+1), на котором находится теку-
щее значение СЧА-аргумента (в нашем примере - сгенерированное зна-
чение RN1). Затем на этом интервале выполняется линейная интерполя-
ция с использованием соответствующих значений Yi и Yi+1. Результат
интерполяции усекается (отбрасыванием дробной части) и используется
в качестве значения функции. Если функция служит операндом B блоков
GENERATE или ADVANCE, то усечение результата производится только
после его умножения на значение операнда A.
Использование функций для получения случайных чисел с заданным
распределением дает хотя и менее точный результат за счет погреш-
ностей аппроксимации, но зато с меньшими вычислительными затратами
(несколько машинных операций на выполнение линейной интерполяции).
Чтобы к погрешности аппроксимации не добавлять слишком большую пог-
решность усечения, среднее значение при использовании показательных
распределений должно быть достаточно большим (не менее 50). Эта ре-
комендация относится и к использованию переменных.
Функции всех типов имеют единственный СЧА с названием FN, зна-
чением которого является вычисленное значение функции. Вычисление
функции производится при входе транзакта в блок, содержащий ссылку
на СЧА FN с именем функции.
Заменим в примере на рис. 4 переменные TARR и TSRV на функцию
EXP (рис. 5).
Поскольку в обеих моделях используется один и тот же генератор
RN1, интервалы поступления и задержки, вычисляемые в блоках
GENERATE и ADVANCE, должны получиться весьма близкими, а может быть
и идентичными. При большом количестве транзактов, пропускаемых че-
рез модель (десятки и сотни тысяч), разница в скорости вычислений
должна стать заметной.
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
ADVANCE 80,FN$EXP
TERMINATE 1
Рис. 5
Особенностью непрерывных функций является то, что они принима-
ют "непрерывные" (но только целочисленные) значения в диапазоне от
Y1 до Yn , где n - количество точек таблицы. В отличие от них диск-
ретные числовые функции, тип которых кодируется буквой D в операнде
B оператора определения функции, принимают только отдельные
(дискретные) значения, заданные координатами Yi в строках, следую-
щих за оператором определения FUNCTION. При вычислении дискретной
функции текущее значение СЧА-аргумента, указанного в поле A
оператора FUNCTION, сравнивается по условию <= последовательно со
всеми значениями упорядоченных по возрастанию координат Xi до
выполнения этого условия при некотором i. Значением функции ста-
новится целая часть соответствующего значения Yi.
Если последовательность значений аргумента таблицы с координа-
тами точек функции представляет числа натурального ряда
(1,2,3,...,n), то такую дискретную функцию с целью экономии памяти
и машинного времени удобно определить как списковую числовую функ-
цию (тип L).
Пусть в модели на рис. 5 заявки, моделируемые транзактами, с
равной вероятностью 1/3 должны относиться к одному из трех классов
(типов) 1,2 и 3, а среднее время задержки обслуживания заявок каж-
дого типа должно составлять соответственно 70, 80 и 90 единиц мо-
дельного времени. Это может быть обеспечено способом, показанным на
рис. 6.
В блоке ASSIGN в параметр TYPE каждого сгенерированного тран-
закта заносится тип заявки, получаемый с помощью дискретной функции
CLASS. Аргументом функции является генератор случайных чисел RN1, а
координаты ее таблицы представляют собой обратную функцию распреде-
ления дискретной случайной величины "класс заявки" с одинаковыми
вероятностями каждого из трех значений случайной величины.
Поле A блока ADVANCE содержит ссылку на списковую функцию
MEAN, аргументом которой служит параметр TYPE входящих в блок тран-
зактов. В зависимости от значений этого параметра (типа заявки)
среднее время задержки принимает одно из трех возможных значений
функции MEAN: 70, 80 или 90 единиц.
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
CLASS FUNCTION RN1,D3
.333,1/.667,2/1,3
MEAN FUNCTION P$TYPE,L3
1,70/2,80/3,90
GENERATE 100,FN$EXP
ASSIGN TYPE,FN$CLASS
ADVANCE FN$MEAN,FN$EXP
TERMINATE 1
Рис. 6
Следует отметить, что в данном примере можно было бы не
использовать параметр TYPE и обойтись одной дискретной функцией,
возвращающей с равной вероятностью одно из трех возможных значений
среднего времени задержки. Однако использование параметров дает не-
которые дополнительные возможности, которые будут рассмотрены поз-
же.
Транзакты могут входить в модель не только через блок
GENERATE, но и путем создания копий уже существующих транзактов в
блоке SPLIT (расщепить), имеющем следующий формат:
имя SPLIT A,B,C
В поле A задается число создаваемых копий исходного транзакта
(родителя), входящего в блок SPLIT. После выхода из блока SPLIT
транзакт-родитель направляется в следующий блок, а все транзак-
ты-потомки поступают в блок, указанный в поле B. Если поле B пусто,
то все копии поступают в следующий блок.
Транзакт-родитель и его потомки, выходящие из блока SPLIT, мо-
гут быть пронумерованы в параметре, имя или номер которого указаны
в поле C. Если у транзакта-родителя значение этого параметра при
входе в блок SPLIT было равно k, то при выходе из блока оно станет
равным k+1, а значения этого параметра у транзактов-потомков ока-
жутся равными k+2, k+3 и т.д.
Например, блок
SPLIT 5,MET1,NUM
создает пять копий исходного транзакта и направляет их в блок с
именем MET1. Транзакт-родитель и потомки нумеруются в параметре с
именем NUM. Если, например, перед входом в блок значение этого па-
раметра у транзакта-родителя было равно 0, то при выходе из блока
оно станет равным 1, а у транзактов-потомков значения параметра NUM
будут равны 2, 3, 4, 5 и 6.
2.2. Блоки, связанные с аппаратными объектами
Все примеры моделей, рассматривавшиеся выше, пока еще не явля-
ются моделями систем массового обслуживания, так как в них не учте-
на основная особенность СМО: конкуренция заявок на использование
некоторых ограниченных ресурсов системы. Все транзакты, входящие в
эти модели через блок GENERATE, немедленно получают возможность
"обслуживания" в блоке ADVANCE, который никогда не "отказывает"
транзактам во входе, сколько бы транзактов в нем не находилось.
Для моделирования ограниченных ресурсов СМО в модели должны
присутствовать аппаратные объекты: одноканальные или многоканальные
устройства. Одноканальные устройства создаются в текущей модели при
использовании блоков SEIZE (занять) и RELEASE (освободить), име-
ющих следующий формат:
имя SEIZE A
имя RELEASE A
В поле A указывается номер или имя устройства. Если транзакт
входит в блок SEIZE, то устройство, указанное в поле A, становится
занятым и остаётся в этом состоянии до тех пор, пока этот же тран-
закт не пройдёт соответствующий блок RELEASE, освобождая уст-
ройство. Если устройство, указанное в поле A блока SEIZE, уже заня-
то каким-либо транзактом, то никакой другой транзакт не может войти
в этот блок и остаётся в предыдущем блоке. Транзакты, задержанные
(заблокированные) перед блоком SEIZE, остаются в списке текущих со-
бытий и при освобождении устройства обрабатываются с учетом приори-
тетов и очередности поступления.
Каждое устройство имеет следующие СЧА: F - состояние уст-
ройства (0 - свободно,1 - занято); FR - коэффициент использования в
долях 1000; FC - число занятий устройства; FT - целая часть средне-
го времени занятия устройства.
Воспользуемся блоками SEIZE и RELEASE для моделирования одно-
канальной СМО с ожиданием (рис. 7). Теперь блок ADVANCE находится
между блоками SEIZE и RELEASE, моделирующими занятие и освобождение
устройства с именем SYSTEM, и поэтому в нем может находиться только
один транзакт. Транзакты, выходящие из блока GENERATE в моменты за-
нятости устройства, не смогут войти в блок SEIZE и будут оставаться
в блоке GENERATE, образуя очередь в списке текущих событий.
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
SEIZE SYSTEM
ADVANCE 80,FN$EXP
RELEASE SYSTEM
TERMINATE 1
Рис. 7
Для моделирования захвата (прерывания) одноканального уст-
ройства вместо блоков SEIZE и RELEASE используются соответственно
блоки PREEMPT (захватить) и RETURN (вернуть). Блок PREEMPT имеет
следующий формат:
имя PREEMPT A,B,C,D,E
В поле A указывается имя или номер устройства, подлежащего
захвату. В поле B кодируется условие захвата. Если это поле пусто,
то захват возникает, если обслуживаемый транзакт сам не является
захватчиком. Если же в поле B записан операнд PR, то захват возни-
кает, если приоритет транзакта-захватчика выше, чем приоритет
обслуживаемого транзакта.
Поля C, D и E определяют поведение транзактов, обслуживание
которых было прервано. Поле C указывает имя блока, в который будет
направлен прерванный транзакт. В поле D может быть указан номер или
имя параметра прерванного транзакта, в который записывается время,
оставшееся этому транзакту до завершения обслуживания на уст-
ройстве. При отсутствии операнда в поле E прерванный транзакт сох-
раняет право на автоматическое восстановление на устройстве по
окончании захвата. Если же в поле E указан операнд RE, то транзакт
теряет такое право.
Блок RETURN имеет единственный операнд A, содержащий имя или
номер устройства, подлежащего освобождению от захвата.
Блоки PREEMPT и RETURN могут быть использованы для моделирова-
ния СМО с абсолютными приоритетами. В простейших случаях, при одном
уровне захвата, в блоке PREEMPT используется единственный операнд
A. При этом прерванный транзакт переводится симулятором из списка
будущих событий в так называемый список прерываний устройства, а
по окончании захвата устройства возвращается в список будущих собы-
тий с предварительно вычисленным временем занятия устройства для
продолжения обслуживания.
Для создания в модели многоканальных устройств (МКУ) они долж-
ны быть предварительно определены с помощью операторов определения
STORAGE (память), имеющих следующий формат:
имя STORAGE A
Здесь имя - имя МКУ, используемое для ссылок на него; A – емко-
cть (количество каналов обслуживания) МКУ, задаваемая константой.
Для занятия и освобождения каналов обслуживания МКУ использу-
ется пара блоков ENTER (войти) и LEAVE (покинуть), имеющих следую-
щий формат:
имя ENTER A,B
имя LEAVE A,B
В поле A указывается номер или имя МКУ, в поле B число кана-
лов МКУ, занимаемых при входе в блок ENTER или освобождаемых при
входе в блок LEAVE. Обычно поле B пусто, и в этом случае по умолча-
нию занимается или освобождается один канал.
При входе транзакта в блок ENTER текущее содержимое МКУ увели-
чивается на число единиц, указанное в поле B . Если свободная
емкость МКУ меньше значения поля B, то транзакт не может войти в
блок ENTER и остается в предыдущем блоке, образуя очередь в списке
текущих событий.
При входе транзакта в блок LEAVE текущее содержимое МКУ умень-
шается на число единиц, указанное в поле B. Не обязательно освобож-
дается такое же число каналов МКУ, какое занималось при входе дан-
ного транзакта в блок ENTER, однако текущее содержимое МКУ не долж-
но становиться отрицательным.
Многоканальные устройства имеют следующие СЧА: S - текущее со-
держимое МКУ; R - свободная емкость МКУ; SR - коэффициент использо-
вания в долях 1000; SA - целая часть среднего содержимого МКУ; SM -
максимальное содержимое МКУ; SC - число занятий МКУ; ST - целая
часть среднего времени занятия МКУ.
Воспользуемся блоками ENTER-LEAVE и оператором STORAGE для мо-
делирования двухканальной СМО с ожиданием (рис. 8). Если текущее
содержимое МКУ с именем STO2 меньше 2, т.е. в блоке ADVANCE нахо-
дится один или ни одного транзакта, то очередной транзакт, поступа-
ющий в модель через блок GENERATE, может войти в блок ENTER и затем
в блок ADVANCE. Если же текущее содержимое МКУ равно 2, то очеред-
ной транзакт остается в блоке GENERATE, образуя очередь в списке
текущих событий. По истечении задержки одного из двух обслуживаемых
транзактов в блоке ADVANCE и после входа его в блок LEAVE первый из
заблокированных транзактов сможет войти в блок ENTER.
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
ENTER STO2
ADVANCE 160,FN$EXP
LEAVE STO2
TERMINATE 1
Рис. 8
К аппаратным объектам относятся также логические переключатели
(ЛП), которые могут находиться в двух состояниях: "включено" и
"выключено". В начале моделирования все ЛП находятся в состоянии
"выключено". Отдельные переключатели могут быть установлены в на-
чальное состояние "включено" с помощью оператора INITIAL (инициали-
зировать), имеющего следующий формат:
INITIAL LS$ имя
INITIAL LS j
Здесь имя и j - соответственно имя и номер ЛП, устанавливаемого в
начальное состояние "включено".
Для включения, выключения и инвертирования логических переклю-
чателей в процессе моделирования служит блок LOGIC (установить ЛП),
имеющий следующий формат:
имя LOGIC X A
В поле A указывается имя или номер ЛП. Вспомогательный операнд
X указывает вид операции, которая производится с логическим перек-
лючателем при входе транзакта в блок: S - включение, R - выключе-
ние, I - инвертирование. Например:
LOGIC S 9
LOGIC R FLAG
Логические переключатели имеют единственный СЧА с названием
LS. Значение СЧА равно 1, если ЛП включен, и 0, если он выключен.
2.3. Блоки для сбора статистических данных
Два последних примера в предыдущем параграфе представляют со-
бой законченные модели одноканальной и многоканальной СМО с ожида-
нием. Однако такие модели разрабатываются обычно для исследования
различных характеристик, связанных с ожиданием заявок в очереди:
длины очереди, времени ожидания и т.п., а в приведенных примерах
очередь транзактов образуется в списке текущих событий и недоступна
исследователю. Для регистрации статистической информации о процессе
ожидания транзактов в модели должны присутствовать статистические
объекты: очереди или таблицы.
Объекты типа очередь создаются в модели путем использования
блоков - регистраторов очередей: QUEUE (стать в очередь) и DEPART
(уйти из очереди), имеющих следующий формат:
имя 0QUEUE A,B
имя DEPART A,B
В поле A указывается номер или имя очереди, а в поле B - число
единиц, на которое текущая длина очереди увеличивается при входе
транзакта в блок QUEUE или уменьшается при входе транзакта в блок
DEPART. Обычно поле B пусто, и в этом случае его значение по умол-
чанию принимается равным 1.
Для сбора статистики о транзактах, заблокированных перед ка-
ким-либо блоком модели, блоки QUEUE и DEPART помещаются перед и
после этого блока соответственно. При прохождении транзактов через
блоки QUEUE и DEPART соответствующим образом изменяются следующие
СЧА очередей: Q - текущая длина очереди; QM - максимальная длина
очереди; QA - целая часть средней длины очереди; QC - общее число
транзактов, вошедших в очередь; QZ - число транзактов, прошедших
через очередь без ожидания (число "нулевых" входов); QT - целая
часть среднего времени ожидания с учетом "нулевых" входов; QX - це-
лая часть среднего времени ожидания без учета "нулевых" входов.
Дополним приведенную на рис. 7 модель одноканальной СМО блока-
ми QUEUE и DEPART (рис. 9). Теперь транзакты, заблокированные перед
блоком SEIZE из-за занятости устройства SYSTEM, находятся в блоке
QUEUE, внося свой вклад в статистику о времени ожидания, накаплива-
емую в статистическом объекте типа "очередь" с именем LINE. При
освобождении устройства первый из заблокированных транзактов войдет
в блок SEIZE и одновременно в блок DEPART, прекращая накопление
статистики об ожидании этого транзакта.
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
QUEUE LINE
SEIZE SYSTEM
DEPART LINE
ADVANCE 80,FN$EXP
RELEASE SYSTEM
TERMINATE 1
Рис. 9
Очень часто исследователя интересует не только среднее значе-
ние времени ожидания в очереди, но и дисперсия этого времени, а
также статистическое распределение выборки времени ожидания,
представляемое обычно графически в виде гистограммы. Имея такое
распределение, можно оценить вероятность того, что время ожидания
превысит или не превысит некоторое заданное значение. Для сбора и
обработки данных о выборочном распределении времени ожидания в оче-
реди служат статистические объекты типа Q-таблица.
Для создания в модели такой таблицы она должна быть предвари-
тельно определена с помощью оператора определения QTABLE (Q-табли-
ца), имеющего следующий формат:
имя QTABLE A,B,C,D
Здесь имя - имя таблицы, используемое для ссылок на нее; A - номер
или имя очереди, распределение времени ожидания в которой необходи-
мо получить; B - верхняя граница первого частотного интервала таб-
лицы; C - ширина частотных интервалов; D - количество частотных ин-
тервалов.
Диапазон всевозможных значений времени ожидания в очереди,
указанной в поле A, разбивается на ряд частотных интервалов, коли-
чество которых указано в поле D. Первый из этих интервалов имеет
ширину от минус бесконечности до величины, указанной в поле B,
включительно. Второй интервал включает значения, большие, чем вели-
чина первой границы в поле B, но меньшие или равные B+C, и т.д. Все
промежуточные интервалы имеют одинаковую ширину, указанную в поле
C. Наконец, последний интервал включает все значения, большие, чем
последняя граница. Значения операндов B, C и D должны задаваться
целыми константами. Операнд B может быть неположительным, хотя для
Q-таблицы это не имеет смысла, так как время не может быть отрица-
тельным. Операнды C и D должны быть строго положительными.
При прохождении транзакта через блоки QUEUE и DEPART его время
ожидания фиксируется, и к счетчику частотного интервала таблицы, в
который попало это время, добавляется 1. Одновременно в таблице на-
капливается информация для вычисления среднего значения и средне-
квадратического отклонения (корня из дисперсии) времени ожидания.
По окончании моделирования среднее значение и среднеквадратическое
отклонение времени ожидания, а также счетчики попаданий в различные
частотные интервалы выводятся в стандартный отчет GPSS/PC.
Таблицы, как и другие объекты GPSS/PC, имеют СЧА: ТС - общее
число транзактов, вошедших в очередь, связанную с таблицей; TB -
целая часть среднего времени ожидания в очереди; TD - целая часть
среднеквадратического отклонения времени ожидания в очереди.
Дополним модель из примера на рис. 9 оператором QTABLE для по-
лучения распределения времени ожидания в очереди с именем LINE
(рис. 10).
WTIME QTABLE LINE,50,50,10
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
QUEUE LINE
SEIZE SYSTEM
DEPART LINE
ADVANCE 80,FN$EXP
RELEASE SYSTEM
TERMINATE 1
Рис. 10
Оператор определения таблицы с именем WTIME разбивает ось вре-
мени на 10 частотных интервалов. Первый интервал включает значения
от 0 до 50, второй - от 50 до 100, третий - от 100 до 150 и т.д.
Последний, десятый, интервал включает значения, превышающие 450.
Если, например, время ожидания некоторого транзакта в очереди
составило 145 единиц модельного времени, то к счетчику третьего
частотного интервала будет добавлена 1. Следует заметить, что ин-
формация в таблицу с именем WTIME заносится автоматически, при вхо-
де транзактов в блоки QUEUE и DEPART, и никаких специальных мер для
этого принимать не требуется.
Таблицы в GPSS/PC могут использоваться в более общем случае не
только для табулирования времени ожидания в очереди, но и для полу-
чения выборочных распределений произвольных СЧА любых объектов мо-
дели. Для определения таблиц служит оператор TABLE (таблица), фор-
мат которого совпадает с форматом оператора QTABLE. Отличие состоит
лишь в том, что в поле A оператора TABLE записывается стандартный
числовой атрибут, выборочное распределение которого необходимо по-
лучить, а операнды B, C и D определяют разбиение на частотные ин-
тервалы диапазона всевозможных значений этого СЧА.
Занесение информации в таблицу, определяемую оператором TABLE,
уже не может быть выполнено симулятором автоматически, как в случае
Q-таблиц. Для этого используется специальный блок TABULATE (табули-
ровать), имеющий следующий формат:
имя TABULATE A
В поле A указывается номер или имя таблицы, определенной соот-
ветствующим оператором TABLE.
При входе транзакта в блок TABULATE текущее значение табулиру-
емого аргумента таблицы, указанного в поле A оператора TABLE, за-
носится в нее в соответствии с заданным в операторе TABLE разбиени-
ем области значений аргумента на частотные интервалы. Одновременно
корректируются текущие значения СЧА таблицы: счетчик входов в таб-
лицу TC, среднее время ожидания TB и среднеквадратическое отклоне-
ние времени ожидания TD.
Пусть, например, в модели многоканальной СМО, приведенной на
рис. 8, надо получить распределение времени пребывания заявок в
системе, включающего время ожидания в очереди и время обслуживания.
Это может быть обеспечено способом, показанным на рис. 11.
Оператор TABLE определяет таблицу с именем TTIME, аргументом
которой служит СЧА М1 - время пребывания транзакта в модели. В
рассматриваемой модели значение СЧА M1 одновременно будет являться
временем пребывания транзакта в СМО в том случае, если занесение
информации в таблицу производить перед выходом транзакта из модели.
Поэтому блок TABULATE, заносящий информацию о времени пребывания
каждого транзакта в модели в таблицу TTIME, располагается перед
блоком TERMINATE. Диапазон возможных значений времени пребывания
транзакта в модели разбит в операторе TABLE на 12 частотных интер-
валов, ширина которых (кроме последнего) равна 100 единицам модель-
ного времени.
TTIME TABLE M1,100,100,12
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
ENTER STO2
ADVANCE 160,FN$EXP
LEAVE STO2
TABULATE TTIME
TERMINATE 1
Рис. 11
2.4. Блоки, изменяющие маршруты транзактов
В приведенных выше примерах транзакты, выходящие из любого
блока, всегда поступали в следующий блок. В более сложных моделях
возникает необходимость направления транзактов к другим блокам в
зависимости от некоторых условий. Эту возможность обеспечивают бло-
ки изменения маршрутов транзактов.
Блок TRANSFER (передать) служит для передачи входящих в него
транзактов в блоки, отличные от следующего. Блок имеет девять режи-
мов работы, из которых рассмотрим здесь лишь три наиболее часто
используемых. В этих трех режимах блок имеет следующий формат:
имя TRANSFER A,B,C
Смысл операндов в полях A, B и C зависит от режима работы блока.
В режиме безусловной передачи поля A и C пусты, а в поле B
указывается имя блока, к которому безусловным образом направляется
транзакт, вошедший в блок TRANSFER. Например:
TRANSFER ,FINAL
В режиме статистической передачи операнд A определяет вероят-
ность, с которой транзакт направляется в блок, указанный в поле C.
С вероятностью 1-A транзакт направляется в блок, указанный в поле B
(в следующий, если поле B пусто).
Вероятность в поле A может быть задана непосредственно деся-
тичной дробью, начинающейся с точки. Например, блок
TRANSFER .75,THIS,THAT
с вероятностью 0,75 направляет транзакты в блок с именем THAT, а с
вероятностью 0,25 - в блок с именем THIS.
Если же поле A начинается не с десятичной точки и не содержит
одного из ключевых слов - признаков других режимов работы блока, то
его значение рассматривается как количество тысячных долей в веро-
ятности передачи. Например, предыдущий блок TRANSFER можно записать
также в следующем виде:
TRANSFER 750,THIS,THAT
В режиме логической передачи в поле A записывается ключевое
слово BOTH (оба). Транзакт, поступающий в блок TRANSFER, сначала
пытается войти в блок, указанный в поле B (или в следующий блок,
если поле B пусто), а если это не удается, т.е. блок B отказывает
транзакту во входе, то в блок, указанный в поле C. Если и эта по-
пытка неудачна, то транзакт задерживается в блоке TRANSFER до изме-
нения условий в модели, делающего возможным вход в один из блоков B
или C, причем при одновременно возникшей возможности предпочтение
отдается блоку B. Например:
TRANSFER BOTH,MET1,MET2
Блок TEST (проверить) служит для задержки или изменения марш-
рутов транзактов в зависимости от соотношения двух СЧА. Он имеет
следующий формат:
имя TEST X A,B,C
Вспомогательный операнд X содержит условие проверки соотноше-
ния между СЧА и может принимать следующие значения: L (меньше); LE
(меньше или равно); E (равно); NE (не равно); GE (больше или рав-
но); G (больше). Поле A содержит первый, а поле B - второй из срав-
ниваемых СЧА. Если проверяемое условие A X B выполняется, то блок
TEST пропускает транзакт в следующий блок. Если же это условие не
выполняется, то транзакт переходит к блоку, указанному в поле C, а
если оно пусто, то задерживается перед блоком TEST.
Например, блок
TEST LE P$TIME,C1
не впускает транзакты, у которых значение параметра с именем TIME
больше текущего модельного времени. Блок
TEST L Q$LINE,5,OUT
направляет транзакты в блок с именем OUT, если текущая длина очере-
ди LINE больше либо равна 5.
Для задержки или изменения маршрута транзактов в зависимости
от состояния аппаратных объектов модели служит блок GATE
(впустить), имеющий следующий формат:
имя GATE X A,B
Вспомогательный операнд X содержит код состояния проверяемого
аппаратного объекта, а в поле A указывается имя или номер этого
объекта. Если проверяемый объект находится в заданном состоянии, то
блок GATE пропускает транзакт к следующему блоку. Если же заданное
в блоке условие не выполняется, то транзакт переходит к блоку, ука-
занному в поле B, а если это поле пусто, то задерживается перед
блоком GATE.
Операнд X может принимать следующие значения: U (устройство
занято); NU (устройство свободно); I (устройство захвачено); NI
(устройство не захвачено); SE (МКУ пусто); SNE (МКУ не пусто); SF
(МКУ заполнено); SNF (МКУ не заполнено); LS (ЛП включен), LR (ЛП
выключен).
Например, блок
GATE SNE BUF3
отказывает во входе транзактам, поступающим в моменты, когда в МКУ
с именем BUF3 все каналы обслуживания свободны. Блок
GATE LR 4,BLOK2
направляет транзакты в блок с именем BLOK2, если в момент их
поступления ЛП с номером 4 включен.
Блоки рассматриваемой группы используются при моделировании
различных СМО с потерями заявок. Воспользуемся, например, блоками
TRANSFER для моделирования двухканальной СМО с отказами и повторны-
ми попытками (рис. 12).
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
ENT1 TRANSFER BOTH,,REFUS
ENTER STO2
ADVANCE 160,FN$EXP
LEAVE STO2
TERMINATE 1
REFUS TRANSFER .1,,OUT
ADVANCE 250,FN$EXP
TRANSFER ,ENT1
OUT TERMINATE 1
Рис. 12
Транзакты, поступающие в модель, попадают в блок TRANSFER с
именем ENT1, работающий в логическом режиме. Если в момент поступ-
ления транзакта в МКУ STO2 хотя бы один канал свободен, то блок
TRANSFER направит транзакт в следующий блок, т.е. в блок ENTER.
Если же в момент поступления оба канала МКУ заняты, и поэтому блок
ENTER отказывает во входе, то транзакт будет направлен в блок
TRANSFER с именем REFUS, работающий в статистическом режиме. С ве-
роятностью 0,9 транзакты из этого блока передаются в следующий
блок, задерживаются в нем на случайное время и с помощью блока
TRANSFER, работающего в безусловном режиме, передаются вновь на
вход модели в блок с именем ENT1. С вероятностью 0,1 транзакты из
блока с именем REFUS передаются в блок TERMINATE с именем OUT для
уничтожения.
Следует заметить, что для уничтожения транзактов, получивших
отказ в обслуживании, понадобился отдельный блок TERMINATE для
фиксации в стандартном отчете количества потерянных транзактов с
помощью счетчика блока с именем OUT (СЧА N$OUT).
Для моделирования той же СМО может быть использован также блок
TEST (рис. 13). В этом варианте модели транзакт проходит в блок
ENTER, если текущее число занятых каналов (СЧА S$STO2) меньше 2.
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
ENT1 TEST L S$STO2,2,REFUS
ENTER STO2
ADVANCE 160,FN$EXP
LEAVE STO2
TERMINATE 1
REFUS TRANSFER .1,,OUT
ADVANCE 250,FN$EXP
TRANSFER ,ENT1
OUT TERMINATE 1
Рис. 13
При использовании блока GATE модель принимает вид, показанный
на рис. 14. В этом варианте транзакт проходит в блок ENTER, если
условие "МКУ STO2 не заполнено" истинно.
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
ENT1 GATE SNF STO2,REFUS
ENTER STO2
ADVANCE 160,FN$EXP
LEAVE STO2
TERMINATE 1
REFUS TRANSFER .1,,OUT
ADVANCE 250,FN$EXP
TRANSFER ,ENT1
OUT TERMINATE 1
Рис. 14
2.5. Блоки, работающие с памятью
Для хранения в памяти отдельных числовых значений и массивов
таких значений используются сохраняемые величины и матрицы сохраня-
емых величин.
Сохраняемые величины могут использоваться в модели для хране-
ния исходных данных, которые надо изменять при различных прогонах
модели, промежуточных значений и результатов моделирования. В нача-
ле моделирования все сохраняемые величины устанавливаются равными
0. Для установки отличных от 0 начальных значений сохраняемых вели-
чин используется оператор INITIAL, имеющий следующий формат:
INITIAL X$ имя,значение
INITIAL Xj ,значение
Здесь имя и j - соответственно имя и номер сохраняемой величины, а
значение - присваиваемое ей начальное значение (константа).
Для изменения сохраняемых величин в процессе моделирования
служит блок SAVEVALUE (сохранить величину), имеющий следующий фор-
мат:
имя SAVEVALUE A,B
В поле A указывается номер или имя сохраняемой величины, в которую
записывается значение операнда B. Если в поле A после имени (номера)
сохраняемой величины стоит знак + или -, то значение операнда B
добавляется или вычитается из текущего содержимого сохраняемой
величины. Например:
SAVEVALUE 5,Q$LINE
SAVEVALUE NREF+,1
Сохраняемые величины имеют единственный СЧА с названием X,
значением которого является текущее значение соответствующей сохра-
няемой величины.
Изменим пример на рис. 14 таким образом, чтобы исходные данные
модели (средний интервал поступления транзактов и среднее время
обслуживания) были заданы сохраняемыми величинами, а результат мо-
делирования (количество потерянных транзактов) фиксировался также в
сохраняемой величине. Такая модель будет иметь вид, показанный на
рис. 15.
Матрицы сохраняемых величин дают возможность упорядочить сох-
раняемые значения в виде матриц m*n, где m - число строк, n - число
столбцов матрицы. Каждая матрица должна быть перед началом модели-
рования определена с помощью оператора MATRIX (определить матрицу),
имеющего следующий формат:
имя MATRIX A,B,C
Поле A оператора не используется и сохранено в GPSS/PC для
совместимости со старыми версиями GPSS. В полях B и C указываются
соответственно число строк и столбцов матрицы, задаваемые констан-
тами, причем общее число элементов, равное произведению B на C, не
должно превышать 8191. Например, оператор
MTAB MATRIX ,10,2
определяет матрицу с именем MTAB, содержащую десять строк и два
столбца.
INITIAL X$TARR,100
INITIAL X$TSRV,160
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 X$TARR,FN$EXP
ENT1 GATE SNF STO2,REFUS
ENTER STO2
ADVANCE X$TSRV,FN$EXP
LEAVE STO2
OUT TERMINATE 1
REFUS TRANSFER .1,,COUT
ADVANCE 250,FN$EXP
TRANSFER ,ENT1
COUT SAVEVALUE NREF+,1
TRANSFER ,OUT
Рис. 15
В начале моделирования элементы всех определенных матриц уста-
навливаются равными 0. Для установки отличных от 0 начальных значе-
ний отдельных элементов матриц используется оператор INITIAL, имею-
щий следующий формат:
INITIAL MX$ имя (a,b),значение
INITIAL MXj (a,b),значение
Здесь имя и j - соответственно имя и номер матрицы; a и b - номера
соответственно строки и столбца, задаваемые константами; значение -
присваиваемое элементу матрицы начальное значение, задаваемое также
константой.
Для изменения значений элементов матриц в процессе моделирова-
ния служит блок MSAVEVALUE (сохранить значение элемента матрицы),
имеющий следующий формат:
имя MSAVEVALUE A,B,C,D
В поле A указывается имя или номер матрицы, после которого,
как и в блоке SAVEVALUE, может стоять знак + или -. В полях B и C
указываются номера соответственно строки и столбца, определяющие
изменяемый элемент матрицы. В поле D указывается величина, исполь-
зуемая для изменения заданного элемента матрицы. Например:
MSAVEVALUE 5,3,2,X1
MSAVEVALUE MTAB+,P$ROW,P$COL,1
Матрицы имеют единственный СЧА с названием MX, ссылка на кото-
рый записывается в следующем виде:
MX$ имя (a,b)
MXj (a,b)
Здесь имя и j - соответственно имя и номер матрицы; a и b - номера
соответственно строки и столбца, задаваемые константами или ссылка-
ми на СЧА параметров транзактов. Например:
MX5(2,1)
MX$MTAB(P$ROW,P$COL)
2.6. Блоки для работы со списками пользователя
Так как заблокированные транзакты находятся в списке текущих
событий, то при большом количестве таких транзактов симулятор
расходует слишком много времени на просмотр этого списка с целью
выбора очередного транзакта для продвижения. Для экономии машинного
времени заблокированные транзакты целесообразно помещать в так на-
зываемые списки пользователя и оставлять их там до тех пор, пока не
выполнятся условия, позволяюшие дальнейшее продвижение этих тран-
зактов. Кроме того, размещение ожидающих транзактов в списках поль-
зователя позволяет организовать различные дисциплины очередей, от-
личные от дисциплины "раньше пришел - раньше обслужен", реализован-
ной в списке текущих событий.
Списки пользователя представляют собой некоторые буферы, куда
могут временно помещаться транзакты, выведенные из списка текущих
событий. В отличие от списков текущих и будущих событий транзакты
вводятся в списки пользователя и выводятся из них не автоматически,
а в соответствии с логикой модели с помощью специальных блоков.
Для ввода транзактов в список пользователя служит блок LINK
(ввести в список), который может быть использован в двух режимах:
условном и безусловном. Ограничимся рассмотрением лишь безусловного
режима, в котором блок LINK имеет следующий формат:
имя LINK A,B
В поле A задается имя или номер списка пользователя, в который
безусловным образом помещается транзакт, вошедший в блок. Поле B
определяет, в какое место списка пользователя следует поместить
этот транзакт. Если в поле B записано ключевое слово FIFO, то тран-
закт помещается в конец списка, если LIFO - в начало списка. В дру-
гих случаях транзакты упорядочиваются в соответствии с вычисленным
значением поля B, где обычно записывается один из СЧА транзактов,
таких как PR, M1 или P. Если поле B содержит СЧА PR, то транзакты
упорядочиваются по убыванию приоритета. В остальных случаях произ-
водится упорядочение по возрастанию указанного СЧА.
Например, блок
LINK 5,FIFO
помещает транзакты в список пользователя с номером 5 в порядке их
поступления в блок. Блок
LINK BUFER,P$ORDER
помещает транзакты в список пользователя с именем BUFER, упорядочи-
вая их по возрастанию параметра с именем ORDER.
Условия, при которых транзакт помещается в список пользовате-
ля, в безусловном режиме проверяются средствами, предусмотренными
разработчиком модели. Например, направить транзакт в список пользо-
вателя в случае занятости устройства можно так, как показано на
рис. 16. Если устройство с именем FAC4 занято, то блок GATE не
впускает транзакт в блок SEIZE, а направляет его в блок LINK с име-
нем WAIT, и транзакт вводится в конец списка пользователя с именем
BUFER.
....................
GATE NU FAC4,WAIT
SEIZE FAC4
....................
WAIT LINK BUFER,FIFO
....................
Рис. 16
Для вывода одного или нескольких транзактов из списка пользо-
вателя и помещения их обратно в список текущих событий служит блок
UNLINK (вывести из списка), имеющий следующий формат:
имя UNLINK X A,B,C,D,E,F
В поле A указывается имя или номер списка пользователя. Поле B
содержит имя блока, в который переходят выведенные из списка поль-
зователя транзакты. В поле C указывается число выводимых транзактов
или 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 (очистить) очищает модель, подготавливая ее к
повторному прогону. При этом сбрасывается вся накопленная в преды-
дущем прогоне статистика, из модели удаляются все транзакты, и она
приводится к исходному состоянию, как перед первым прогоном. Уста-
навливаются в ноль сохраняемые величины и матрицы, что следует учи-
тывать при использовании этих объектов для хранения исходных дан-
ных. Исключение составляют генераторы случайных чисел, которые не
возвращаются к своим начальным значениям, что позволяет повторить
прогон модели на новой последовательности случайных чисел. Оператор
не имеет операндов.
Оператор CLEAR используется обычно для организации нескольких
независимых прогонов модели на разных последовательностях случайных
чисел. Перед повторением прогона можно при необходимости переопре-
делить отдельные объекты модели, например емкости многоканальных
устройств.
Пусть, например, требуется повторить прогон модели, приведен-
ной на рис. 17, три раза при емкости МКУ, равной 1, 2 и 3. Это мо-
жет быть выполнено так, как показано на рис. 20. После каждой
очистки модели оператором CLEAR оператор STORAGE устанавливает но-
вое значение емкости МКУ с именем STO2.
Оператор END (закончить) завершает сеанс 0работы с GPSS/PC и
возвращает управление в операционную систему. Оператор не имеет
операндов.
STO2 STORAGE 1
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
START 10000
CLEAR
STO2 STORAGE 2
START 10000
CLEAR
STO2 STORAGE 3
START 10000
Рис. 20
Как правило, управляющие операторы не включаются в исходную
программу, т.е. не имеют номеров строк, а вводятся пользователем
непосредственно с клавиатуры ПК.
4. НЕКОТОРЫЕ ПРИЕМЫ КОНСТРУИРОВАНИЯ GPSS-МОДЕЛЕЙ
4.1. Косвенная адресация
В рассматривавшихся до сих пор примерах моделей ссылки на раз-
личные объекты GPSS/PC производились исключительно по данным им
произвольным именам. Такая адресация объектов удобна, когда речь
идет о небольшом числе объектов каждого типа. Если же число объек-
тов некоторого типа велико, то во избежание пропорционального роста
количества блоков в модели используют ссылки на эти объекты по их
номерам с использованием так называемой косвенной адресации.
Идея косвенной адресации заключается в том, что каждый тран-
закт в некотором своем параметре содержит номер того или иного объ-
екта, а в полях блоков, адресующихся к объектам, записывается ссыл-
ка на этот параметр транзакта. Проиллюстрируем применение косвенной
адресации на примере следующей модели.
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
CLASS FUNCTION RN1,D3
.333,1/.667,2/1,3
MEAN FUNCTION P$TYPE,L3
1,70/2,80/3,90
PRIOT VARIABLE 4-P$TYPE
STO2 STORAGE 2
WTIME QTABLE LINE,50,50,10
TTIME TABLE M1,100,100,12
GENERATE 100,FN$EXP
ASSIGN TYPE,FN$CLASS
PRIORITY V$PRIOT
QUEUE LINE
QUEUE P$TYPE
ENTER STO2
DEPART P$TYPE
DEPART LINE
ADVANCE FN$MEAN,FN$EXP
LEAVE STO2
TABULATE TTIME
TERMINATE 1
Рис. 21
Пусть на вход моделируемой многоканальной СМО с двумя каналами
обслуживания поступает пуассоновский поток заявок со средним интер-
валом поступления 100 единиц модельного времени. Каждая заявка с
равной вероятностью 1/3 относится к одному из трех классов: 1, 2
или 3, а среднее время обслуживания заявок каждого типа составляет
соответственно 70, 80 и 90 единиц модельного времени. Чем меньше
среднее время обслуживания заявки, тем выше ее приоритет. Необходи-
мо построить модель, позволяющую оценить средние значения времени
ожидания заявок каждого типа, а также распределения общего времени
ожидания в очереди и общего времени пребывания в системе. Такая мо-
дель имеет вид, показанный на рис. 21.
Переменная PRIOT служит для вычисления приоритета транзакта
как функции его класса, содержащегося в параметре с именем TYPE.
Транзакты класса 1 (P$TYPE=1) получат приоритет 3, транзакты класса
2 - приоритет 2 и транзакты класса 3 - приоритет 1.
В блоке ASSIGN в параметр TYPE транзактов записывается класс
заявки, разыгрываемый с помощью функции CLASS. В следующем блоке
PRIORITY с помощью переменной PRIOT определяется приоритет транзак-
тов, первоначально равный 0 (отсутствует поле E в блоке GENERATE).
Далее каждый транзакт "отмечается" в блоках QUEUE в двух оче-
редях. Очередь с именем LINE является общей для транзактов всех
классов. Входя в следующий блок QUEUE, транзакт отмечается в очере-
ди с номером 1, 2 или 3 в зависимости от класса заявки, записанного
в параметре TYPE. Аналогичным образом фиксируется уход из очередей
в блоках DEPART. Таким образом, в модели создается четыре объекта
типа "очередь": одна очередь с именем LINE и три с номерами 1, 2 и
3. При этом три последние очереди создаются одной парой блоков
QUEUE-DEPART! В этом и заключается эффект косвенной адресации.
Как уже отмечалось ранее, каждому имени объекта симулятор сам
ставит в соответствие некоторый номер. При ссылках на объекты одно-
го и того же типа одновременно по именам и номерам, как это имеет
место в рассматриваемом примере, существует опасность параллельной
адресации к одному и тому же объекту вместо двух разных или, наобо-
рот, к двум разным объектам вместо одного. Так, в рассматриваемой
модели мы, вообще говоря, не знаем, какой именно номер поставит си-
мулятор в соответствие имени очереди LINE. Если этот номер будет от
1 до 3, то это приведет к ошибке, так как в модели окажется не че-
тыре очереди, а три, причем в одну из них будет заноситься информа-
ция как обо всех транзактах, так и дополнительно о транзактах одно-
го из трех классов. Как избежать такой ситуации?
К счастью, в большинстве случаев об этом можно не заботиться,
поскольку симулятор ставит в соответствие именам объектов достаточ-
но большие номера, начиная с 10000. При необходимости же можно
воспользоваться оператором EQU, о котором уже говорилось выше, и
самостоятельно сопоставить имени объекта желаемый номер. Например,
в рассматриваемой модели для того, чтобы очередь с именем LINE име-
ла номер 4, достаточно записать оператор:
LINE EQU 4
4.2. Обработка одновременных событий
Так как модельное время в GPSS целочисленно, то оказывается
вполне вероятным одновременное наступление двух или более событий,
причем вероятность этого тем больше, чем крупнее выбранная единица
модельного времени. В некоторых случаях одновременное наступление
нескольких событий, или так называемый временной узел, может су-
щественно нарушить логику модели.
Рассмотрим, например, еще раз модель на рис. 14. Здесь может
образоваться временной узел между событиями "поступление транзакта
на вход модели" и "завершение обслуживания в МКУ". Если не-
посредственно перед завершением обслуживания были заняты оба канала
МКУ, то обработка временного узла зависит от последовательности
транзактов, соответствующих событиям, в списке текущих событий.
Предположим, что первым в списке расположен транзакт, освобож-
дающий канал МКУ. Тогда вначале будет обработан этот транзакт, т.е.
событие "завершение обслуживания в МКУ", причем условие "МКУ STO2
не заполнено", проверяемое в блоке GATE, станет истинным. Затем бу-
дет обработан транзакт, поступивший на вход модели, в блок GATE с
именем ENT1, из блока GENERATE или из блока TRANSFER в безусловном
режиме. При этом транзакт будет впущен в блок ENTER, и МКУ в тот же
момент модельного времени снова окажется заполненным. Такая ситуа-
ция при обработке временного узла представляется естественной.
Предположим теперь, что первым в списке текущих событий распо-
ложен транзакт, поступающий на вход модели. Так как условие "МКУ
STO2 не заполнено" ложно, то блок GATE направит этот транзакт в
блок с именем REFUS. Таким образом, в модели будет зафиксирован от-
каз в обслуживании, хотя в этот же момент модельного времени, после
обработки транзакта, освобождающего канал, МКУ станет доступным.
Порядок расположения транзактов, соответствующих рассматривае-
мым событиям, в списке текущих событий случаен, и в среднем в поло-
вине случаев временной узел будет обрабатываться не так, как нужно.
В результате статистика, связанная с отказами, окажется искаженной.
Для правильной обработки временного узла надо обеспечить такой
порядок расположения транзактов в списке текущих событий, чтобы
транзакт, освобождающий МКУ, всегда располагался первым. Этого мож-
но добиться, управляя приоритетами транзактов (рис. 22).
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
ENT1 GATE SNF STO2,REFUS
ENTER STO2
PRIORITY 1
ADVANCE 160,FN$EXP
LEAVE STO2
TERMINATE 1
REFUS TRANSFER .1,,OUT
ADVANCE 250,FN$EXP
TRANSFER ,ENT1
OUT TERMINATE 1
Рис. 22
Транзакты, поступающие в модель через блок GENERATE, имеют ну-
левой приоритет. Такой же приоритет имеют транзакты, получившие от-
каз в обслуживании, направленные в блок с именем REFUS и затем пов-
торно поступающие в блок с именем ENT1. Те же транзакты, что посту-
пают на обслуживание, повышают приоритет до 1 в блоке PRIORITY, и
после выхода из блока ADVANCE возвращаются из списка будущих в
список текущих событий, располагаясь в начале списка. Таким обра-
зом, нужный порядок транзактов обеспечивается, и временной узел бу-
дет обработан правильно.
Опасность неверной обработки временных узлов характерна для
моделей со списками пользователя. Рассмотрим, например, еще раз мо-
дель на рис. 18. Здесь также возможен временной узел между события-
ми "приход транзакта" и "завершение обслуживания транзакта".
Пусть первым в списке текущих событий располагается вновь при-
шедший транзакт. Так как устройство с именем SYSTEM занято, то блок
GATE направит этот транзакт в блок LINK, и он будет введен в список
пользователя с именем LINE. Затем будет обработан транзакт, осво-
бождающий устройство. Проходя через блок UNLINK, он выведет тран-
закт с начала списка пользователя и направит его в список текущих
событий, где тот продвинется в блок SEIZE, занимая устройство
SYSTEM.
Если же первым в списке текущих событий располагается тран-
закт, освобождающий устройство, то он выведет первый из ожидающих
транзактов из списка пользователя в список текущих событий, где тот
расположится после вновь пришедшего транзакта. Поэтому первым будет
обработан вновь пришедший транзакт, который пройдет через блок GATE
и займет устройство "без очереди". Транзакт-очередник, который был
выведен из списка пользователя, "застрянет" перед блоком SEIZE и
после очередного освобождения устройства займет его, нарушая, в
свою очередь, логику работы модели.
Проведенный анализ показывает, что для правильной обработки
временного узла необходимо обеспечить такой порядок расположения
транзактов в списке текущих событий, чтобы первым всегда распола-
гался вновь пришедший транзакт. В рассматриваемом случае этого мож-
но добиться, используя блок PRIORITY с операндом BU (рис. 23).
Перед освобождением устройства обслуженный транзакт проходит
через блок PRIORITY, который, оставляя неизменным приоритет тран-
закта PR, переводит его в конец списка текущих событий. При новом
просмотре списка в случае наличия временного узла начинает обраба-
тываться вновь поступивший транзакт. Так как устройство еще занято,
он направляется блоком GATE в список пользователя. При повторной
обработке обслуженного транзакта тот освобождает устройство и выво-
дит очередной транзакт из списка пользователя. Таким образом, пра-
вильная обработка временного узла обеспечивается и в этом случае.
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
PRIORITY PR,BU
RELEASE SYSTEM
UNLINK LINE,SFAC,1
TERMINATE 1
WAIT LINK LINE,P$TSRV
Рис. 23
5. КОМАНДЫ GPSS/PC И ТЕХНОЛОГИЯ РАБОТЫ С ПАКЕТОМ
5.1. Загрузка интегрированной среды
Пакет GPSS/PC включает в себя два основных модуля: модуль
GPSSPC.EXE, представляющий интегрированную среду, в которой произ-
водится ввод, редактирование, отладка и выполнение модели, и модуль
GPSSREPT.EXE, предназначенный для получения стандартного отчета
GPSS/PC. Загрузка обоих модулей производится обычным образом из ко-
мандной строки MS DOS или из программы-оболочки Norton Commander.
После загрузки интегрированной среды на экране появляется
"заставка" с названием пакета: начинается так называемый сеанс ра-
боты с GPSS/PC. Затем заставка гасится, и появляется экран, разде-
ленный на две части: большая верхняя часть содержит так называемое
окно данных, меньшая нижняя часть - окно команд. Окно данных в на-
чальный момент пусто, в окне команд в верхней командной строке
высвечен символ "приглашения" >, сигнализирующий о готовности
системы принимать команды.
5.2. Ввод новой модели
Если исходная программа с моделью еще не введена и не записана
на диске, то необходимо ввести ее с клавиатуры. Ввод производится в
командную строку. Сначала вводится номер строки очередного операто-
ра и нажимается клавиша Пробел. Курсор автоматически перемещается к
началу следующего поля - поля имени, и в позиции курсора высвечива-
ется символ L , сигнализирующий о том, что вы находитесь в поле
имени (LABEL - метка). Если оператор имеет имя, необходимо ввести
его и нажать клавишу Пробел, в противном случае - сразу нажать кла-
вишу Пробел. В любом случае курсор переходит к началу следующего
поля - поля операции, о чем сигнализирует символ V (VERB - глагол)
в позиции курсора. Необходимо ввести название оператора и нажать
клавишу Пробел. Очень удобным является то, что название оператора
не обязательно вводить полностью: как только транслятор распознает
оператор по нескольким первым буквам, он после нажатия клавиши Про-
бел сам дополнит его до полного названия.
При синтаксической ошибке в операторе под командной строкой
появляется указатель на место ошибки, причем ошибочный символ не
вводится. Необходимо в этом случае повторить ввод символа.
Аналогичным образом вводятся поля операндов, при этом в пози-
ции курсора высвечивается обозначение текущего поля (A,B, ... ,G).
Для перехода к следующему полю операндов вводится запятая, для пе-
рехода к полю комментариев - Пробел. При переходе курсора в поле
комментариев в позиции курсора высвечивается символ ; , сигнализи-
рующий о возможности начать ввод комментария.
По окончании ввода последнего поля операндов или комментария
следует нажать клавишу Enter, при этом введенный оператор трансли-
руется и отображается в окне данных, а командная строка очищается,
и в ее первой позиции снова появляется символ "приглашения".
По мере ввода новых операторов окно данных заполняется, и по
окончании ввода в нем находится вся исходная программа в последова-
тельности ввода, необязательно совпадающей с последовательностью
нумерации строк. Для отображения в окне данных исходной программы в
последовательности нумерации строк необходимо ввести в командную
строку команду DISPLAY (отобразить). Эта команда, как и все осталь-
ные команды GPSS/PC, вводится без номера строки. С помощью команды
DISPLAY можно также вывести в окно данных отдельную строку, указав
ее номер в поле A команды, или последовательность строк, указав на-
чальный и конечный номера в полях A и B соответственно.
5.3. Редактирование текста модели
Удалить строки из исходной программы можно командой DELETE
(удалить), указав в полях A и B начальный и конечный номера удаляе-
мой последовательности. Для удаления одной строки достаточно ввести
лишь поле A.
При необходимости вставить в текст новый оператор, поместив
его между уже введенными операторами, достаточно ввести его с про-
межуточным номером строки. Вы можете перенумеровать строки, введя
команду RENUMBER (перенумеровать), в поле A которой указывается но-
мер первой строки, а в поле B - шаг перенумерации.
Отредактировать содержимое строки можно с помощью команды EDIT
(редактировать), в поле A которой указывается номер редактируемой
строки. При вводе такой команды в командной строке появляется ре-
дактируемая строка. Подводя курсор к нужным позициям строки, вы мо-
жете внести в нее необходимые изменения. По окончании редактирова-
ния следует нажать клавишу Enter, и отредактированная строка пере-
несется в окно данных, заменив в исходной программе первоначальную
строку с этим номером. Вы можете убедиться в этом, введя команду
DISPLAY 2.
Если редактируемый оператор короткий, а изменений в нем много,
то редактирование удобнее произвести, введя измененный оператор с
тем же номером строки.
5.4. Запись и считывание модели с диска
Если работа с моделью предполагается и по окончании данного
сеанса, то после ввода и редактирования исходную программу имеет
смысл записать на диск. Для этого необходимо ввести команду SAVE
(сохранить), в поле A которой указывается имя файла, в который бу-
дет записана модель. Файл должен иметь расширение .GPS.
Записав модель в файл, вы сможете в следующем сеансе работы с
GPSS/PC не вводить ее заново с клавиатуры, а считать с диска, введя
команду @ спецификация_файла, где спецификация_файла - полное имя
файла, которое вы дали исходной программе в команде SAVE, включаю-
щее расширение .GPS. При выполнении команды @ операторы исходной
программы по мере их считывания из файла транслируются и выводятся
в окно данных.
5.5. Прогон модели и наблюдение за моделированием
После того, как исходная программа модели введена с клавиатуры
или считана с диска и оттранслирована, в памяти ПК создалась теку-
щая модель, и теперь можно выполнить ее прогон. Для этого в команд-
ную строку необходимо ввести управляющий оператор START, указав в
поле A соответствующее начальное значение счетчика завершений.
После нажатия клавиши Enter оператор START переносится в окно дан-
ных, и прогон модели начинается. Об этом сигнализирует сообщение
Simulation in Progress ,
появляющееся в нижней строке командного окна - строке состояния, а
также так называемый индикатор моделирования, мигающий в правой
стороне нижней части окна данных.
Если прогон модели достаточно длинный, то можно наблюдать за