Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МиАПО / SIMC_dorab.doc
Скачиваний:
13
Добавлен:
07.02.2016
Размер:
756.22 Кб
Скачать

2.7.1 Функции ввода транзактов в прибор

2.7.1.1 Захват прибора. Функцияinfac

Функцией void infac(pfacility&)осуществляется захват прибора. Если прибор был свободен, то ее действие аналогично функцииseize. Если же в приборе находился транзакт, то его обработка прерыва­ется и он поступает в список прерваных транзактов данного прибо­ра (f->inter), а полюstatusприбора присваивается значениеpreempted. После освобождения прибора прерваный транзакт возвра­щается в него на дообработку. Список прерваных транзактов стро­ится в порядке, обратном поступлению. Если имеют место несколько уровней захвата, то прерваные транзакты обрабатываются с дисцип­линой LIFO. Число уровней захвата не ограничено.

Если транзакт, занимающий прибор находится в списке current, т. е. захват должен произойти в тот же момент модель­ного времени, что и освобождение прибора, то активный транзакт не захватывает прибор, а помещается в соответствующий списокwaitlи ждет освобождения прибора.

Пример 7.1. Обработка транзактов с абсолютными приоритетами

...;

if(f->transpoint!=nil)

if(trans->prty>f->transpoint->prty)

infac(f);

else seize(f);

else seize(f);

2.7.1.2 Занятие прибора. Функцияseize

Для реализации дисциплины с относительными приоритетами ис­пользуется функция void seize(pfacility&). Если статус при­бора равенfree, то его занимает транзакт высшего приоритета из числа претендующих на его использование. Если прибор занят (его статус равенseized), то транзакт помещается в список прибора последним в своем классе приоритетов.

2.7.2 Функцияoutfac. Вывод транзакта из прибора

Все события, осуществляемые при занятии прибора, размещают­ся после события, содержащего функцию void infac(pfacility&). После то­го, как они выполнены, прибор необходимо освободить, чтобы обес­печить дальнейшее продвижение транзакта, занимающего прибор, и сделать прибор доступным для других транзактов. Для этого ис­пользуется функцияvoid outfac(pfacility&).

Прибор освобождается вне зависимости от каких-либо условий, однако функция проверяет, какой транзакт освобождает прибор. Если прибор освобождается не тем транзактом, который его зани­мал, то печатается сообщение об ошибке.

Если прибор был захвачен, то возвращается на дообработку транзакт, который ранее его занимал.

Если список освобождаемого прибора содержит транзакты, то функция outfacпроизводит занятие прибора первым транзактом из этого списка.

Функция outfacосвобождает прибор, занятый как функциейseize, так и функциейinfac.

2.8 Регистрация очередей. Функцииinqueue,outqueue

Очереди могут образовываться в любых частях модели, где возникает необходимость задержки или блокировки транзактов. Спе­циального учета их динамики в общем случае не ведется. Средством для сбора статистики и оценки динамики очередей служат объекты типа queue.

Для входа в очередь используют функцию void inqueue(pqueue&), для выхода из нее -void outqueue(pqueue&).

Функции позволяют безусловно вставать в очередь и выхо­дить из нее.

2.9 Накопители (многоканальные устройства). Функцииenterиleave

Для занятия транзактом многоканального устройства использу­ется функция void enter(pstorage s,int c), гдеc– количество занимаемых ячеек

Для освобождения многоканального устройства функция void leave(pstorage s,int c), гдеc– количество освобождаемых ячеек

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

Соседние файлы в папке МиАПО