Программирование в GPSS - Операции занятия и освобождения устройствОперации занятия и освобождения устройств выполняются в блоках SEIZE (занять) и RELEASE (освободить). При вводе транзакта в блок SEIZE выполняется операция занятия устройства, номер или имя которого задается операндом A блока SEIZE. Номер устройства может быть задан в виде любого СЧА. Занятие устройства транзактом выполняется следующим образом. Когда транзакт направляется из какого-нибудь блока в блок SEIZE, симулятор проверяет, свободно ли требуемое устройство. Если устройство не свободно, т.е. занято или захвачено, то транзакт не может войти в блок SEIZE. Он остается в предыдущем блоке до тех пор, пока устройство не освободится. Если же устройство свободно, то симулятор без задержки передвигает транзакт в блок SEIZE и транзакт занимает устройство. В этот же момент времени транзакт направляется к следующему за SEIZE блоку. В последующем движении по модели транзакт может освободить занятое устройство. Освобождение устройства происходит в блоке RELEASE, в поле A которого указывается номер освобождаемого устройства. При составлении моделей пользователь должен соблюдать правило: освободить устройство может только тот транзакт, который его занимает. Если транзакт попытается освободить устройство, занятое или захваченное другим транзактом, симулятор прервет выполнение модели и выдаст сообщение об ошибке. Если несвободное устройство пытаются занять несколько транзактов с помощью одного или разных блоков SEIZE, то все они до момента освобождения устройства задерживаются в тех блоках, в которых находились в момент попытки перейти в блок (блоки) SEIZE. В момент освобождения устройства должен быть решен вопрос о том, какой из задержанных транзактов имеет право первым занять устройство. В GPSS этот вопрос решается следующим образом. Когда транзакты задерживаются на входе блока SEIZE, они регистрируются симулятором в списке. В этом списке транзакты упорядочиваются по приоритетам: любой транзакт с более высоким приоритетом находится впереди любого другого транзакта, имеющего более низкий приоритет. Если же приоритеты у каких-либо транзактов одинаковы, то такие транзакты упорядочиваются между собой по времени прихода: впереди оказывается транзакт, который раньше обратился к устройству. Такое упорядочение задерживаемых транзактов будем называть приоритетным. Приоритетное упорядочение является в GPSS основным способом упорядочения задерживаемых транзактов и применяется не только при обращениях к несвободному устройству, но и во многих других случаях. В момент освобождения устройства его занимает тот из задержанных транзактов, который находится в списке первым. Транзакт может занимать любое число устройств. Освобождать занятые устройства транзакт может в любом порядке.
Пример. Пусть транзакты имеют одинаковые приоритеты и изображают кинозрителей, а устройство представляет кассира в кассе кинотеатра. Каждый кинозритель приобретает у кассира билеты в течение 20 ± 5 с, в зависимости от числа билетов и необходимости получения сдачи. Кинозрители приходят через каждые 20 ± 10с, знакомятся в течение 15 ± 15с с обстановкой и занимают очередь. Общее число кинозрителей 200. Тогда имитационную модель процесса обслуживания кинозрителей кассиром мы можем описать так.
* МОДЕЛЬ РАБОТЫ КАССИРА GENERATE 20,10,,200 ;ПРИХОД ЗРИТЕЛЕЙ ADVANCE 15,15 ;ЗНАКОМСТВО С ОБСТАНОВКОЙ SEIZE 1 ;ОБРАЩЕНИЕ К КАССИРУ ADVANCE 20,5 ;ПОКУПКА БИЛЕТА RELEASE 1 ;ОСВОБОЖДЕНИЕ КАССИРА TERMINATE 1 ;УХОД ЗРИТЕЛЯ START 200 ;СЧЕТЧИК=200.
Отчет об исследовании START TIME END TIME BLOCKS FACILITIES STORAGES 0.000 4127.389 6 1 0
LABEL LOC BLOCK TYPE ENTRY COUNT CURRENT COUNT RETRY 1 GENERATE 200 0 0 2 ADVANCE 200 0 0 3 SEIZE 200 0 0 4 ADVANCE 200 0 0 5 RELEASE 200 0 0 6 TERMINATE 200 0 0
FACILITY ENTRIES UTIL. AVE. TIME AVAIL. OWNER PEND INTER RETRY DELAY 1 200 0.984 20.302 1 0 0 0 0 0
Рассмотрим логику выполнения этой модели. Первая строка модели является комментарием и симулятором не воспринимается. Блок GENERATE изображает приход зрителей: он генерирует транзакты через каждые 20 ± 10 единиц времени до тех пор, пока не будет выдано 200 транзактов. Каждый транзакт-зритель, поступивший из блока GENERATE, попадает в блок ADVANCE 15,15 и задерживается на время «ознакомления с обстановкой». Заметим, что, поскольку эта задержка случайная и может для разных транзактов отличаться на 30 единиц времени, то возможны случаи, когда позже попавшие в этот блок транзакты будут выходить из него раньше. Если транзакт направляется из блока ADVANCE 15,15 в блок SEIZE 1, в то время как устройство 1 свободно, то он входит в этот блок, занимает устройство, переходит в блок ADVANCE 20,5 и задерживается в нем. Таким образом, в течение 20 ± 5 ед. модельного времени устройство 1 будет занято. Транзакты, пытающиеся в это время перейти из блока ADVANCE 15,15 в блок SEIZE, будут задержаны и упорядочены по приоритетам. Поскольку приоритеты у всех транзактов одинаковы и равны нулю (см. блок GENERATE), то транзакты будут упорядочены в порядке времени их обращения к устройству. Следовательно, задерживаемые транзакты будут в точности изображать живую очередь к кассиру. Из блока ADVANCE 20,5 транзакт переходит в блок RELEASE 1 и освобождает устройство 1. В этот же момент времени транзакт переходит в блок TERMINATE и уничтожается. В результате из содержимого счетчика строки START вычитается 1. Моделирование будет продолжаться до тех пор, пока счетчик не станет равным нулю. В строке START задано начальное значение счетчика, которое равно 200. Следовательно, выполнение модели закончится в тот момент модельного времени, когда последний транзакт будет обслужен и освободит устройство. Строка START не только задает начальное значение счетчика. Ввод строки START является командой симулятору начать выполнение модели.
|
