Обслуживание с прерыванием

Если на входе ОКУ образуется очередь, то выбор транзакта для его занятия после освобождения происходит:

– в порядке поступлении (FIFO) — для транзактов с равными приоритетами;

– с учетом приоритета.

В любом случае очередной транзакт с большим приоритетом ждет окончания обслуживания предыдущего транзакта независимо от его приоритета. Приоритет учитывается только в образующейся очереди, в которой транзакты выстраиваются в приоритетном порядке. [1]

Такой режим функционирования ОКУ организуется блоками SEIZE и RELEASE, рассмотренными в п. 1.3.

Однако часто возникает необходимость смоделировать ситуацию, когда очередной транзакт должен занять ОКУ, прервав обслуживание предыдущего транзакта Такое прерывание называется «захватом» ОКУ и моделируется блоком PREEMPT (захватить), который имеет следующий формат:

PREEMPT A,[B],[C],[D],[E],

где А (обязательный операнд) – имя или номер захватываемого ОКУ;

В – указатель режима, может иметь значения: PR – приоритетный режим, значение по умолчанию (операнд В не используется) – режим прерывания. Когда ОКУ свободно, блок PREEMPT работает так же, как и блок SEIZE. При занятом ОКУ блок PREEMPT функционирует либо в приоритетном режиме, либо в режиме прерывания. В приоритетном режиме прервать обслуживание предыдущего (обслуживаемого) транзакта, т. е. «захватить» ОКУ, может только транзакт с большим приоритетом. Если приоритет претендующего на занятие ОКУ транзакта равен или ниже приоритета обслуживаемого транзакта, он помешается в список задержки ОКУ последним в своем приоритете. Прерванные транзакты претендуют на дополнительное использование устройства, когда прервавший их транзакт это устройство освободит. Прерванные транзакты помещаются в список задержки в порядке приоритета;

С — имя или номер блока, куда должен быть направлен прерванный транзакт. Прерванный транзакт теряет управление устройством, но претендует на право его использования, если только не задан аргумент операнда Е. В приоритетном режиме работы желательно задавать операнд C, если прерывающий транзакт имеет более высокий приоритет, чем прерываемый;

D — номер параметра прерванного транзакта, в который записывается оставшееся до завершения обслуживания время. Если прерываемый транзакт в момент прерывания направляется в список будущих событий, тогда остаток времени записывается в заданный параметр. Если такой параметр не существует, то он создается. В приоритетном режиме работы операнд D задают, когда прерывающий транзакт имеет более высокий приоритет, чем прерываемый транзакт;

Е – указатель возможности удаления: при значении RE определяет режим удаления прерванного транзакта. B режиме удаления (RE) прерванный транзакт более не претендует на использование устройства и пытается войти в блок, заданный операндом C (если в операнде Е стоит RE, то должен быть определен и операнд C). В приоритетном режиме работы режим RE используется только в том случае, если приоритет прерывающего транзакта больше приоритета прерываемого транзакта. При использовании RE прерванный транзакт не должен входить в блоки RELEASE или RETURN, связанные с устройством, в котором обслуживался прерванный транзакт. Если режим RE не задан (операнд E опущен), то прерванный транзакт по возвращении в список текущих событий будет вновь пытаться занять устройство.

Операнды А, С, D и Е могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.

Транзакт, захвативший ОКУ, освобождает его от захвата вхождением в блок RETURN, формат которого приведен ниже:

RETURN А,

где А — имя или номер освобождаемого ОКУ.

Например:

RETURN Rem1

При входе транзакта в данный блок ОКУ Rem1 освобождается от захвата. Прерывание может быть снято в блоке RETURN только тем транзактом, которым оно сгенерировано.

Прерываемый транзакт может находиться в списке будущих событий. Если надо сделать это, то используют операнд D.

Прерванный транзакт борется за устройство, даже если он перемещен операндом C (если RE не используется в операнде E). Если прерванный транзакт все еще борется за устройство, то попытка транзакта войти в блок TERMINATE приводит к ошибке. Такой транзакт перед входом в блок TERMINATE должен войти в блоки RELEASE или RETURN.

Транзакт может быть прерван на любом количестве устройств.

Устройство может быть захвачено любое количество раз, но не два раза подряд одним транзактом.

Транзакт не может войти в блок, если в приоритетном режиме устройство уже захвачено транзактом c приоритетом равным или большим, чем приоритет активного транзакта. Активный транзакт помещается в соответствии c приоритетом в список задержки устройства.

Транзакт не может войти в блок, если устройство находится в недоступном состоянии. Такие транзакты помещаются в список задержки устройства в соответствии c приоритетом, а внутри приоритета – по правилу FIFO.

Стандартные числовые атрибуты, связанные c описываемым блоком, те же, что и для одноканального устройства, c добавлением СЧА FIj, который является флагом прерывания устройства (1, если устройство находится в состоянии прерывания, 0 – в противном случае).

При задании операндов D и (или) E, операнд C также должен быть задан.

Если приоритетный режим не задан (нет PR в операнде В), то операнды C, D и (или) E игнорируются. Однако возможен вариант, когда для прерванного транзакта выбирается альтернативный выход, причем приоритет транзакта не учитывается. Этот случай возникает тогда, когда задан операнд C (а иногда и операнды D и (или) E), но в операнде В не задан приоритетный режим. Такое использование операндов приводит к тому, что занимающий устройство транзакт прерывается и направляется по альтернативному пути.

Разработчик определяет в зависимости от логики работы модели, в каком случае разрешать прерывания работы устройства, а в каком – нет. Поэтому пары блоков SEIZE – RELEASE и PREEMPT – RETURN могут использовать одни и те же имена занимаемых устройств.

Пример.[1] Использование блока PREEMPT в приоритетном режиме.

При использовании блока PREEMPT в приоритетном режиме операнд В имеет значение «PR». В данной задаче операнд С не используется, т. е. прерванный транзакт к другому блоку не направляется. Поэтому после прерывания он с автоматически сохраненным временем до конца обслуживания автоматически возвращается в список задержки ОКУ:

GENERATE 5,,,3; Источник транзактов

PRIORITY XN1; Присвоить приоритет согласно номеру

PREEMPT REM1,PR; Занять ОКУ в приоритетном режиме

ADVANCE 11; Обслуживание

RETURN REM1; Освободить ОКУ

TEST Е PR,1,Met2; Приоритет равен 1?

Met1 TERMINATE 1; Да, тогда уничтожить

Met2 TEST E PR,2,Met4; Приоритет равен 2?

Мet3 TERMINATE 1; Да, тогда уничтожить

Met4 TERMINATE 1; Уничтожить транзакт с приоритетом 3

Блок GENERATE генерирует только три транзакта в моменты 5, 10 и 15 модельного времени (обозначим t) и перестает быть активным. Каждый очередной транзакт, благодаря блокам SAVEVALUE и PRIORITY, имеет более высокий приоритет, чем предыдущий: 1, 2 и 3 соответственно.

Программа работает следующим образом. Первый транзакт с приоритетом 1 в t = 5 занимает ОКУ REM1. В t = 10 генерируется второй транзакт с приоритетом 2. Он прерывает обслуживание первого транзакта, которому осталось до завершения обслуживания 6 единиц модельного времени (5 + 11 — 10 = 6). Так как операнд С отсутствует, первый транзакт помещается в список задержки ОКУ REM1.

В t = 15 генерируется третий транзакт с приоритетом 3. Он прерывает обслуживание второго транзакта, так как у него более низкий приоритет, равный 2. До завершения обслуживания второму транзакту осталось 6 единиц модельного времени (5 + 11 — 10 = 6). Он также помещается в список задержки ОКУ REM1 впереди первого транзакта, у которого приоритет ниже и равен 1. Таким образом, в соответстви и с приоритетами будут обслужены третий, второй и первый транзакты. Проследить это можно, выполнив пошаговое моделирование: транзакты последовательно войдут в блоки TERMINATE с метками Met4, Met3 и Met1 соответственно.

При прерывании время «дообслуживания» прерванного транзакта автоматически запоминается и затем при возобновлении обслуживания используется. Это следует из суммарного времени обслуживания трех транзактов в данном примере 38 единиц модельного времени (5 + 11 + (5 + + 6) + (5 + 6) = 38). Причем обслуживание третьего транзакта завершится в t = 26 (15 + 11 = 26), второго — в t = 32 (26 + 6 = 32), первого — в t = 38 (32 + 6 = 38) единиц модельного времени. Из примера видно, что в приоритетном режиме ОКУ может быть прервано любое количество раз.

В приведенной программе последние пять блоков (два блока TEST и три блока TERMINATE с метками) применены для удобства наблюдения за последовательностью обработки транзактов при пошаговом моделировании.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: