Язык GPSS. Параметры транзактов. Косвенная адресация. Списки. . Лектор: доцент каф. АОИ Салмина Нина Юрьевна Параметры (атрибуты) транзактов Параметры (атрибуты) – «личные» характеристики транзактов СЧА транзакта: PR – приоритет транзакта P – значение атрибута транзакта Р<номер атрибута> P$<имя атрибута> М1 – время нахождения транзакта в системе с момента «рождения» Изменение атрибутов транзакта ASSIGN A[±],B А – имя/номер атрибута В – присваиваемое значение (константа, СЧА) А,В – атрибуту с именем А присвоить значение В А+,В – в атрибут с именем А добавить значение В А-,В – из атрибута с именем А вычесть значение В (начальное значение атрибута считается равным 0) Примеры: В атрибут с номером 3 добавить значение 2 ASSIGN 3+,2 Записать в атрибут ZARPL зарплату за 5 дней (500 руб/день) ASSIGN ZARPL,(500#5) Примеры использования атрибутов Задержать транзакт на время, определенное его атрибутом 2 ADVANCE P2 Если значение атрибута QWE меньше 23, то перейти к блоку MET1, иначе – продолжать движение TEST ?? P$QWE,23,MET1 Примеры использования атрибутов Задержать транзакт на время, определенное его атрибутом 2 ADVANCE P2 Если значение атрибута QWE меньше 23, то перейти к блоку MET1, иначе – продолжать движение TEST GE P$QWE,23,MET1 Разница между ячейками и атрибутами povt queue 1 ... povt queue 1 ... met savevalue 1+,1 test GE x1,10,povt prod … met assign 1+,1 test GE p1,10,povt prod … Когда ЛЮБЫЕ транзакты пройдут 10 раз через блок met, остальные ВСЕГДА будут сразу проходить к блоку prod КАЖДЫЙ транзакт пройдет 10 раз через блок met, прежде чем направится к блоку prod Косвенная адресация СЧА*<номер/имя атрибута> Номер/имя СЧА содержится в указанном атрибуте транзакта Примеры: Seize FN*1 Transfer ,FN*2 Пример 1 (постановка задачи) В поликлиннику больные приходят в среднем каждые 3 минуты. Примерно 20% больных направляются к лору; 25% - к окулисту; 55% - к терапевту (3 врача). Время обслуживания больных составляет (в среднем): у лора – 12 минут у окулиста – 12 минут у терапевта – 15 минут (все временные характеристики подчиняются экспоненциальному закону) Определить для каждого врача: 1) Общее время нахождения всех больных в очереди; 2) Общее время занятости врача. Промоделировать в течение 8 часов. Пример 1 (модель) lor storage 1 okul storage 1 ter storage 3 fn_num function rn1,d3 .2,1/.45,2/1,3 fn_str function p1,d3 1,lor/2,okul/3,ter var_t variable (st*2#sc*2) fn_obsl function p1,d3 1,12/2,12/3,15 generate 480 terminate 1 start 1 Таймер ; 1 лор ; 1 окулист ; 3 терапевта ; функция определяет, к кому из врачей идем: ; 1 – к лору, 2 – к окулисту, 3 – к терапевту ; в зависимости от номера в 1-м атрибуте Тр ; определяем имя устройства/памяти ; используем косвенную адресацию для ;подсчета времени занятости врачей ; в зависимости от номера в 1-м атрибуте Тр ; определяем время его обслуживания Пример 1 (модель) lor storage 1 okul storage 1 ter storage 3 fn_num function rn1,d3 .2,1/.45,2/1,3 fn_str function p1,d3 1,lor/2,okul/3,ter var_t variable (st*2#sc*2) fn_obsl function p1,d3 1,12/2,12/3,15 generate 480 terminate 1 start 1 Таймер generate (exponential(1,0,3)) ;определяем, к кому пришел больной assign 1,fn$fn_num ;записываем имя врача во 2-й атрибут assign 2,fn$fn_str queue p1 enter p2 depart p1 ;добавляем время простоя больного в ;ячейку 1(лор)/ 2(окулист)/ 3(терапевт) savevalue p1+,m1 advance (exponential(1,0,fn$fn_obsl)) leave p2 ;время занятости врачей в ячейках 4,5 и 6 savevalue (p1+3),v$var_t terminate Пример 1 (отчет) Ожидание в очередях лора SAVEVALUE 1 2 3 4 5 6 RETRY 0 0 0 0 0 0 VALUE 248.820 950.408 1548.139 259.231 359.995 1276.251 Ожидание в очередях окулиста Ожидание в очередях терапевта Время работы лора Время работы окулиста Время работы терапевта Логические переключатели «включен» – «выключен» (по умолчанию) LOGIC O A A – имя/номер логического переключателя О: R – выключить S – включить I – инвертировать СЧА логических переключателей LS$<имя логического переключателя> : =1 – логический переключатель «включен» =0 – логический переключатель «выключен» Для блока GATE поле О: LR – выключен LS – включен Расширение примера 1 Время работы поликлиники: 8.00 – 12.00 обед: 12.00 – 13.00 (никто не приходит) 13.00 – 17.00 За 15 минут до конца рабочего дня – не занимать очередь Вопрос: все ли успеют обслужиться? Пример 1 (модель) generate 240,,,1 ;наступление обеда Logic S obed Savevalue prihod,60 ;(не приходят) Advance 60 ;окончание обеда Logic R obed Таймер Savevalue prihod,3 Advance 225 ;не занимать очередь за 15 мин Logic S day_end Advance 15 ;все ли обслужились? Savevalue 10,(N$met1-N$met2) terminate 1 start 1 ;время прихода больных initial x$prihod,3 generate (exponential(1,0,x$prihod)) gate lr day_end gate lr obed Met1 assign 1,fn$fn_num assign 2,fn$fn_str queue p1 enter p2 depart p1 savevalue p1+,m1 advance (exponential(1,0,fn$fn_obsl)) leave p2 savevalue (p1+3),v$var_t Met2 terminate Организация циклов LOOP A,B А – имя/номер параметра транзакта, который выполняет функцию счетчика циклов В – имя блока Каждое прохождение блока транзактом – уменьшение значения А на единицу Пока значение А>0 – переход по метке В иначе – продолжаем движение дальше Пример использования цикла Необходимо, чтобы через блок ADVANCE все транзакты проходили по 10 раз. Моделируем: ASSIGN 1,10 POVT ADVANCE 34,12 LOOP 1,POVT Списки списки текущих событий: содержат транзакты, у которых время очередной передвижки в программе модели меньше системного времени; активные транзакты находятся в состоянии задержки, например, по причине занятости устройства; списки будущих событий: содержат транзакты, у которых время очередной передвижки больше системного времени (например, все транзакты в блоках ADVANCE); списки прерываний: содержат транзакты, обслуживание которых на определенных устройствах было прервано другими транзактами; списки синхронизируемых и задержанных транзактов; списки пользователя. Включение транзакта в список LINC A,B A – номер/имя списка В – дисциплина постановки в список: • • • • FIFO (первым пришел, первым вышел) – в конец списка; LIFO (последним пришел, первым вышел) – в начало списка; СЧА – транзакт помещается в список в соответствии с вычисленным значением (за транзактом, у которого соответствующее значение больше). Например, транзакты могут быть упорядочены в соответствии со значениями их параметров. PR – транзакты упорядочиваются по приоритетам. Транзакт, попадая в блок LINK, временно исключается из процесса (становится пассивным). Извлечение транзакта из списка UNLINC A,B,C A – номер/имя списка, из которого извлекается транзакт. В – имя блока, к которому направляется извлеченный транзакт. С – количество транзактов, извлекаемых из списка (по умолчанию – все). Основной транзакт, вызвавший извлечение, продолжает свое движение по программе. СЧА списков CA$< имя списка > – среднее число транзактов в CC$< имя списка > – CH$< имя списка > – CM$< имя списка > – CT$< имя списка > – списке; общее число транзактов, прошедших через список; текущее число транзактов в списке; максимальное число транзактов в списке; среднее время, проведенное транзактом в списке. Пример организации обычной очереди через списки GENERATE 5,2 QUEUE OCH GATE NU USTR,WAIT PROD SEIZE USTR DEPART OCH ADVANCE 4,2.5 LEAVE USTR UNLINK LINE,PROD,1 TERMINATE WAIT LINK LINE,FIFO Если устройство занято, заносим в список и временно исключаем из процесса Пример организации обычной очереди через списки GENERATE 5,2 QUEUE OCH GATE NU USTR,WAIT PROD SEIZE USTR DEPART OCH ADVANCE 4,2.5 LEAVE USTR UNLINK LINE,PROD,1 TERMINATE WAIT LINK LINE,FIFO При освобождении устройства очередной транзакт из списка занимает устройство Если устройство занято, заносим в список и временно исключаем из процесса Пример 2 (постановка задачи) Поступают задания на выполнение работ в среднем каждые 20 минут (экспоненциальный закон распределения). Каждое задание содержит от 1 до 5 этапов (с равной вероятностью) Среднее время выполнения каждого этапа от 3 до 7 минут (равномерный закон распределения) В первую очередь выполняются те задания, которые требуют меньше времени на выполнение. 10% работ требуют повторного выполнения (время дополнительной работы составляет 20% от первоначального) Общее время моделирования – 10 часов Определить: сколько времени не хватило на выполнение работ, которые скопились в очереди? Пример 2 (модель) ;функции для определения ;времени выполнения задания Kol_steps function rn1,D5 0.2,1/.4,2/.6,3/.8,4/1,5 Times function rn1,c2 0,3/1,7 ;таймер GENERATE 600 UNLINK 77,NEXT2 ADVANCE 0.1 TERMINATE 1 ;подсчет времени и количества NEXT2 SAVEVALUE SUM_TIME+,P1 SAVEVALUE KOL+,1 TERMINATE START 1 ;приход покупателей GENERATE (exponential(1,0,20)) ;Р1 – время на выполнение задания ASSIGN 3,FN$KOL_STEPS NEXT ASSIGN 1+,FN$TIMES LOOP 3,NEXT ;Р2 – порядок постановки в очередь POVT ASSIGN 2,(40-P1) GATE NU RABOTN,WAIT BEG SEIZE RABOTN ADVANCE P1 RELEASE RABOTN UNLINK 77,BEG,1 TRANSFER .9,,ENDING ASSIGN 1,(.2#P1) TRANSFER ,POVT ENDING TERMINATE WAIT LINK 77,P2 Пример 2 (результаты моделирования) SAVEVALUE SUM_TIME KOL RETRY 0 0 VALUE 19.416 1.000