Изменение маршрутов сообщений



Блок TRANSFER позволяет осуществлять безусловные и статистические переходы. Тип перехода определяется в операнде А, направление перехода - в операндах В и С.

В режиме безусловного перехода операнд А в блоке пуст. Все транзакты переходят к блоку, указанному в поле В. Например:

TRANSFER, NEXT

Если блок, к которому направляется транзакт, в текущий момент системного времени не может его принять (например, блок SEIZE), то транзакт остается в блоке TRANSFER и повторяет попытку перехода при каждом пересчете системного времени симулятором.

Если в поле А блока TRANSFER записана десятичная дробь, начинающаяся точкой, то блок работает в режиме статистического перехода. Здесь десятичная дробь определяет вероятность перехода транзакта к блоку, имя которого указывается в поле С. При этом поле В пустое. С вероятностью (1 - <A>) транзакт переходит к блоку, следующему за блоком TRANSFER.

Если оба блока заняты, то транзакт остается в блоке TRANSFER и повторяет попытку перехода к выбранному ранее блоку при каждом изменении системного времени.

Условный переход. Для организации условного перехода используется оператор IF, операнд А которого указывает условие перехода транзактов, а в поле В указывается имя блока, куда направляются транзакты, если условие перехода выполняется.

При описании условия используются операции отношения: >, <, =, а также различные СЧА объектов, числовые константы, мнемокоды. Например, при входе транзакта в оператор IF KASS = NU,KAS1 проверяется условие свободно ли устройство с именем KASS.

Если устройство свободно, то транзакт направляется к блоку с именем KAS1, в противном случае транзакт направляется к блоку, стоящему непосредственно за оператором IF.

Условная задержка транзакта. В случае если необходимо задержать транзакт перед каким-либо блоком до выполнения определенного условия, используется оператор WAITIF. В поле А этого оператора задается условие задержки и транзакт остается в данном блоке до тех пор, пока это условие истинно, как только условие становится ложным, транзакт продолжает свой путь.

Здесь для описания условия используется только операция сравнения, где слева указывается имя памяти либо устройства, чье состояние проверяется, а справа - мнемокод состояния. Например, в блоке

WAITIF STR=F

транзакт будет задержан до тех пор, пока память с именем STR будет полной.

Работа с памятью

Память - особый объект языка, который призван имитировать разного рода накопители, используемые в исследуемых системах, в которых может одновременно находиться несколько транзактов. Для каждой применяемой памяти пользователь должен указать ее емкость - объем памяти, определяющий максимальное количество транзактов, которые могут одновременно находиться в ней. Для указания емкости используется оператор описания памяти STORAGE. Как любой оператор описания языка этот блок помещается между блоком SIMULATE и первым блоком GENERATE. Поле метки содержит имя памяти, а операнд А указывает емкость памяти. Например, для описания памяти емкостью 10 единиц используется блок STR STORAGE 10.

В начальный момент времени все памяти пустые. Если в ходе моделирования транзакт обращается к неописанной памяти, ее объем принимается равным 231 -1 единиц.

Блок ENTER - занять память. В поле А блока указывается имя памяти, в которую помещается транзакт, в поле В - число единиц памяти, занимаемых транзактом при входе. Когда транзакт входит в блок ENTER, определяется число свободных единиц памяти. Если значение операнда В не превышает числа свободных единиц памяти, то число занятых единиц увеличивается на значение операнда В. В этом случае транзакт входит в блок ENTER без задержки. Если же значение операнда В превышает число свободных единиц памяти, транзакт задерживается перед входом в блок ENTER. Задержанные при обращении к памяти транзакты упорядочиваются по приоритету.

Если поле В в блоке ENTER пустое, то число занимаемых единиц памяти принимается равным единице.

Пусть транзакт “х” задержан перед входом в блок ENTER. Если для транзакта “у”, приходящего после “х”, свободной емкости памяти достаточно, то “у” войдет в блок без задержки.

Блок LEAVE - освободить память. В поле А блока указывается имя освобождаемой памяти, в поле В - число освобождаемых единиц. В случае пустого поля В число освобождаемых единиц памяти принимается равным единице. При входе транзакта в блок LEAVE количество занятых единиц памяти, указанной в поле А, уменьшается на значение операнда В. Перед входом в блок транзакты не задерживаются. Транзакт не должен освобождать большее число единиц памяти, чем их всего занято. Если же транзакт пытается это сделать, то симулятор выдает на печать сообщение об ошибке и прекращает выполнение модели.

В тот момент модельного времени, когда транзакт освобождает память, симулятор просматривает список задержанных у памяти транзактов, если они есть. Для каждого очередного транзакта проверяется, может ли он теперь быть обслужен памятью. Если такая возможность есть, то симулятор перемещает этот транзакт в блок ENTER, и в результате число занятых единиц памяти соответствующим образом увеличивается.

Транзакт не обязан освобождать такое же число единиц памяти, какое занимал. Он может освобождать память, которую не занимал. Транзакт имеет право занимать и освобождать любое количество памятей, при этом операции занятия и освобождения могут чередоваться в произвольном порядке.

Вычислительные объекты языка

Арифметические переменные. Для того чтобы использовать в программе переменную, необходимо сначала ее описать оператором описания VARIABLE либо FVARIABLЕ. В поле метки оператора записывается имя переменной, в операнде А - арифметическое выражение, составляемое из СЧА, знаков арифметических операций и круглых скобок. Используются следующие арифметические операции: +, -, *, /, @ - взять остаток от деления. Приоритет операций стандартный. Деление на ноль не считается ошибкой, и результатом такого деления является ноль. Остаток от деления также считается равным нулю.

При вычислении переменной, описанной оператором VARIABLE, от всех СЧА в арифметическом выражении и от результатов всех операций берется целая часть. При вычислении переменной, описанной FVARIABLЕ, этого не делается. Однако окончательное значение переменной, независимо от используемого оператора описания, округляется до целого числа.

Например, если описаны переменные

VAR1 VARIABLE 10* (11/3)

VAR2 FVARIABLE 10* (11/3),

то значение VAR1 будет равно 30, значение VAR2 - 36. При использовании переменной в программе указывается СЧА переменной: V$<имя переменной>, например,

ADVANCE V$VAR1

- задержать транзакт на время, заданное переменной VAR1.

Ячейки служат для хранения некоторых постоянных или изменяющихся значений данных программы. В отличие от большинства объектов языка ячейка может обозначаться как именем, так и числом. Для работы с ячейками, обозначаемыми числом, используется блок SAVEVALUE. В поле А этого блока указывается номер ячейки, сохраняющей значение, и вид изменения этого значения (“+”-накопление, “-” -уменьшение). В поле В содержится либо СЧА, либо целое число, которое добавляется либо вычитается, либо заменяет содержимое ячейки. Например: SAVEVALUE 10+,1 - при поступлении транзакта в блок, к содержимому 10-Й ячейки прибавляется единица. Или SAVEVALUE 1,V$VAR1 - при поступлении транзакта в блок, в первую ячейку записывается значение переменной VAR1.

Для работы с поименованными ячейками используются операторы LET, LET+, LET-, позволяющие записать, прибавить или вычесть число из ячейки соответственно. В поле А этих блоков указывается СЧА ячейки: X$<имя ячейки>, в поле В - арифметическое выражение из СЧА ячеек либо число. Например,

LET X$UCHI,5

LET+ X$UCH2,X$UCH1

LET- X$UCH3,X$UCH1+X$UCH2

Чаще всего на базе ячеек организуются разного рода счетчики. Перед началом имитации содержимое всех используемых в программе ячеек устанавливается в 0. Если же требуется задать значение какой-либо из ячеек до начала моделирования, то для этого используется оператор LET, в поле А которого задается арифметическое выражение присваивания. Например,

LET X$UCH1=10

- присвоить ячейке с именем UCH1 значение 10. Этот оператор должен помещаться между блоком SIMULATE и первым блоком GENERATE.

Приоритеты

Каждый транзакт может иметь свой приоритет - от 0 до 127. Чем больше номер, тем больше приоритет. Предпочтение в системе отдается транзактам с большим приоритетом, ранее поступившим.

Для изменения приоритета транзакта в процессе его путешествия по системе используется блок PRIORITY. Поле А этого блока определяет значение присваиваемого приоритета. Например, при прохождении через блок PRIORITY 3 транзакту будет присвоен приоритет 3.


Дата добавления: 2018-09-23; просмотров: 240; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!