RELEASE 1
Если прибор второй фазы свободен, то транзакт входит в этот блок, а затем и в блок RELEASE 1 и далее в SEZE 2, т.е. транзакт переходит из первой фазы во вторую фазу. Если прибор второй фазы занят, то транзакт не может войти в блок GATE NU 2. Он встает в очередь перед этим блоком и ждет освобождения прибора второй фазы. Следовательно, прибор первой фазы не может освободиться до тех пор, пока не освободится прибор второй фазы – это и есть блокировка первой фазы. Появление блокировки первой фазы зависит от соотношений интервалов времени появления транзактов, задаваемых блоком GENERATE, и длительностями задержки транзактов в фазах, задаваемых блоками ADVANCE. Поскольку все эти интервалы времени случайны, то и появление блокировки первой фазы случайно. Для определения случаев появления блокировки введем в модель еще один прибор – дублёр прибора первой фазы, который будет начинать работать синхронно с прибором первой фазы. Для обеспечения синхронизма с помощью блока SPLIT 1, MET7 создадим копию транзакта и подадим ее на прибор дублер, а оригинал транзакта подадим на прибор первой фазы. задержки в обоих приборах сделаем одинаковыми. Для этого создадим необходимый интервал времени задержки и сохраним его в ячейке с номером 100: savevalue 100, (exponential(2, 0, (1./mu_1))); задание времени * задержки в первой фазе и в приборе дублёре Таким образом, прибор первой фазы и прибор – дублёр будут начинать работать одновременно, а заканчивать либо одновременно, если блокировки не было, либо прибор первой фазы при блокировке будет заканчивать обслуживание позже прибора – дублёра. Обнаружить и подсчитать такие события можно с помощью пары блоков TEST E (F1& ~F3& F2), 1, MET1 SAVEVALUE 4+, 1 MET1 … Здесь F1, F2 и F3 стандартные числовые атрибуты объектов типа Устройство. Атрибуты F1 и F2– равны 0, если приборы свободны, и равны 1, если они заняты. Инверсия атрибута ~F3 – равна 1, если прибор свободен, и равна 0, если прибор занят. Выражение (F1& ~F3& F2) равно 1, если прибор 1 занят, а прибор 3 свободен. Такое событие соответствует блокировке прибора первой фазы. В ячейке 4 (SAVEVALUE 4+, 1) накапливается число блокировок. Замечание: Атрибут F2 в выражение блокировки можно не вводить, так как он учитывается косвенно: – длительность сигнала F1 увеличивается только в случае, когда F2 = 1. Окончательный вариант программы показан ниже. Необходимые пояснения приведены в тексте программы.
*********** Final Program ****** * Параметры системы lambda equ 0.33; mu_1 equ 0.678 mu_2 equ 0.6 * Tab_T_syst table m1, 0, 2, 15; Таблица интервалов времени * нахождения заявок в системе tab_TQ_bloc qtable Q_bloc, 0, 1, 15; Таблица интервалов времени * блокировки (нахождения заявок в очереди из-за блокировки) * generate (exponential(1, 0, (1./lambda))) * TEST E (F1& ~F3& F2), 1, MET1 SAVEVALUE 4+, 1; Подсчет блокировок (b1) * MET1 TEST E (F1& F2), 1, MET2 SAVEVALUE 3+, 1; Заняты обе фазы ((11) или (b1)) * (первая фаза либо обслуживает, либо блокирована) MET2 TEST E (~F1& ~F2), 1, MET3 SAVEVALUE 10+, 1; Обе фазы свободны (00) MET3 TEST E (F1& ~F2), 1, MET4; SAVEVALUE 1+, 1; Занята только первая фаза (10) MET4 TEST E (~F1& F2), 1, MET5 SAVEVALUE 2+, 1; Занята только вторая фаза (01) * Подсчет потерь MET5 TEST E F1, 1, MET6; если первая фаза занята, то отказ savevalue POTERI+, 1; Подсчет потерь terminate; Удаление потерь * MET6 split 1, MET7; Создание одной копии транзакта savevalue 100, (exponential(2, 0, (1./mu_1))); задание * времени задержки в первой фазе и в приборе дублёре * seize 1; Начало обработки заявки в первой фазе
|