Арифметические переменные. Для того чтобы использовать в программе переменную, необходимо сначала ее описать оператором описания VARIABLE либо FVARIABLE. В поле метки оператора записывается имя переменной, в операнде А - арифметическое выражение, составляемое из СЧА, знаков арифметических операций и круглых скобок. Используются следующие арифметические операции: +, -, *, /, @ - взять остаток от деления. Приоритет операций стандартный. Деление на ноль не считается ошибкой, и результатом такого деления является ноль. Остаток от деления на ноль также считается равным нулю.
При вычислении переменной, описанной оператором VARIABLE, от всех СЧА в арифметическом выражении и от результатов всех операций берется целая часть. При вычислении переменной, описанной FVARIABLE, этого не делается. Однако окончательное значение переменной, независимо от используемого оператора описания, округляется до целого числа.
Например, если описаны переменные
VAR1 VARIABLE 10*(11/3)
VAR2 FVARIABLE 10*(11/3),
то значение VAR1 будет равно 30, значение VAR2 - 36. При использовании переменной в программе указывается СЧА переменной: V$<имя переменной>, например,
|
|
ADVANCE V$VARI
- задержать транзакт на время, заданное переменной VAR1.
Ячейка служат для хранения некоторых постоянных и/или изменяющихся значений данных программы. В отличие от большинства объектов языка ячейка может обозначаться как именем, так и числом. Для работы с ячейками, обозначаемыми числом, используется блок SAVEVALUE. D поле А этого блока указывается номер ячейки, сохраняющей значение, и вид изменения этого значения ("+" - накопление, "-" - уменьшение). В поле В содержится либо СЧА, либо целое число, которое добавляется либо вычитается, либо заменяет содержимое ячейки. Например: SAVEVALUE 10+,1-при поступлении транзакта в блок, к содержимому 10-й ячейки прибавляется единица. Или SAVEVALUE 1,V$VAR1 -при поступлении транзакта в блок, в первую ячейку записывается значение переменной VAR1.
Для работы с поименованными ячейками используются операторы LET, LET+,LET-, позволяющие записать, прибавить или вычесть число из ячейки соответственно. В поле А этих блоков указывается СЧА ячейки: Х$<имя ячейки>, в поле В - арифметическое выражение из СЧА ячеек либо число.
Например,
LET X$UCH1,5
LET+ Х$UСН2,Х$UС H1
LET- X$UCH3,X$UCH1+X$UCH2
Чаще всего на базе ячеек организуются разного рода счетчики. Перед началом имитации содержимое всех используемых в программе ячеек устанавливается в 0. Если же требуется задать значение какой-либо из ячеек до начала моделирования, то для этого используется оператор LET, в поле А которого задается арифметическое выражение присваивания. Например,
|
|
LET X$UCH1=10
- присвоить ячейке с именем UCH1 значение 10. Этот оператор должен помещаться между блоком SIMULATE и первым блоком GENERATE.
Пример 6. Модель работы двухтактного буферного запоминающего
устройства
Идея двухтактного буфера: совместить во времени процессы сбора и записи информации в буферное запоминающее устройство (БЗУ) ограниченного объема и перезаписи информации в долговременное запоминающее устройство (ДЗУ), объем которой неограничен.
Техническое осуществление - с использованием канала прямого доступа и программного канала. Рассмотрим упрощенную модель системы двухтактного буферирования. Экспериментальная информация в процессе сбора записывается словами в буфер. При заполнении приемного БЗУ до определенного уровня генерируется запрос к управляющему устройству (УУ) на передачу информации в ДЗУ (включается система прерываний). Между моментом возникновения запроса и переключением ключей (рис. 2.2) проходит определенное время, по истечении которого приемное БЗУ становится передающим (например, подключается канал прямого доступа и информация пишется на диск), а для сбора информации 8 оперативной памяти выделяется новая область, которая становится приемным БЗУ.
Рис. 2.2. Схема двухтактного БЗУ
При исследовании такой системы на модели могут ставиться различные вопросы: каков должен быть уровень заполнения БЗУ, при котором в системе генерируется запрос на переключение ключей; как связан этот уровень с интенсивностью потока экспериментальных данных и вероятностью переполнения приемного БЗУ за время между запросом и переключением ключей и т.п.
Рассмотрим упрощенное описание модели на языке GPSS. Допустим, объем БЗУ - 1024 слова. Разрядность слова - 8 единиц. Тогда память БЗУ1/БЗУ2:
VAR2 VARIABLE 1024*8
STR1 STORAGE V$VAR2
Допустим, запрос на прерывание возникает при заполнении БЗУ до 1020 слов, тогда уровень заполнения:
VAR3 VARIABLE 1020*8
Еще одна переменная - описание среднего времени задержки между запросом и
переключением БЗУ:
VAR4 VARIABLE 3
Пусть время между приходом слов в БЗУ распределено экспоненциально и равно в среднем 10 мин, тогда функционирование этой системы:
GENERATE 10,FN$XPDIS
IF STR1=F, OTKAZ если память заполнена – отказ
ENTER SIR 1,8
IF S$STR1<V$VAR3,ENDM
ADVANCE V$VAR4.FN$XPDIS переключение БЗУ
LEAVE STR1.S$STRI
TERMINATE I
OTKAZ SAVEVALUE 1 + 1 счетчик слов, потерянных из-за переполнения БЗУ
ENDM TERMINATE
Здесь транзакт попадает в блок ADVANCE только тогда, когда БЗУ заполнена до необходимого уровня. Блок LEAVE полностью очищает память STR1, что равносильно переключению на новое БЗУ.
Приоритеты
Каждый транзакт может иметь свой приоритет - от 0 до 127. Чем больше номер, тем больше приоритет. Предпочтение в системе отдается транзактам с большим приоритетом, ранее поступившим.
Для изменения приоритета транзакта в процессе его путешествия по системе используется блок PRIORITY. Поле А этого блока определяет значение присваиваемого приоритета. Например, при прохождении через блок PRIORITY 3 транзакту будет присвоен приоритет 3.