Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
В.Д. Боев, Р.П. Сыпченко.docx
Скачиваний:
176
Добавлен:
19.09.2019
Размер:
7.07 Mб
Скачать

6.2.8.2. Проверка состояний недоступности и доступности одноканального устройства

Проверка состояния ОКУ в режиме недоступности проводится блоком GATE. Формат блока см. п. 6.2.4.

Условие проверки задается одним из следующих условных операторов Х:

FNV - ОКУ, заданное операндом А, недоступно ;

FV - ОКУ, заданное операндом А, доступно.

Например:

GATE FNV Stan

GATE FV (FN$Rasp-X$Col)

GATE FNV Print,Udal

В первом примере блок GATE пропустит транзакт, когда ОКУ Stan будет недоступно.

Во втором примере транзакт пройдет к следующему блоку, когда доступно ОКУ, номер которого определяется как результат вычисления и последующего округления до целого выражения в скобках (FN$Rasp-X$Col).

В третьем примере в случае доступности ОКУ Print, т. е. не выполнения заданного в блоке GATE условия, транзакт будет направлен к блоку с меткой Udal.

В первом и втором примерах блок GATE работает в режиме отказа, если условия не выполняются. Здесь также остается справедливым замечание, сделанное в п. 6.2.4: отсутствие операнда В может привести к увеличению времени моделирования.

6.2.9. Сокращение машинного времени и изменение дисциплин обслуживания методом применения списков пользователя

При движении по модели транзакты могут быть заблокированы, например, как отмечалось ранее, при проверке состояния ОКУ блоками GATE и TEST. Если заблокированные транзакты находятся в списке текущих событий (СТС), то при большом их количестве планировщик расходует много времени на просмотр СТС с целью выбора очередного транзакта для продвижения.

Для экономии машинного времени заблокированные транзакты целесообразно помещать в списки пользователя и оставлять их там до тех пор, пока не будут выполнены условия, позволяющие дальнейшее продвижение этих транзактов. Кроме того, этим предоставляется возможность организовать различные дисциплины очередей, отличающиеся от дисциплины FIFO, реализованной в списке текущих событий.

Список пользователя представляет собой некоторый буфер, в который могут временно помещаться транзакты, выведенные из СТС. В отличие от списков текущих и будущих событий тран-закты вводятся в список пользователя и выводятся из него не автоматически, а по решению пользователя в соответствии с логикой модели при помощи специальных блоков.

Для ввода транзактов в список пользователя служит блок LINK (ввести в список), который может быть использован в режимах:

  • условном;

  • безусловном.

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

В безусловном режиме, блок LINK имеет формат записи: [имя] LINK A,B

Операндом А задается имя или номер списка пользователя, в который безусловно помещается транзакт, вошедший в блок LINK.

Операнд B определяет, в какое место списка пользователя следует поместить вошедший транзакт. Допустимые значения:

  • FIFO - транзакт помещается в конец списка;

  • LIFO - транзакт помещается в начало списка;

  • PR - транзакты помещаются по убыванию приоритета;

  • Р - транзакты помещаются позади тех транзактов, значения соответствующего параметра которых меньше (в порядке возрастания значения параметра);

  • М1 - транзакты помещаются в порядке возрастания относительного времени их пребывания в модели.

В качестве операнда B могут использоваться и другие СЧА, кроме указанных ранее СЧА транзактов: арифметическая переменная, функция, а также выражение в скобках. В этом случае выполняется вычисление указанного операндом B для активного транзакта и для всех остальных транзактов, уже находящихся в списке пользователя, начиная с начала очереди. После этого производится упорядочивание транзактов в списке пользователя по убыванию вычисленного значения. Например, блок

LINK 3,FIFO

помещает транзакты в конец списка пользователя с номером 3 в порядке их поступления в блок. Блок

LINK Otst,P$Pol

помещает транзакты в список пользователя с именем Otst, упорядочивая их по возрастанию значения параметра с именем Pol.

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

. . .

GATE NU Rem1,Wait

SEIZE Rem1

. . .

Wait LINK Otst,FIFO

. . .

Если ОКУ Rem1 занято, блок GATE не впускает транзакт в блок SEIZE, а направляет его в блок LINK с именем Wait, и тран-закт вводится в конец списка пользователя с именем Otst.

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

. . .

GATE U Rem1,Met1

LINK Otst,FIFO

Met1 SEIZE Rem1

. . .

Здесь ОКУ Rem1 проверяется на занятость. Если ОКУ занято, транзакт проходит к следующему блоку LINK и помещается в список пользователя с именем Otst. В случае незанятости ОКУ, транзакт направляется к блоку SEIZE с меткой Met1 и занимает свободное ОКУ.

В только что рассмотренных примерах предполагается, что список пользователя неограничен, т. е. в него может помещаться любое количество транзактов. При моделировании реальных систем список пользователя может использоваться для имитации, например, входного накопителя, емкость которого, как правило, ограничена. Это ограничение можно реализовать следующим образом.

Emk EQU 10

. . .

GATE NU Rem1,Wait

SEIZE Rem1

. . .

Wait TEST L CH$Otst,Emk,Term1

LINK Otst,LIFO

Если ОКУ Rem1 занято, то блок GATE не впускает транзакт в блок SEIZE, а направляет его в блок TEST с меткой Wait, находящийся перед блоком LINK. Если текущее содержимое списка пользователя с именем Otst меньше заданной емкости Emk, тран-закт проходит в список пользователя, в противном случае направляется к блоку с меткойTerm1.

Приведем еще возможный вариант этого же фрагмента модели.

Emk EQU 10

. . .

GATE U Rem1,Met1

TEST L CH$Otst,Emk,Term1

LINK Otst,LIFO

Met1 SEIZE Rem1

Если ОКУ Rem1 занято, блок GATE пропускает транзакт к блоку TEST. Если текущее содержимое списка пользователя с именем Otst меньше заданной емкости Emk, транзакт проходит в список пользователя, в противном случае направляется к блоку с меткой Term1. Если ОКУ незанято, транзакт направляется к блоку SEIZE с меткой Met1 и занимает свободное ОКУ Rem1.