интересно
Предыдущая | Содержание | Следующая

Общие функции управления узлами, транзактами и событиями в модели

Описание узлов графа, условий прохождения транзактов и моделирование дискретных компонентов производятся с помощью независимых программных ветвей, активностью которых управляет координатор network. Каждый узел имеет следующую типовую структуру (рис. 3.2). Узел состоит из шести типовых компонентов; необязательные компоненты заключены в квадратные скобки.

Относительно топологии можно рассматривать два типа структурных схем моделей: разомкнутые и замкнутые. Пример разомкнутой модели Эффективность компьютеров в АРМ бухгалтерии (ветвление с использованием параметров транзактов) приведен в главе 8. Простая (но эффективная) замкнутая модель Минимизация затрат производства, отражающая схему зарядки модели, также рассмотрена в главе 8.

Описание узла начинается с особой метки - функции top(i), где i - номер этого узла, а заканчивается оператором place. После top(i) ставится двоеточие. Начиная с метки top(i) транзакт проходит все операторы узла i без задержек (в смысле модельного времени) и попадает в оператор place, где находится до тех пор, пока не появятся условия для перехода в следующий узел.

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

Операторы анализа условий. После метки top(i) можно анализировать условия продвижения транзактов по графу модели, при этом используются операторы if или switch. Если необходимо менять направления путей транзактов, законы распределения, значения времени обслуживания и другие параметры, то можно использовать операцию присваивания. Например, имеются локальные переменные int a, b. Если в узле 3 мы хотим изменять значение переменной b в зависимости от значения а, то должны записать:

При анализе условий запрещено использовать рекурсию типа x=f(x), x=x+l и т.д., а также нежелательно выполнять ресурсоемкие вычисления, требующие существенных затрат времени процессора ЭВМ.

Узловой оператор. Основной обязательный оператор после двоеточия метки-функции - это оператор определения типа узла (далее -узловой оператор). Этот оператор имеет условное наименование, совпадающее с типом узла. Причем могут использоваться все типы, перечисленные на рис. 2.3, кроме узлов ag и parent. Узловые операторы - это функции: queue, serv, term, creat, delet, key, dynam, proc, send, direct, attach, manage, pay, rent и down. В описании каждого узла должен быть только один вызов любой из этих функций.

Сигнальные управляющие функции и блок операторов C++ используются не во всех узлах. Они, как необязательные элементы узла, рассмотрены в конце данной главы.

Оператор place - последний оператор узла.

Описание узла иногда состоит только из метки-функции top(i), узлового оператора и оператора place. Например:

В самом конце блока описания стохастической сети полезно записать функцию fault(err), которой управление будет передано в том случае, если из-за невнимательности пользователя произойдет попытка перехода транзакта в несуществующий узел. После такой попытки моделирование прекратится и будет завершено с кодом возврата err, где err - произвольно задаваемое пользователем число, обычно в пределах от 101 до 32 767.

Рассмотрим основные процессы, образующие узлы модели.

Очередь (с приоритетами или без приоритетов). Функция queue(pi,p2,p3) определяет узел, моделирующий очередь транзактов. Эта очередь строится по одному из двух правил: либо транзакты упорядочены в порядке поступления, либо вновь поступающие транзакты поступают в конец своей приоритетной группы (более приоритетные транзакты находятся ближе к началу очереди, а менее приоритетные - к концу). Чем больше численное значение приоритета транзакта, тем он приоритетнее. Аргументы (параметры) имеют следующие значения.

Параметр pi - символическое имя узла: строка длиной до 14 символов, включая пробелы (char).

Параметр рг - тип организации очереди (int): либо рг = prty, если очередь с приоритетами, либо рг = попе, если очередь без приоритетов.

Параметр р3 - номер узла (int), в который передается сгенерированный транзакт (узел-приемник).

График динамики изменения очереди получается автоматически, если в modbeg подставить в качестве параметра ре номер контролируемой очереди.

Узел обслуживания с N параллельными каналами. Моделирующая функция serv(pbp2,p3,P4,P5,P6,P7,P8) описывает узел, осуществляющий какое-либо обслуживание транзактов в течение модельного времени, отличного от нуля. В данном случае узел - это одно-или многоканальный обслуживающий прибор, работающий по правилам абсолютных приоритетов или без них и имеющий стек для прерванных транзактов (правило относительных приоритетов реализуется в узле типа queue - очередь). Аргументы, используемые в функции serv, имеют следующий смысл.

Параметр pi - символическое имя узла: строка длиной до 14 символов, включая пробелы (char).

Параметр р2 - число обслуживающих каналов(цй), причем l^pi^32767.

Параметр р3 - дисциплина обслуживания:

если рз = abs, то используется приоритетная дисциплина, с прерыванием обслуживания менее приоритетного транзакта более приоритетным (будет рассмотрена ниже);

если рз = попе, то используется бесприоритетная дисциплина. Параметр р4 - тип функции распределения интервала времени

обслуживания транзакта в канале узла serv (int), имеющий значения: norm - нормальное распределение; unif - равномерное распределение; expo - экспоненциальное распределение; erln - обобщенное распределение Эрланга; beta - треугольное распределение; попе -если интервал обслуживания является детерминированной величиной.

Параметр ps - величина, зависящая от типа функции распределения (float): математическое ожидание интервала времени обслуживания транзакта (при р4= norm, unif, expo); математическое ожидание одного слагаемого этого интервала (при р4 = erln); минимальное значение интервала (при р4 = beta); постоянная величина этого интервала (при р4 = попе).

Параметр ре - величина, зависящая от типа функции распределения (float): среднеквадратичное отклонение времени обслуживания (при Р4 = norm); максимальное отклонение от среднего времени обслуживания (при р4 = unif); значение zero (при р4 = expo, none); число слагаемых, распределенных по экспоненциальному закону и входящих в случайный интервал обслуживания (если р4 = erln, то ре > 0); наиболее вероятное значение интервала времени обслуживания транзакта (при p4=beta).

Параметр р7 - величина, также зависимая от типа функции распределения (float): максимально возможное значение интервала времени обслуживания транзакта (р4 = beta); значение zero (p4 - norm, unif, expo, erln, none).

Параметр pg - номер узла (int), в который передается обслуженный транзакт (узел-приемник).

Рассмотрим подробнее прерывания обслуживания неприоритетных транзактов. Если задать рз = abs, то имеются две возможности для работы с прерванными неприоритетными транзактами:

они дообслуживаются после ухода приоритетного транзакта, причем сохраняется чистое заданное время обслуживания, без учета времени нахождения прерванного транзакта в специальном стеке имитатора;

характер прерывания обслуживания транзакта был таков, что нужно возобновить обслуживание заново.

Пример 3.1. Повторный ввод информации при отсутствии контрольных точек. Оператор ЭВМ в течение нескольких часов вводит большой массив информации, причем он не позаботился о периодическом сохранении информации в памяти на жестком диске HDD. Если произойдет случайный сбой или бросок электропитания, то информация, расположенная в оперативной памяти RAM, пропадет; после этого оператор будет вынужден возобновить многочасовую работу заново.

Однако если перед функцией serv транзакт пройдет через оператор присваивания типа t->ga=again, то он при прохождении через serv получает признак обслуживания заново. После выхода из узла serv этот признак теряется.

Следует отметить, что среднее время обслуживания транзактов в узле serv и среднее время задержки в узле - это разные времена. При прерываниях обслуживания транзакта (с его дообслуживанием) чистое время его обработки будет меньше времени задержки в узле на длительность обслуживания приоритетных транзактов.

Терминатор, убирающий транзакты из модели. Функция term(pi) описывает узел-терминатор, назначение которого заключается в следующем: он удаляет из модели входящий в него транзакт и фиксирует время его существования начиная с момента выхода этого транзакта из генератора. Единственный параметр pi - это символическое имя узла: строка длиной до 14 символов, включая пробелы (char).

Существуют средства автоматического построения графика изменения потока транзактов, поступающих на вход терминатора. График динамики потока таких транзактов получается автоматически, если номер этого терминатора задан параметром р8 в функции modbeg, причем время жизни каждого транзакта измеряется с момента его генерации и до момента уничтожения.

Когда пользователю необходимо иметь инструмент для анализа динамики потока транзактов по какой-либо ветви графа, причем принимающий узел не является терминатором, то необходимо модель дополнить двумя узлами:

завести дополнительный терминатор и указать его номер в качестве параметра pg в функции modbeg;

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