Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Моделирование в GPSS World
6.2.6.2. Блок DISPLACE
Блок DISPLACE предназначен для нахождения любого тран-закта и перемещения его к новому блоку. Блок DISPLACE имеет формат:
DISPLACE A,B,[C],[D]
Операнд А - номер транзакта, который нужно переместить.
Операнд B - метка блока, к которому перемещается транзакт, указанный операндом А.
Операнд С - номер параметра перемещаемого транзакта, в который записывается оставшееся до конца его обслуживания время, если он находился в списке будущих событий.
Операнд D - метка альтернативного блока для транзакта.
Операнды А, B, С и D могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр. Например:
DISPLACE (P2+32),Term3,Ostatok,Met2
Операнд А указан выражением в скобках. Это выражение вычисляется и округляется до целого. Полученный результат является номером транзакта, который следует переместить. Далее блок DISPLACE отыскивает этот транзакт. При этом возможны случаи:
- транзакт есть в модели, и не находится в списке будущих событий;
- транзакт есть в модели, и находится в списке будущих событий;
- транзакта с нужным номером нет в модели. В первом случае транзакт перемещается к блоку с меткой
Term3. Во втором случае определяется время, оставшееся до его повторного ввода в процесс моделирования, и записывается в параметр с именем Ostatok. Если параметра с таким именем нет, он создается. Транзакт также перемещается к блоку с меткой Term3. В третьем случае, т. е. когда в модели нет транзакта с нужным номером, активный транзакт, вошедший в блок DISPLACE, направляется к блоку с меткой Met2. Если операнда D нет, активный транзакт переходит к следующему блоку.
Когда транзакт перемещается к новому блоку, он исключается из списков:
- будущих событий;
- отложенных прерываний (для прерывающих транзактов);
- задержки (в порядке приоритета);
- пользователя;
- повторных попыток. И не исключается из списков:
- текущих событий;
- прерываний (для прерванных транзактов);
- групп.
При перемещении прерванные выполнения в устройствах не сбрасываются.
Это означает, что перемещаемый транзакт продолжает занимать устройство. Следовательно, если необходимо, нужно освободить устройство.
Пример использования блока DISPLACE приведен в п. 6.8.2.
6.2.7. Прерывание функционирования одноканального устройства
Если на входе ОКУ образуется очередь, выбор транзакта для ОКУ занятия после его освобождения происходит:
- в порядке поступления (FIFO) - для транзактов с равными приоритетами;
- с учетом приоритета, указанного операндом Е блока GENERATE.
При этом очередной транзакт с большим приоритетом ждет окончания обслуживания предыдущего транзакта независимо от его приоритета. Приоритет учитывается только в образующейся очереди. В ней транзакты выстраиваются в приоритетном порядке.
Такой режим функционирования ОКУ организуется блоками SEIZE и RELEASE, рассмотренными в п. 6.2.2.
Однако может возникнуть необходимость смоделировать ситуацию, когда очередной транзакт должен занять ОКУ, прервав обслуживание предыдущего транзак-та. Такое прерывание называется "захватом" ОКУ и моделируется блоком PREEMPT (захватить). Формат блока:
PREEMPT A,[B],[C],[D],[E]
Операнд А - имя или номер захватываемого ОКУ.
Когда ОКУ свободно (см. блок-диаграмму), блок PREEMPT работает также, как и блок SEIZE.
При занятом ОКУ блок PREEMPT функционирует либо в приоритетном режиме, либо в режиме прерывания. Режимы определяются операндом B:
- PR - приоритетный;
- по умолчанию ( B не используется) - режим прерывания.
6.2.7.1. Прерывание в приоритетном режиме
В приоритетном режиме прервать обслуживание предыдущего (обслуживаемого) транзакта, т. е. "захватить" ОКУ, может только транзакт с большим приоритетом. Если приоритет претендующего на занятие ОКУ транзакта равен или ниже приоритета обслуживаемого транзакта, он помещается в список задержки ОКУ последним в своем приоритете.
Что делать с транзактом, обслуживание которого прерывается? Это определяют операнды С, D и Е.
Операнд С - имя или номер блока, куда должен быть направлен прерванный транзакт.
Операнд Е при значении RE определяет режим удаления прерванного транзакта.
Операнд D - номер параметра прерванного транзакта, в который записывается оставшееся до завершения обслуживания время.
Операнды А, С, D и Е могут быть именем, положительным целым числом, выражением в скобках, СЧА или СЧА*параметр.
Транзакт, захвативший ОКУ, освобождает его от захвата вхождением в блок RETURN.Формат блока:
RETURN A
Операнд А - имя или номер освобождаемого ОКУ. Например:
RETURN Rem1
Освободить от захвата ОКУ Rem1.
Применение блоков PREEMPT и RETURN показано в п. 6.5.5.
6.2.7.2. Прерывание в режиме "захвата"
В режиме "захвата", если ОКУ уже используется, активный транзакт помещается в список отложенных прерываний или "захватывает" ОКУ. Прерывание обслуживания сразу, а не помещение транзакта в список, происходит тогда, когда список отложенных прерываний пуст и обслуживаемый транзакт сам не является "захватчиком".
Транзактам из списка отложенных прерываний предоставляется право занять ОКУ ранее, чем прерванным транзактам или транзак-там из списка задержки ОКУ.
6.2.7.3. Проверка состояния одноканального устройства, функционирующего в приоритетном режиме
Проверка состояния ОКУ в приоритетном режиме может проводиться блоком GATE, а также с использованием булевой переменной и блока TEST.
Рассмотрим проверку состояния ОКУ блоком GATE.
Условие проверки задается одним из следующих условных операторов Х:
- I - ОКУ, заданное операндом А, прервано;
- NI - ОКУ, заданное операндом А, не прервано.
Например:
GATE I Stan GATE NI (V$Rasp-3) GATE I Print,Udal GATE I *1
В первом примере блок 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 A,[B],[C],[D],[E],[F],[G],[H]
Блок делает недоступным ОКУ с именем или номером, указываемым операндом А (см. блок-диаграмму).
Все транзакты, обрабатываемые блоком 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 A
Блок FAVAIL изменяет состояние ОКУ на доступное, т. е. восстанавливает обычный режим вхождения транзактов в ОКУ. Все транзакты, ожидающие доступного состояния ОКУ, указанного операндом А, активизируются и могут попытаться занять его.
Применение блоков FUNAVAIL и FAVAIL показано в п. 6.7.5.
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.
6.2.9.2. Вывод транзактов из списка пользователя в условном режиме
Для вывода одного или нескольких транзактов из списка пользователя и помещения их обратно в список текущих событий служит блок UNLINK (вывести из списка), имеющий следующий формат:
[имя] UNLINK X A,B,C,[D],[E],[F]
Операндом А указывается имя или номер списка пользователя.
Операнд B - метка блока, в который переходят выведенные из списка пользователя транзакты.
Операндом С указывается число выводимых транзактов или ключевое слово ALL для вывода всех находящихся в списке транзактов. По умолчанию, т. е. когда не используется операнд С, берется слово ALL.
Операнды D и E вместе с условным оператором Х определяют способ и условия вывода транзактов из списка пользователя. Значения оператора Х те же, что и в блоке TEST. В случае, когда условный оператор Х должен использоваться, но не указан, по умолчанию он принимает значение Е (равенство). Если операнды D и Е не используются, не указывается и условный оператор Х. В этом случае транзакты выводятся с начала списка, а количество выводимых транзактов определяется обязательным операндом С.
Операнд D может быть:
- булевой переменной;
- номером параметра транзакта;
- ключевым словом BACK.
Если операнд D является булевой переменной, операнд Е и оператор Х не используются. Булева переменная вычисляется относительно транзакта, находящегося в списке пользователя. Если результат не нуль, т. е. условие вывода выполняется, транзакт выводится. Количество выводимых транзактов определяется операндом С. Однако выведено может быть и меньше, чем указано операндом С: по числу не нулевых результатов вычисления булевой переменной. Кроме того и транзактов в списке пользователя может быть меньше, чем указано операндом С.
Если операндом D указано ключевое слово BACK, также операнд Е и условный оператор Х не используются, а транзакты выводятся с конца списка в количестве, определяемом обязательным операндом С.
Если операнд D не булева переменная и не ключевое слово BACK, должны быть указаны операнд Е и условный оператор Х. Операнд D вычисляется относительно транзакта, находящегося в списке пользователя, и используется в качестве номера параметра, значение которого сравнивается с результатом вычисления операнда Е.
Если операнд D задает параметр, а операнд Е не используется, значение параметра транзакта из списка пользователя сравнивается со значением такого же параметра выводящего транзакта. Если они равны, транзакт выводится из списка пользователя. И в этом случае количество выводимых транзактов определяется операндом С.
Операндом F указывается имя блока, куда переходит транзакт, выходящий из блока UNLINK, если из списка пользователя не выведен ни один транзакт. Если операнд F не используется, выходящий транзакт переходит в следующий блок независимо от количества выведенных транзактов.
Например, блок
UNLINK 4,Apd,1
выводит из списка пользователя с номером 4 один транзакт с начала списка и направляет его в блок с меткой Apd. Блок
UNLINK Otst,Mars,1,BACK
выводит из списка пользователя с именем Otst один транзакт с конца списка и направляет его в блок с меткой Mars. Блок
UNLINK E P$Wiw,App1,ALL,App2,P$App2,App3
выводит из списка пользователя, номер которого записан в параметре Wiw выводящего транзакта, и направляет в блок с меткой App1 все транзакты, содержимое параметра App2 которых равно содержимому одноименного параметра выводящего транзакта. Если таких параметров в списке не окажется, выводящий транзакт будет направлен в блок с меткой Аpp3, в противном случае - к следующему блоку.
Примеры применения списков пользователя (блоков LINK и UNLINK ) показаны в п. 6.3 и 6.7.