Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмы и программные средства имитационного моделирования систем. Учебное пособие
.pdf
81
=10±2
Приоритет заданий, поступающих от входного источника, будем
считать нулевым. При повторном прохождении транзакта через систему приоритет равен 1.
MEM PROC
Рис. 5.6
Описание модели на языке GPSS имеет вид:
GENERATE 10,2
ASSIGN 1,2 ; определение объема исходного модуля
ASSIGN 2,6 ; среднее время трансляции модуля
MET1 QUEUE MEM,P1 ; поступление модуля в память
SEIZE PROC
DEPART MEM,P1 ; освобождение памяти
ADVANCE P2,2 ; время обработки в процессоре
RELEASE PROC ; освобождение процессора
TEST E PR,0,MET2 ; проверка приоритета
PRIORITY 1
ASSIGN 1,4 ; объем памяти готовой программы
ASSIGN 2,3 ; время выполнения готовой программы
TRANSFER ,MET1
MET2 TERMINATE 1
START 100.
С помощью блока TEST из потока транзактов выделяются такие
транзакты, у которых приоритет равен нулю. Они получают новый
уровень приоритета (равный 1) и с новыми характеристиками повторно пересылаются в память.
5.7. Переменные в языке GPSS
Переменные относятся к вычислительным объектам языка. С их
помощью можно описать в аналитическом виде взаимосвязь между
характеристиками различных элементов моделей. Их не следует путать с переменными в языках программирования.
В данной версии языка допустимо использовать переменные трех
типов: логические (булевы), целочисленные, вещественные с плавающей точкой.

82
Переменные определяются с помощью операторов описания следующего вида:
целочисленная переменная
<имя> VARIABLE <выражение>;
булева переменная
<имя> BVARIABLE <выражение>;
вещественная переменная
<имя> FVARIABLE <выражение>.
При определении выражения могут использоваться константы,
стандартные числовые атрибуты, круглые скобки и символы операций.
операции (указаны по приоритетам):
^ – возведение в степень;
# – умножение, которое можно переопределить через «*»;
/ – деление;
\ – целочисленное деление;
@ – деление по модулю;
+ – сложение;
- – вычитание.
операции:
E – равно;
NE – не равно;
L – меньше;
G – больше;
LE – меньше - равно;
GE – больше – равно;
AND – логическое умножение;
OR – логическое сложение.
Для обращения к булевым переменным используется стандартный числовой атрибут BV<имя>. Для обращения к числовым используется V<имя>.
Например, пусть имеется описание булевой переменной:
1 BVARIABLE (Q1<Q2)’AND’(Q1<Q3).
Для обращения к ней используется СЧА BV1: если условие выполняется, то BV1=TRUE, иначе BV1=FALSE.
При описании арифметических выражений следует учитывать,
что в операторе FVARIABLE не допускается использование операции
деления по модулю @.

83
1
= 2*SIZE
BUF
64
SYS
Пример. 5.8. Одноканальная система обработки данных имеет
буферную память объемом 64 страницы, заявки на обработку в системе поступают через случайный интервал времени от 8 до 13 е.м.в. Каждая заявка занимает в буфере от 2 до 6 страниц. Если свободной памяти не хватает, то заявка теряется (покидает систему без обслуживания). Время обработки заявки зависит от ее объема и составляет 2 единицы времени на страницу. Введем следующие обозначения:
T – интервал поступления заявок – случайное число из диапазона
[8,13];
SIZE – количество страниц, занимаемое заявкой в буфере, - случайное число из диапазона [2, 6]. Тогда сеть СМО, описывающая данную систему обработки данных, будет иметь вид, представленный на
рис. 5.7.
Рис. 5.7
Входной буфер можно описать как очередь или как накопитель.
Представим его как очередь. В этом случае свободный объем буфера
можно определить через дополнительную переменную. Если буфер
задать как накопитель, то в этом случае можно использовать СЧА, который определяет свободную емкость накопителя – R$BUF.
В результате модель СМО будет иметь следующий вид.
1 VARIABLE 8+RN1@6; интервал между соседними заявками, где
* RN1- датчик случайных чисел от 0 до 999
* RN1@6 – результат составляет от 0 до 5
SIZE VARIABLE 2+RN2@5; объем заявки (случайное число от 2 до 6)
TAU VARIABLE P1*2; расчет времени обработки = 2*SIZE, где
* P1 – первый параметр, в котором сохраняется объем заявки
2 VARIABLE 64-Q$BUF; свободный объем буфера
GENERATE V1; V1 – интервал между соседними заявками
ASSIGN 1,V$SIZE
TEST LE P1,V2,OUT
QUEUE BUF,P1
SEIZE SYS
DEPART BUF,P1

84
ADVANCE V$TAU
RELEASE SYS
OUT TERMINATE 1
START 100.
Рассмотрим еще один вариант программы, в которой входной бу-
фер реализован как накопитель (многоканальное устройство).
1 VARIABLE 8+RN1@6
SIZE VARIABLE 2+RN2@5
TAU VARIABLE P1*2
BUF STORAGE 64
GENERATE V1
ASSIGN 1,V$SIZE
TEST LE P1,R$BUF,OUT
ENTER BUF,P1
SEIZE SYS
LEAVE BUF,P1
ADVANCE V$TAU
RELEASE SYS
OUT TERMINATE 1
START 100.
5.8. Функции в языке GPSS
Функции, так же как и переменные, относят к вычислительным
объектам языка. С их помощью можно задать зависимость между характеристиками модели, которые не удается описать аналитически.
В данной версии языка используются как встроенные функции, так и
функции, определяемые пользователем.
Рассмотрим два типа функций: непрерывные и дискретные. Любая функция, определяемая пользователем, задается множеством точек
ее графика, причем аргумент и значение функции могут быть представлены любыми СЧА. В зависимости от типа функции множество
точек ее графика интерпретируется разными способами. Для непрерывных функций эти точки соединены в виде ломаной линии, как это
показано на рис. 5.8, а. Для дискретных – представляются ступенчатой
зависимостью (рис.5.8, б).

85
Y
X1 X2
X
Y1
Y2
Y
а б
Рис. 5.8
Функция задается с помощью двух операторов описания. Первый
определяет заголовок и тип функции. Этот оператор имеет следующий
формат:
<имя> FUNCTION A,B.
Здесь в поле метки располагается символьное или числовое имя функции;
операнд А задает аргумент функции (любой СЧА, например датчик RN для случайных функций);
B – характеристика функции, которая определяет ее тип (С – дискретный, D – непрерывный) и n - количество точек графика.
Например:
1 FUNCTION C5
2 FUNCTION D5.
После оператора описания располагается одна или более строк,
описывающих точки графика:
X1,Y1/X2,Y2/X3,Y3,
X4,Y4/X5,Y5.
Значения аргумента должны быть расположены строго по возрастанию.
Для обращения к функции используется СЧА FN<имя>. Если при
обращении аргумент выходит за пределы описанного диапазона
(меньше X1 или больше Xn), то в качестве результата возвращается
значение функции для ближайшего аргумента. Так, если X<X1, то
Y=Y1, если X>Xn, то Y=Yn.
Пример 5.9. Время обслуживания заявки является случайной ве-
личиной, для которой известно, что в среднем 20 % заявок обслуживаются за 3 единицы времени (е.м.в.), 50 % - за 4 е.м.в., 30 % - за

86
0,2
0,7
1,0
RN1
TAU
3
4
5
0,2 1
0,5
0,3
2
3
5
4
3
5 е.м.в., как это показано на рис. 5.9. Требуется реализовать такое время обслуживания в программе.
Рис. 5.9
Описание дискретной функции на языке GPSS имеет вид:
TAU FUNCTION RN1,D3
0.2,3/0.7,4/1.0,5.
Для обращения к этой функции можно использовать оператор
ADVANCE FN$TAU.
Эта же функция может использоваться для распределения заявок
по трем обслуживающим приборам с заданными вероятностями, как
это показано на рис. 5.10.
Рис. 5.10
В этом случае фрагмент программы с описанием функции выбора
прибора и вызова этой функции будет выглядеть как
PRIBOR FUNCTION RN1,D3
0.2,1/0.7,2/1.0,3
...

87
BUF
SYS
= f (SIEZE)
1 2 3 4 5 6 7 8 9 10
15
10
5
Время
обработки
Объем заявки
ASSIGN 1,FN$PRIBOR
SEIZE P1
...
RELEASE P1.
Пример 5.10. Пусть имеется экспериментальный график зависи-
мости времени обслуживания заявки в приборе от объема заявки, как
это показано на рис. 5.11. Объем заявки является случайным с равномерным распределением. Необходимо описать для модели СМО на
рис. 5.12 такую зависимость.
Рис. 5.11
Программа на языке GPSS, описывающая такую СМО, будет
иметь вид:
SIZE VARIABLE 2+RN1@10
TAU FUNCTION P1,C7
1,5/3,3/4,3/5,4/6,7/8,10/10,15
GENERATE ...
ASSIGN 1,V$SIZE
QUEUE BUF,P1
SEIZE SYS
Рис. 5.12

88
DEPART BUF,P1
ADVANCE FN$TAU
RELEASE SYS
...
5.9. Ячейки и матрицы ячеек в языке GPSS
В языке GPSS пользователю предоставляется возможность опре-
делить свои глобальные данные, начальные значения которых могут
быть заданы перед моделированием и которые можно изменять в любом месте моделирующей программы в любой момент времени. Для
этого используются сохраняемые величины (ячейки) и матрицы ячеек.
Ячейки относятся к объектам хранения и предназначены для записи
исходных, промежуточных и окончательных значений характеристик
модели и параметров ее элементов. В отличие от СЧА и параметров
транзактов, величины, сохраняемые в ячейках, задаются и изменяются
только пользователем. В ячейках могут храниться положительные и
отрицательные числовые значения. Для обращения к ячейкам используется СЧА X$<имя>, а для матриц ячеек – СЧА MX$<имя>(i,j),
где i,j – номера строки и столбца соответственно.
Для работы с ячейками используются следующие операторы:
SAVEVALUE (сохранить значение); SINCREMENT (увеличить значение); SDECREMENT (уменьшить значение); INITIAL (задать начальное значение).
Формат первого оператора следующий
[<метка>] SAVEVALUE A,B.
Здесь А – номер (имя) ячейки; В – сохраняемое значение.
Подобно блоку ASSICN блок SAVEVALUE может быть использован как в режиме замещения величины, так и в режиме накопления и
уменьшения. В режиме накопления предыдущее значение сохраняемой
величины увеличивается на значение, стоящее в операнде В. В режиме
уменьшения оно уменьшается на величину, стоящую в операнде В.
Режимы накопления и уменьшения определяются введением знака «+»
или «–» перед запятой, разделяющей операнды А и В.
Например, когда транзакт входит в блок
SAVEVALUE X$CELL1+,5,
содержимое ячейки X$CELL1 будет увеличиваться на 5.
Начальные значения всех ячеек устанавливаются по умолчанию
равными нулю. Чтобы задать другие значения, нужно использовать
оператор INITIAL. Формат оператора следующий:

89
INITIAL A1,B1,[A2,B2,A3,B3],
где А – СЧА, который определяет некоторую ячейку,
В – присваиваемое значение.
Например:
INITIAL X$CELL1,23,X$CELL3,64000.
Для работы с матрицами ячеек применяются два оператора: блок
MSAVEVALUE и оператор описания MATRIX. Каждая матрица должна
быть объявлена до ее использования:
<имя матрицы] MATRIX A,B,С.
Здесь операнд A не используется (в ранних версиях языка задавал тип
элементов матрицы), B и C – число строк и столбцов. Запись и изменение значения элементов матрицы выполняются блоком
[<метка>] MSAVEVALUE A,B,C,D.
Этот блок может работать в режимах замещения, накопления и
уменьшения, где A - имя матрицы, B,C - номера строки и столбца,
D - модификатор значения элемента.
Пример 5.11. Пусть в модели СМО на GPSS требуется реализо-
вать следующие действия:
1) задать номер каждому транзакту, поступающему в модель;
2) в момент прохождения некоторой точки модели транзактом с
заданным номером требуется зафиксировать значение абсолютного
модельного времени (AC1) и текущую длину очереди MEM.
Для этого будем использовать четыре ячейки:
X$COUNT – счетчик транзактов;
X$CELL1 – номер заданного транзакта;
X$CELL2 – значение времени;
X$CЕLL3 – длина очереди.
Необходимую точку модели обозначим меткой MET1. Тогда фрагмент
программы на GPSS, реализующий требуемые действия, будет иметь
следующий вид:
...
INITIAL X$CELL1,15; задать номер N транзакта
...
GENERATE ...
SAVEVALUE X$COUNT+,1; инкремент счетчика
ASSIGN 1,X$COUNT; запись номера транзакта в параметр
MET1 TEST E P1,X@CELL1,MET2; выбор транзакта с номером N

90
SAVEVALUE X@CELL2,AC1; сохранить значение времени
SAVEVALUE X@CELL3,Q$MEM; сохранить длину очереди
MET2 ...
Оператор INITIAL должен располагаться до первого оператора
GENERATE, так как он является оператором описания.
5.10. Ансамбли транзактов
Все транзакты модели принадлежат группам, называемым ансамблями. В моделях одновременно присутствует, как правило, много
различных ансамблей, но каждый транзакт принадлежит только одному из них. Принадлежность транзакта некоторому ансамблю определяется интерпретатором (моделирующей системой) автоматически
при входе транзакта в модель.
Блок GENERATE связывает каждый новый транзакт со своим ансамблем, т.е. каждый транзакт, вошедший через блок GENERATE, образует новый ансамбль и сам становится первым транзактом в этом
ансамбле.
В системе GPSS существует возможность дополнительного ввода
транзаков в модель через блок SPLIT (расщепить).
Транзакт, входящий в блок SPLIT, называется транзактомпредком. Он создает новые транзакты, которые являются копиями
транзакта-предка и называются транзактами-потомками. Все транзакты-потомки являются членами одного ансамбля, первым элементом
которого является транзакт-предок, вошедший в модель через оператор GENERATE.
В последующем транзакты-потомки также могут входить в блок
SPLIT, причем потомки потомков также будут принадлежать к тому
же ансамблю, который определяется исходным транзактом-предком.
В языке GPSS имеется несколько специальных операторов для
работы с ансамблями транзактов:
SPLIT - расщепить;
ASSEMBLE - соединить;
GATHER - собрать;
MATCH - синхронизировать.
Оператор SPLIT предназначен для получения транзактов-
потомков, являющихся копиями транзакта, вошедшего в этот блок.
Формат данного оператора:
[метка] SPLIT A,B[,C],
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
