Застосування блоків PREEMPT і RETURN показано в п. 6.5.5.
6.2.7.2. Переривання в режимі "захоплення"
У режимі "захоплення", якщо ОКУ вже використовується, активний транзакт міститься в список відкладених переривань або "захоплює" ОКУ. Переривання обслуговування відразу, а не приміщення транзакта в список, відбувається тоді, коли список відкладених переривань порожній і обслуговується транзакт сам не є "загарбником".
Транзактам зі списку відкладених переривань надається право зайняти ОКУ раніше, ніж перерваним транзактам або транзактам зі списку затримки ОКУ.
6.2.7.3. Перевірка стану одноканального пристрою, який функціонує в пріоритетному режимі
Перевірка стану ОКУ в пріоритетному режимі може проводитися блоком GATE. а також з використанням булевої змінної і блоку TEST.
Розглянемо перевірку стану ОКУ блоком GATE.
Умова перевірки задається одним з наступних умовних операторів Х:
- I - ОКУ, заданий операндом А. перервано;
- NI - ОКУ, заданий операндом А. не перервав.
У першому прикладі блок GATE пропустить транзакт, коли ОКУ Stan буде перервано. У другому прикладі транзакт пройде до наступного блоку, коли не перервав ОКУ, номер якого визначається як результат обчислення і подальшого округлення до цілого виразу в дужках (V $ Rasp-3). У третьому прикладі в разі переривання ОКУ Print транзакт буде спрямований до блоку з міткою Udal.
У першому і другому прикладах блок GATE працює в режимі відмови у вході в разі невиконання умови. Тут також залишається справедливим зауваження, зроблене в п. 6.2.4: відсутність операнда В може призвести до збільшення машинного часу моделювання. Однак в деяких випадках такий режим, напевно, можна використовувати.
6.2.8. Недоступність одноканального пристрою
Для моделювання несправностей ОКУ і інших ситуацій в GPSS World передбачені блоки, що реалізують недоступність і доступність ОКУ. При використанні цих блоків статистика ОКУ не спотворюється. Тут мається на увазі наступне. Для моделювання, наприклад, несправностей можна використовувати і режим переривання (PREEMPT). Однак при цьому транзакти, що викликають переривання (що імітують відмови ОКУ), враховуються в статистиці, як і транзакти, обслужених при справному функціонуванні ОКУ. А це неправильно, внаслідок чого і спотворюється статистика ОКУ.
6.2.8.1. Переклад в недоступне стан і відновлення доступності
Недоступність ОКУ моделюється блоком FUNAVAIL (символ F означає ОКУ, UNAVAIL - недоступний). При використанні цього блоку статистика ОКУ не спотворюється.
Блок робить недоступним ОКУ з ім'ям або номером, вказаним операндом А (див. Блок-діаграму).
Всі транзакти, оброблювані блоком FUNAVAIL. поділяються на три класи, які і визначають призначення операндів:
- транзакт, що займає ОКУ (по SEIZE або PREEMPT) в момент переведення його в недоступне стан (операнди B. C. D);
- раніше перервані транзакти, що знаходяться в списку переривань (операнди E. F);
- транзакти, що знаходяться в списку відкладених переривань і в списку затримки ОКУ (операнди G. H).
Операндом B задаються режими обробки транзакта, що займає ОКУ в момент переведення його в недоступноcть:
- СО - режим продовження. продовжити обробку займає ОКУ транзакта під час недоступності;
- RE - режим видалення. видалити і направити займає ОКУ транзакт до блоку, мітка якого повинна бути вказана операндом С;
- за замовчуванням - перервати обробку і помістити в список переривань ОКУ; після відновлення доступності цей транзакт може зайняти ОКУ і "дообслужіться".
Операнд С - мітка блоку, в який буде направлений в режимі видалення транзакт, який займав ОКУ в момент переведення його в недоступне стан.
Операнд D - номер або ім'я параметра транзакта, який обіймав ОКУ в момент переведення його в недоступне стан; якщо він буде вилучений (режим RE), т. е. виключений з СБС, у цей параметр буде записано час, що залишився віддаленого транзакту до кінця обслуговування.
Операндом Е задаються режими обробки транзактов, які перебувають до моменту переведення ОКУ в недоступне стан в списку переривань, т. Е. Тих транзактов, обслуговування яких на даному ОКУ було раніше перервано:
- СО - режим продовження. продовжити роботу ОКУ під час недоступності - обслуговувати транзакти зі списку переривань;
- RE - режим видалення. видалити і направити транзакти зі списку переривань до нового блоку, мітка якого повинна бути вказана операндом F;
- за замовчуванням - залишити раніше перервані транзакти в списку переривань ОКУ і заборонити їм займати його під час недоступності.
Операнд F вказує мітку блоку, до якого будуть спрямовані транзакти зі списку переривань ОКУ, через що вони не можуть перебувати в СБС, тому для них немає можливості занесення в їх параметри часу, що залишився до кінця обслуговування.
Операнд F може використовуватися і тоді, коли відсутня операнд E (за замовчуванням). В цьому випадку для переміщених до нового блоку транзактов переривання обслуговування зберігається.
Операндом G задаються режими обробки транзактов, які перебувають до моменту переведення ОКУ в недоступне стан в списку відкладених переривань, т. Е. Які очікують виконання з перериванням, і в списку затримки:
- СО - режим продовження. продовжити роботу ОКУ під час недоступності - обслуговувати транзакти зі списку відкладених переривань і списку затримки;
- RE - режим видалення. видалити і направити транзакти зі списку відкладених переривань і списку затримки до нового блоку, мітка якого повинна бути вказана операндом H;
- за замовчуванням - залишити транзакти в списку відкладених переривань і списку затримки ОКУ і заборонити їм займати його під час недоступності.
Операндом H вказується мітка нового блоку, до якого в режимі видалення (RE) направляються транзакти зі списку відкладених переривань і списку затримки. Коли операнд G не використовується, не можна використовувати і операнд H.
Недоступність ОКУ зберігається до тих пір, поки транзакт, що викликав перехід в недоступне стан, не ввійде в блок
Блок FAVAIL змінює стан ОКУ на доступне, т. Е. Відновлює звичайний режим входження транзактов в ОКУ. Всі транзакти, які очікують доступного стану ОКУ, зазначеного операндом А. активізуються і можуть спробувати зайняти його.
Застосування блоків FUNAVAIL і FAVAIL показано в п. 6.7.5.
Зауваження 1. Операнди B ... Н відносяться тільки до транзактам зазначених раніше трьох класів. Інші транзакти, які намагаються перервати ОКУ, вже знаходиться в недоступному стані, в ці класи не входять і операнди B ... Н не мають до них ніякого відношення.
Зауваження 2. Переклад ОКУ в недоступне стан і дозвіл продовжувати обробку транзактов з зазначених трьох клас-сов дає можливість імітувати не тільки відмови, а й різні дисципліни обслуговування.
6.2.8.2. Перевірка станів недоступності і доступності одноканального пристрою
Перевірка стану ОКУ в режимі недоступності проводиться блоком GATE. Формат блоку см. П. 6.2.4.
Умова перевірки задається одним з наступних умовних операторів Х:
FNV - ОКУ, заданий операндом А. недоступно;
FV - ОКУ, заданий операндом А. доступно.
У першому прикладі блок GATE пропустить транзакт, коли ОКУ Stan буде недоступно.
У другому прикладі транзакт пройде до наступного блоку, коли є ОКУ, номер якого визначається як результат обчислення і подальшого округлення до цілого виразу в дужках (FN $ Rasp-X $ Col).
У третьому прикладі в разі доступності ОКУ Print. т. е. невиконання заданого в блоці GATE умови, транзакт буде спрямований до блоку з міткою Udal.
У першому і другому прикладах блок GATE працює в режимі відмови, якщо умови не виконуються. Тут також залишається справедливим зауваження, зроблене в п. 6.2.4: відсутність операнда В може призвести до збільшення часу моделювання.
6.2.9. Скорочення машинного часу і зміна дисциплін обслуговування методом застосування списків користувача
Для економії машинного часу заблоковані транзакти доцільно поміщати в списки користувача і залишати їх там до тих пір, поки не будуть виконані умови, що дозволяють подальше просування цих транзактов. Крім того, цим надається можливість організувати різні дисципліни черг, що відрізняються від дисципліни FIFO, реалізованої в списку поточних подій.
Список користувача являє собою деякий буфер, в який можуть тимчасово міститися транзакти, виведені з СТС. На відміну від списків поточних і майбутніх подій тран-закти вводяться в список користувача і виводяться з нього не автоматично, а за рішенням користувача відповідно до логіки моделі за допомогою спеціальних блоків.
Для введення транзактов в список користувача служить блок LINK (ввести в список), який може бути використаний в режимах:
6.2.9.1. Введення транзактов в список користувача в безумовному режимі
В безумовному режимі. блок LINK має формат запису: [ім'я] LINK A, B
Операндом А задається ім'я або номер списку користувача, в який безумовно поміщається транзакт, що ввійшов до блоку LINK.
Операнд B визначає, в яке місце списку користувача слід помістити увійшов транзакт. Допустимі значення:
- FIFO - транзакт міститься в кінець списку;
- LIFO - транзакт міститься в початок списку;
- PR - транзакти поміщаються по спадаючій пріоритету;
- Р - транзакти поміщаються позаду тих транзактов, значення відповідного параметра яких менше (в порядку зростання значення параметра);
- М1 - транзакти поміщаються в порядку зростання відносного часу їх перебування в моделі.
Як операнда B можуть використовуватися і інші ВЧА, окрім зазначених раніше ВЧА транзактов: арифметична змінна, функція, а також вираз в дужках. В цьому випадку виконується обчислення зазначеного операндом B для активного транзакта і для всіх інших транзактов, які вже перебувають в списку користувача, починаючи з початку черги. Після цього проводиться упорядкування транзактов у списку користувача спаданням обчисленого значення. Наприклад, блок
поміщає транзакти в кінець списку користувача з номером 3 в порядку їх надходження в блок. блок
поміщає транзакти в список користувача з ім'ям Otst. впорядковуючи їх по зростанню значення параметра з ім'ям Pol.
Умови, при яких транзакт міститься в список користувача, в безумовному режимі перевіряються засобами, передбаченими розробником моделі. Наприклад, направити транзакт в список користувача в разі зайнятості ОКУ можна так, як показано нижче.
Якщо ОКУ Rem1 зайнято, блок GATE не впускає транзакт в блок SEIZE. а направляє його в блок LINK з ім'ям Wait. і тран-закт вводиться в кінець списку користувача з ім'ям Otst.
У тому ж фрагменті моделі список користувача можна розмістити і інакше.
Тут ОКУ Rem1 перевіряється на зайнятість. Якщо ОКУ зайнято, транзакт проходить до наступного блоку LINK і поміщається в список користувача з ім'ям Otst. У разі незайнятості ОКУ, транзакт направляється до блоку SEIZE з міткою Met1 і займає вільне ОКУ.
У щойно розглянутих прикладах передбачається, що список користувача необмежений, т. Е. В нього може міститися будь-яку кількість транзактов. При моделюванні реальних систем список користувача може використовуватися для імітації, наприклад, вхідного накопичувача, ємність якого, як правило, обмежена. Це обмеження можна реалізувати наступним чином.
Якщо ОКУ Rem1 зайнято, то блок GATE не впускає транзакт в блок SEIZE. а направляє його в блок TEST з міткою Wait. що знаходиться перед блоком LINK. Якщо поточний зміст списку користувача з ім'ям Otst менше заданої ємності Emk. тран-закт проходить в список користувача, в іншому випадку направляється до блоку з міткою Term1.
Наведемо ще можливий варіант цього ж фрагмента моделі.
Якщо ОКУ Rem1 зайнято, блок GATE пропускає транзакт до блоку TEST. Якщо поточний зміст списку користувача з ім'ям Otst менше заданої ємності Emk. транзакт проходить в список користувача, в іншому випадку направляється до блоку з міткою Term1. Якщо ОКУ незайнятих, транзакт направляється до блоку SEIZE з міткою Met1 і займає вільне ОКУ Rem1.
6.2.9.2. Висновок транзактов зі списку користувача в умовному режимі
Для виведення одного або кількох транзактов зі списку користувача і приміщення їх назад до списку поточних подій служить блок UNLINK (вивести зі списку), що має такий вигляд:
Операндом А вказується ім'я або номер списку користувача.
Операнд B - мітка блоку, в який переходять виведені зі списку користувача транзакти.
Операндом З вказується число виведених транзактов або ключове слово ALL для виведення всіх, хто знаходиться в списку транзактов. За замовчуванням, т. Е. Коли не використовується операнд С, береться слово ALL.
Операнди D і E разом з умовним оператором Х визначають спосіб і умови виведення транзактов зі списку користувача. Значення оператора Х ті ж, що і в блоці TEST. У разі, коли умовний оператор Х повинен використовуватися, але не вказано, за замовчуванням він приймає значення Е (рівність). Якщо операнди D і Е не використовуються, не вказується і умовний оператор Х. У цьому випадку транзакти виводяться з початку списку, а кількість виведених транзактов визначається обов'язковим операндом С.
Операнд D може бути:
- булевої змінної;
- номером параметра транзакта;
- ключовим словом BACK.
Якщо операнд D є булевої змінної, операнд Е і оператор Х не використовуються. Булева змінна обчислюється щодо транзакта, що знаходиться в списку користувача. Якщо результат не нуль, т. Е. Умова виведення виконується, транзакт виводиться. Кількість виведених транзактов визначається операндом С. Однак виведено може бути і менше, ніж зазначено операндом С. по числа не нульових результатів обчислення булевої змінної. Крім того і транзактов у списку користувача може бути менше, ніж зазначено операндом С.
Якщо операндом D вказано ключове слово BACK. також операнд Е і умовний оператор Х не використовуються, а транзакти виводяться з кінця списку в кількості, що визначається обов'язковим операндом С.
Якщо операнд D НЕ булева змінна і не ключове слово BACK. повинні бути вказані операнд Е і умовний оператор Х. Операнд D обчислюється щодо транзакта, що знаходиться в списку користувача, і використовується в якості номера параметра, значення якого порівнюється з результатом обчислення операнда Е.
Якщо операнд D задає параметр, а операнд Е не використовується, значення параметра транзакта зі списку користувача порівнюється зі значенням такого ж параметра виводить транзакта. Якщо вони рівні, транзакт виводиться зі списку користувача. І в цьому випадку кількість виведених транзактов визначається операндом С.
Операндом F вказується ім'я блоку, куди переходить транзакт, що виходить з блоку UNLINK. якщо зі списку користувача не виведений жоден транзакт. Якщо операнд F не використовується, що виходить транзакт переходить в наступний блок незалежно від кількості виведених транзактов.