означає звільнення від захоплення ОКП Din1.
Наведемо приклади використання блоків PREEMPT і RETURN в пріоритетному режимі [1]:
1. Блок PREEMPT функціонує в пріоритетному режимі, тому що значення операнда В дорівнює PR (рис. 5.5). Операнд С не використовується, тобто перерваний транзакт до іншого блоку не спрямовується. Тому після переривання він зі збереженим часом до кінця обслуговування автоматично повертається до списку затримування ОКП.
Рис. 5.5. Використанням блоку PREEMPT в пріоритетному режимі
(В = PR, С – не використовується)
Блок GENERATE генерує тільки три транзакти в моменти часу моделювання 5, 10 і 15 (позначимо t) і перестає бути активним. Кожний черговий транзакт, завдяки блоку PRIORITY, має вищий пріоритет, ніж попередній: 1, 2 і 3 відповідно.
Перший транзакт із пріоритетом 1 в t = 5 займає ОКП Reml. В t – 10 генерується другий транзакт із пріоритетом 2. Він перериває обслуговування першого транзакта, якому залишилося до завершення обслуговування
5 + 11 – 10 = 6 одиниць часу моделювання. Перший транзакт, через відсутність операнда С потрапляє в список затримування ОКП Reml.
В t = 5 генерується третій транзакт із пріоритетом 3. Він перериває обслуговування другого транзакта з нижчим пріоритетом 2. До завершення обслуговування другому транзакту залишилося 10 + 11 – 15 = 6 одиниць модельного часу. Він також потрапляє в список затримування ОКП Reml і розташовується перед першим транзактом, у якого пріоритет нижчий і дорівнює 1.
Таким чином, відповідно до пріоритетів будуть обслужені третій, другий і перший транзакти. Простежити це можна, виконавши покрокове моделювання: транзакти послідовно ввійдуть у блоки TERMINATE з мітками Met4, Met3 і Metl відповідно.
З перериванням час “дообслуговування” перерваного транзакта автоматично запам'ятовується і потім з поновленням обслуговування використовується. Це випливає із сумарного часу обслуговування трьох транзактів у даному прикладі: 5 + 11 + (5 + 6) + (5 + 6) = 38 одиниць часу моделювання. Причому обслуговування третього транзакта завершиться в t = 15 + 11 = 26, другого – в t = 26 + 6 = 32, першого – в t = 32 + 6 = 38 одиниць часу моделювання.
Із прикладу видно, що в пріоритетному режимі ОКП може бути перерваний будь-яку кількість разів.
2. Блок PREEMPT функціонує в пріоритетному режимі. Використовується операнд С, тобто зазначена мітка блоку, до якого скеровується перерваний транзакт (рис. 5.6).
Рис. 5.6. Використання блоку PREEMPT в пріоритетному режимі
(В = PR, С – мітка блоку)
Блок GENERATE генерує три транзакти. У кожного наступного транзакта пріоритет вищий: 1, 2 і 3 відповідно. Перший транзакт з пріоритетом 1 в t =5 займає ОКП Reml. В t = 10 другий транзакт із пріоритетом 2 перериває обслуговування першого транзакта й скеровує його до блоку з міткою Met6. В t= 15 третій транзакт із пріоритетом 3 перериває обслуговування другого транзакта й також скеровує його до блоку з міткою Met6. Нею позначений блок затримування ADVANCE, який запобігає негайній передачі перерваного транзакта на тільки що залишений ОКП. Після цього блоку знаходиться блок TRANSFER, що скеровує перший і другий перервані транзакти до блоку ADVANCE ОКП Reml.
Обслуговування третього транзакта завершиться в t = 15 + 11 = 26, другого в t = 26 + 10 + 11 = 47, а першого в t = 47 + 10 + 11 = 68 одиниць часу моделювання.
У цьому прикладі пріоритетність обслуговування збереглася, хоча перший транзакт надійшов у модель раніше й раніше був вилучений із пристрою. Але відлік часу затримування блоком ADVANCE з міткою Met6 почався тільки після того, як завершилося обслуговування третього транзакта. Також перервані транзакти ОКП Reml обслуговувалися не 6 одиниць часу моделювання (стільки їм залишалося до завершення обслуговування), а із самого початку обслуговування, тобто 11 одиниць часу моделювання.
Якщо ОКП вже використовується, активний транзакт потрапляє в список відтермінованих переривань або “захоплює” ОКП. Переривання обслуговування відбувається відразу тоді, коли список відтермінованих переривань порожній і транзакт, що обслуговується сам не перериває процесу. Транзактам зі списку відтермінованих переривань представляється право зайняти ОКП раніше, ніж перерваним транзактам або транзактам зі списку затримування ОКП.
Наведемо приклади використання блоків PREEMPT і RETURN в режимі переривання [1].
1. Блок PREEMPT функціонує в режимі “переривання”, оскільки операнд В не використовується. Інші операнди теж не використовуються (рис.5.7).
Рис. 5.7. Використання блоку PREEMPT, в режимі переривання
Блок GENERATE генерує три транзакта. Пріоритет наступного транзакта нижчий пріоритету попереднього: 3, 2 і 1 відповідно. Це забезпечують два блоки SAVEVALUE і блок PRIORITY. Покажемо, що у цьому режимі пріоритети ігноруються.
В t = 5 блок GENERATE генерує перший транзакт із пріоритетом 3, який займе вільний ОКП. В t = 10 уводиться другий транзакт із пріоритетом 2. Незважаючи на те, що його пріоритет нижчий від першого обслуговуваного транзакта, він “захоплює” ОКП, а перший транзакт, якому залишилося до кінця обслуговування 11 – 5 = 6 одиниць часу моделювання, потрапляє в список переривань. В t = 15 уводиться третій транзакт із пріоритетом 1, але він не може перервати ОКП, тому що там уже обслуговується транзакт. Третій транзакт потрапляє в список відтермінування переривань. В t = 10 + 11 = 21 завершується обслуговування другого транзакта. Третій транзакт, що перебуває в списку відтермінованих переривань, має перевагу над першим транзактом, і він займає ОКП, хоча пріоритет першого транзакта вищий. Обслуговування третього транзакта завершується в t = 21 + 11 = 32. В t = 32 ОКП займає перший транзакт. Його “до обслуговування” завершується в t = 32 + 6 = 38 одиниць часу моделювання.
Таким чином, пріоритети проігноровані. Простежити роботу моделі можна в покроковому режимі. Транзакти залишать модель, увійшовши в блоки TERMINATE з мітками Met4, Met3 і Met2 відповідно в моменти часу t = 21, t = 32 і t = 38.
2. Блок PREEMPT функціонує в режимі переривання. В операнді С зазначена мітка блоку, до якого скеровуються перервані в результаті “захоплення” транзакти (рис. 5.8).
Рис. 5.8. Використання блоку PREEMPT в режимі переривання
В t = 5 генерується перший транзакт із пріоритетом 3, що і займає вільний ОКП Reml. В t = 10 другий транзакт із пріоритетом 2 “захоплює” ОКП, перериваючи обслуговування першого транзакта з вищим пріоритетом. Перший транзакт скеровується до блоку ADVANCE з міткою Met6, не втрачаючи права на зайняття надалі ОКП Reml. В t = 15 третій транзакт не може “захопити” ОКП, який вже обслуговує “загарбника”, і потрапляє в список відтермінованих переривань. В t = 10 + 11 = 21 завершується обслуговування другого транзакта. Третій транзакт був у списку відтермінованих переривань. Йому надається право зайняти ОКП, що звільнився. Обслуговування третього транзакта завершується в t = 21 + 11 = 32.
ОКП стає вільним і починається відлік часу затримування першого транзакта блоком ADVANCE з міткою Met6. Пізніше він скеровується до блоку ADVANCE з міткою Metl, що імітує обслуговування в ОКП Reml. Закінчується обслуговування першого транзакта в t = 21 + 10 + 11 = 32. Його обслуговування також починається з початку, хоча до завершення обслуговування йому залишалося 6 одиниць часу моделювання.
Перевірка стану ОКП в пріоритетному режимі може здійснюватись блоком GATE, а також блоком TEST з використанням булевої змінної.
Розглянемо перевірку стану ОКП блоком GATE. Умова перевірки задається одним із наступних умовних операторів X:
· I – заданий операндом А, ОКП перерваний;
· N1 – заданий операндом А, ОКП не перерваний.
Наприклад: