Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмы и программные средства имитационного моделирования систем. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
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],
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]