Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МиАПО / SIMC_dorab.doc
Скачиваний:
13
Добавлен:
07.02.2016
Размер:
756.22 Кб
Скачать

2.15 Процесс моделирования. Функцияplan

Процесс моделирования заключается в многократном повторении функции void plan()и блока выбора события.

Внутри блока выбора события оператор switch(sysevent)выби­рает событие, номер которого совпадает со значениемsysevent.

Функция plan:

1) переводит первый транзакт из списка waitl[sysevent], ес­ли этот список непустой, в списокcurrent; при этом устанавли­ваетсяwaitevent[sysevent]=false; если списокwaitl[sysevent]был пустой, устанавливаетсяwaitevent[sysevent]=true;

2) проверяет trans==nil:

если trans==nil, то функцияplanвыполняет (в порядке за­писи) одно из следующих действий:

- пытается выбрать активный транзакт из списка current;

- если список currentпустой, то выбирает активный транзакт из спискаfutureи устанавливает новое значение модельного времени, затем выбирает из спискаfutureвсе транзакты, значение поляnexttimeкоторых совпадает с новым значением модельного времени;

- назначает sysevent=trans->eve.

Если trans!=nil, то назначается sysevent=succ(sysevent).

2.16 Создание системной среды. Функцияinitlist

Перед началом моделирования необходимо создать системные списки, создать необходимое количество транзактов, поместив их в пассивный буфер и присвоить начальные значения системным пере­менным.

Это осуществляется функцией void initlist(int n). Параметр этой функции n- число транзактов, необходимое для моделирования.

2.17 Структура модели

Модель представляет собой функцию на C++ и оформляет­ся соответствующим образом. Все модели имеют общие черты постро­ения. Типовая структура модели приводится ниже:

voidmodel() {

//variables

pfacility <ссылки на приборы>;

pqueue<ссылки на очереди>;

pstorage<ссылки на накопители>;

plistt<ссылки на списки транзактов>;

phistogram<ссылки на гистограммы>;

...

initlist(<кол-во транзактов>);

newfac(...); ...;

newqueue(...); ...;

newstorage(..., ...); ...;

newuserlt(...); ...;

newhist(..., ...); ...;

initcreate(<номер события>,<время>); ...;

ограничение числа повторений, например, по времени:

while(systime<...) {

plan();

switch(sysevent){

case1: <действие для события 1>;break;

case2: <действие для события 2>;break;

case3: <действие для события 3>;break;

...

casen: <действие для событияN>;break;

}

}

printall();

}

2.18 Сброс статистики и очистка системной и модельной среды. Функцииresetallиclear

Функция voidresetall()служит для сброса статистики, накоплен­ной в процессе моделирования. Для всех списков, очередей, прибо­ров и накопителей обнуляются число входов, время занятости; вре­мя предыдущего обращения становится равнымsystime, и т.д.

Функция voidclear()возвращает все транзакты в списокdelist, сбрасывает всю накопленную статистику, т.е. возвращает систему в состояние, предшествующее началу моделирования.

3 Вывод результатов моделирования

Для печати статистики, собранной в результате моделирова­ния, служит функция voidprintall(). Статистика, распечатываемая этой функцией приerrtest==false, содержит:

- значение абсолютного системного времени в виде

systime=<абсолютное системное время>;

- номер текущего события в виде

sysevent=<номер текущего события>;

- для всех выполняемых событий: количество выполнений каждого события в виде

event <номер события>

total <число выполнений>

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

- для всех приборов в модели: имя прибора, число входов, среднее время обработки транзакта в приборе, загрузка, число захватов;

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

- для всех списков пользователя: имя списка, текущая длина, максимальная длина, транзакты, находящиеся в списке с полями: номер, рrty(приоритет),еvе(событие инициализации),nехttimе(время попадания в список),аns(номер ансамбля), параметры транзакта.

- для выдачи на печать расширенной (аварийной) статистики необходимо выполнить присваивание errtest=true; при этом допол­нительно печатаются системные списки по ссылкамcurrent,future,waitl[i], гдеi=1..iEveMax(номер последнего выполняе­мого события) и другие с содержащимися в них транзактами. Печать системных списков аналогична печати списков пользователя, кото­рая описана выше.

В системе существуют функции для вывода на печать некото­рой части статистики:

voidprnt1(ptransact t)- печать полей транзакта.t- ссылка на транзакт

voidprnlt(plistt& lt); - печать полей списка транзактов и находящихся в нем транзактов.lt- ссылка на список

voidprwaitl() - печать списков ожидающих транзактов (списковwаitl[i])

voidprnq(pqueue q)- печать полей очереди.q- ссылка на очередь

voidprnlq(plistq lq)- печать списка очередей.lq- ссылка на список

voidprns(pstorage st)- печать полей накопителя.st- ссылка на накопитель

voidprnls(plists ls)- печать списка накопителей.ls- ссылка на спи­сок

voidprnf(pfacility f)- печать полей прибора.f- ссылка на прибор

voidprnlf(plistf ls)- печать списка приборов.lf- ссылка на список

void prnuserlt()- печать списков пользователей

void lfprint(plistf lf)- печать полей транзактов, входящих в списки приборов.lf- ссылка на список приборов

void lsprint(plists ls); - печать полей транзактов, входящих в списки накопителей.ls- ссылка на список накопителей.

Соседние файлы в папке МиАПО