Модуль 2 - модуль исполнения. В модуле записываются исполняемые операторы в той последовательности, которая предусмотрена логикой модельного файла.
Модуль 3 - модуль управления. Первый ОУ START дает команду на исполнение МФ, последний ОУ END дает команду на прекращение испытаний.
Между ними может быть размещено любое количество операторов управления автоматизацией многократного процесса получения независимых прогонов и операторов очистки данных предыдущего прогона.
В ранних версиях языка для отображения оператора любого типа использовались специальные графические эквиваленты. Однако, при создании модели достаточно сложной системы (более сотни операторов), такое графическое представление становится сложным для восприятия, особенно когда используются многочисленные пересылки.
В связи с этим, в последних версиях ЯИМ отказались от графической интерпретации и пользуются только текстовым описанием. В курсовом проекте не нужно использовать графическое представление!
Языки моделирования, основанные на имитации систем массового обслуживания, имеют некоторые принципиальные отличия в логике работы по сравнению с традиционными языками программирования. В обычных языках операторы выполняются один за другим, в том (или приблизительно в том) порядке, в котором они записаны.
Во всяком случае, исключена ситуация, когда одновременно исполняется несколько команд. Для нормальной работы компилятора типа GPSS/H, напротив, для пользователя ситуация следующая: все операторы (блоки), имеющие отношение собственно к модели, работают параллельно (и часто одновременно). Кроме того, в модели одновременно существует несколько (теоретически неограниченное количество) транзактов, динамических объектов, которые вступают во взаимодействие с ресурсами (устройствами).
Эти динамические объекты могут появляться и удаляться из модели, то есть их количество непредсказуемо наперед. Однако, при любом количестве транзактов в модели, активным в каждый момент времени является только один!
Для лучшего понимания логики работы системы моделирования необходимо разобраться в том, как именно обеспечиваются такие процессы, как определение времени появления очередного транзакта, расчет момента освобождения очередного блока транзактом и т.д.
При запуске программы, содержащей модель на GPSS/H происходит следующее: запускается счетчик времени и генератор случайных чисел. Из последовательности чисел, выдаваемых этим генератором, формируются все случайные процессы, описанные в модели. Затем, после получения реализаций всех необходимых случайных величин (всех промежутков времени, оставшихся до событий типа появления нового транзакта, освобождения очередного блока и т.д.), выбирается наименьший временной интервал (то есть ближайшее по времени событие).
Счетчик прокручивается до возникновения этого события, затем процесс повторяется до окончания моделирования по любому из возможных условий.
Таким образом, промежутки времени для нескольких ближайших событий модели на самом деле становятся известны GPSS/H задолго до их наступления. Фактически, транзакты появляются, то есть приобретают определенные атрибуты, еще до их вхождения в модель в блоке GENERATE.
Продолжая сравнение с обычными языками программирования, можно сказать, что в GPSS/H применяется особый вид псевдопараллелизма, при котором для пользователя события происходят параллельно. На самом же деле такое явление, как истинный параллелизм, то есть действительно одновременное совершение нескольких событий, недоступен в GPSS/H.
Обращение к транзактам происходит поочередно, в каждый отдельный момент реального времени существует только один активный транзакт, тот, с которым происходит ближайшее по времени изменение статуса. Информация об остальных транзактах остается статической, а сами транзакты находятся в списке будущих событий.
При работе модели происходит не только создание, продвижение и уничтожение транзактов; GPSS/H также автоматически собирает информацию (по существу статистические данные) обо всех объектах модели. Происходит подсчет периодов занятости и незанятости всех Iлоков, имитирующих устройства; поддерживаются виртуальные очереди, сведения о них также непрерывно пополняются (максимальная длина очереди, среднее и максимальное время, проводимое транзактом в очереди, количество нулевых входов, то есть транзактов, не испытавших задержки перед попаданием в устройство, и т.д.).
Итак, после сказанного можно сформулировать основные принципы работы модели:
- В каждый момент времени в модели движется только один активный транзакт, следующий начинает движение только после возникновения одного из особых состояний: а) попадания активного транзакта к одному из операторов, запрещающих дальнейшее продвижение, например SEIZE, RELEASE, PREEMPT, в этом случае транзакт ожидает входа перед оператором; б) задержка транзакта для обслуживания в операторе ADVANCE, в этом случае транзакт находится внутри оператора; в) исполнение оператора TERMINATE, в этом случае активный транзакт уходит из модели.
3.3.
- Жизненный цикл активного транзакта, состоит из зарождения, попадания в систему, прохождения через последовательность предписанных МФ операторов и терминирования (ухода из системы).
- Каждый транзакт имеет уникальный персональный идентификационный номер- (ID), закрепленный за одним единственным транзактом при его генерации. Номер всегда является целым положительным числом.
Уход из системы не всегда происходит в порядке ID, что зависит от логики работы модели.
- Каждый уходящий из модели транзакт приплюсовывает свое время пребывания в модели ко времени пребывания в системе предыдущего терминированного транзакта. Таким образом достигается непрерывность абсолютного времени моделирования.
- Порядок окончания процесса моделирования определяется соответствующими машинными алгоритмами, подробнее см. 3.5.
Вся эта информация после компиляции и моделирования оказывается записанной в так называемом файле отчета (см. ниже).
Основными объектами теории СМО являются заявки (события) и устройства (системы), выполняющие их обслуживание. При моделировании большое внимание уделяется очередям и загрузке устройств.
В соответствии с этим выбран и порядок описания операторов языка GPSS/H.
Каждый оператор ЯИМ GPSS/H состоит из двух частей: названия оператора, которое, в обязательном порядке пишется заглавными латинскими буквами, например GENERATE. Для длинных названий допустимо сокращение до четырех букв, например GENE, короткие имена, состоящие из 5 и менее букв, всегда пишутся полностью. Вторая часть, которая пишется через пробел, содержит характеристики оператора, которые называются операндами, обозначаются латинскими буквами A,B,C, и пишутся через запятую без пробелов. Некоторые операторы имеют до девяти операндов, как GENERATE, другие, как END не имеет ни одного операнда.
Операнд может быть представлен числом, именем или сложным выражением. Операнды, включаемые в квадратные скобки, могут по умолчанию отсутствовать.
Отсутствие, какого либо операнда в середине записи отмечается запятой или запятыми, если отсутствует несколько операндов. Рассмотрение операторов, проведем в соответствии с таблицей 3.2.
Описание операторов дается не по алфавиту как в (Л.2), а по значимости в МФ.
GENERATE (Генерировать, произвести, родить)
Этот оператор осуществляет генерирование входного потока заявок, управляет законом распределения временных интервалов между событиями и количеством заявок за все время моделирования.
Формат: GENERATE A,[B,C,D,E,F,G,H,I], где
А - среднее значение интервала времени;
В - разброс или модификатор среднего значения (по умолчанию - ноль);
С - время появления первого транзакта;
D - общее число генерируемых транзактов;
Е - уровень приоритета каждого транзакта (по умолчанию - ноль).
F,G,H,I параметры транзакты.
Примечание: при курсовом проектировании будут использоваться четыре или пять первых операндов.
GENERATE 2,1,,10
Эта запись читается следующим образом:
Генерируется транзакт, распределенный по равномерному закону со средним значением 2 и модификатором 1, всего будет произведено 10 таких транзактов.
Как видно из формата, по умолчанию закон распределения временных интервалов - равномерный с управляемым средним и разбросом, что позволяет, в том числе, моделировать потоки с равными интервалами. Также в GPSS/H предусмотрена возможность задавать более сложные распределения.
В том случае, когда используются встроенные функции (см. ниже), любая встроенная функция ставится на место операнда А, а операнд В отсутствует. Например:
GENERATE RVNORM(1,1,0.5),,1,4
Эта запись читается следующим образом:
Генерируется случайное число (Random Value-RV), распределенное по нормальному закону, взятое с первого генератора случайных чисел - ГСЧ
( первое число в скобках), со средним значением равным 1 и стандартным отклонением 0.5; пришедшее в систему в первую единицу времени. Всего с этого ГСЧ поступит 4 транзакта.
GENERATE RVEXPO(7,0.75),,,,5
Эта запись читается следующим образом:
Генерируется случайное число, распределенное по экспоненциальному закону, взятое с седьмого ГСЧ с параметром потока 0.75, приходящее с приоритетом 5.
В моделях GPSS/H могут применяться более одного блока GENERATE, когда надо представить различные действия для транзактов, например, клиенты банка, приходящие осуществлять различные операции в различном темпе.
Оператор GENERATE не допускает входа транзактов в него! Любой транзакт, вошедший в оператор исполнения GENERATE, вызовет ошибку исполнения и прервет работу программы с выдачей предупреждения в листинге.
TERMINATE (Уничтожить, терминировать)
Служит для удаления транзактов из модели по завершении их обработки. Производит подсчет выведенных из модели транзактов, уменьшая величину специального счетчика - счетчика завершений.
Формат: TERMINATE [A], где:
А - величина, на которую будет уменьшен счетчик завершений. По умолчанию А=0. Операнд А может принимать любые значения в интервале от 0 до плюс бесконечности. Физический смысл числового значения операнда А заключается в задании веса терминирования.
Например, на погрузочную площадку выходят двери 4 складов, большемерная фура занимает всю длину погрузочной площадки, и никакая другая машина не сможет производить погрузку. Окончание погрузки фуры (выход транзакта из системы) освобождает сразу 4 места.
Эта цифра вычитается из числа стартов (счетчика завершений), подробнее см. в 3.5.
В тех случаях, когда счетчик завершений не уменьшается с каждым транзактом, покидающим модель, моделирование может продолжаться бесконечно.
В программе может быть любое количество операторов TERMINATE, но обязательно хотя бы один из них должен иметь операнд А, отличный от нуля, хотя и все TERMINATE могут иметь отличные от нуля значения операнда А. Единственное принципиальное условие ни из одного оператора TERMINATE не должны выходить транзакты.
Итак два оператора исполнения GENERATE и TERMINATE являются особыми: в первый не могут входить транзакты, а из второго не могут выходить транзакты! Все остальные рассматриваемые операторы или блоки имеют и вход и выход.
SEIZE (завладеть), RELEASE (освободить)
Оператор SEIZE, является парным с оператором RELEASE, использование их по одиночке не допустимо. Имена, записываемые в операнде А пары должны быть идентичны.
Оператор служит приглашением ко входу в одно из устройств модели. Транзакт, подойдя к блоку SEIZE, пытается занять устройство, названное в операторе. Если устройство занято, транзакт ожидает освобождения устройства перед этим оператором. Перед оператором SEIZE может находиться любое количество транзактов.
При попадании первого транзакта на обслуживание в устройство, происходит переключение, осуществляемое программой, запрещающее вход в устройство до окончания обслуживания.
Формат: SEIZE А,
где А - имя (или номер) устройства.
Функция оператора RELEASE - моделировать освобождение устройства. Пройдя обслуживание в операторе ADVANCE, и исполнив, оператор RELEASE, транзакт переключает поименованное в операторе устройство из положения занято в положение свободно и разрешает вход в ADVANCE, первому из транзактов, ожидающих перед оператором SEIZE .
Формат: RELEASE А,
где А - имя (или номер) устройства.
ADVANCE ( продвижение вперед, успех)
Этот оператор моделирует задержку транзакта в устройстве (в терминах теории СМО - обработку заявки).
Формат: ADVANCE A,[B], где
А - среднее время задержки,
В - разброс относительно среднего значения (модификатор).
На месте операнда А, как и в операторе GENERATE, может быть задана любая встроенная функция, тогда операнд В отсутствует.
Три описанных выше оператора составляют модель простейшей СМО на языке GPSS/H. Программа, в которой имеется такая последовательность операторов, будет отслеживать все статистические характеристики устройства.
ENTER ( войти), LEAVE (отпустить)
Эта пара операторов выполняет те же функции, что и SEIZE и RELEASE, но не для устройств, а для STORAGE - хранилищ, то есть для ресурсов, к которым может обращаться более одного транзакта. Такие объекты могут быть полезны при моделировании, например, распараллеленного процесса: обработки потока деталей на нескольких одинаковых станках, выхода публики из театра через несколько дверей и т.д. Эти хранилища, или устройства параллельной обработки, должны быть предварительно описаны в программе при помощи оператора описания STORAGE (см. ниже).
По логике своей работы связки операторов SEIZE ADVANCE RELEASE; ENTER- ADVANCE- LEAVE; абсолютно одинаковы, но употребляются для разных объектов.
QUEUE ( образовать очередь), DEPART (выйти из очереди)
Помимо устройств, в которых происходит обработка заявок (задержка транзактов), необходимо собирать сведения о таких объектах, как очереди, образующиеся на входах устройств. В языке GPSS/H по умолчанию очередь образуется и функционирует нормально, но никаких сведений о ней не аккумулируется.
Для организации сбора таких данных используется пара связанных операторов: QUEUE, который отмечает постановку заявки-транзакта в хвост очереди (в терминах модели это называется конец очереди), и DEPART, собирающий статистику об уходе транзактов из очереди при освобождении устройства. Эти два оператора ставятся по желанию пользователя, не влияют на основные статистические результаты листинга и могут быть поставлены для получения интересующей пользователя информации с любого объекта модели, где может происходить образование и накопление очереди.
Они не препятствуют входу транзактов и имеют нулевое время входа. Последовательность постановки операторов:
QUEUE(имя)- SEIZE. RELEASE- DEPART (то же самое имя).
Можно создавать несколько вложенных друг в друга очередей, при этом вначале выходят из более короткой очереди, затем из длинной (см. 3.7).
Формат: QUEUE А,[B], где
А - имя очереди (имена такого рода используются не только для удобства идентификации в процессе работы с моделью, но и для указания необходимых сведений при работе в оболочке);
В - число добавляемых в очередь элементов.
Строго говоря, оператор QUEUE увеличивает текущее содержимое очереди, определенной в поле А, на величину, указанную в поле В.
При прохождении оператора DEPART транзакт покидает указанную очередь, причем счетчик длины очереди уменьшается.
Формат: DEPART A,[B], где
А - имя очереди,
В - число удаляемых из очереди элементов.
Обычно описанные выше операторы применяются в программах языка GPSS/H в традиционном порядке, обеспечивающем моделирование работы устройства (простейшей СМО) с учетом образующейся очереди и со сбором всей необходимой статистической информации. Тело программы на языке GPSS/H может, например, выглядеть следующим образом.
Пример
Предположим, в почтовое отделение приходят посылки приблизительно раз в три часа, независимо от времени суток. В зависимости от размеров посылки, ее обслуживание в отделении может с равной вероятностью занимать два, три или четыре часа. Ниже приведена простейшая программа (точнее, тело программы с опущенной нумерацией) на GPSS/H, моделирующая такой процесс:
GENERATE | 3 | Ввод в модель транзактов - посылок с интервалом в 3 часа |
QUEUE | Q1 | Постановка транзактов в очередь Q1 |
SEIZE | POST | Занятие транзактом устройства POST (начало обработки посылки) |
ADVANCE | 3,1 | Задержка транзакта на время от 2 до 4 часов |
RELEASE | POST | Освобождение устройства POST (окончание обработки посылки) |
DEPART | Q1 | Выход транзакта из очереди |
TERMINATE | 1 | Вывод транзактов из модели по одному |
СЧА | Описание |
Q(qname), Q(j) | Текущая длина очереди |
QA(qname), QA(j) | Средняя длина очереди |
QC(qname), QC(j) | Полное число транзактов, вошедших в очередь |
QM(qname), QM(j) | Максимальное число транзактов в очереди на данный момент |
QT(qname), QT(j) | Среднее время пребывания транзакта в очереди |
QX(qname), QX(j) | Среднее время пребывания транзакта в очереди (за исключением тех, которые прошли без задержки) |
QZ(qname), QZ(j) | Количество транзактов, которые не задерживались в очереди |
Второй ОБ посылает транзакт к третьему по счету блоку после рассматриваемого ОБ. Блок, к которому направляется транзакт последним ОБ, является вторым по счету от блока CPU1.
Далее приводятся примеры для варианта BOTH
1. TRANSFER BOTH,KASS1,KASS2,
2. TRANSFER BOTH,,TWO.
В примере 1 транзакт первоначально направляется к блоку с отметкой KASS1. При невозможности войти в этот блок транзакт направляется к блоку с меткой KASS2.
В примере 2 транзакт делает попытку войти в следующий блок, если ему это не удается, он направляется к блоку с именем TWO.
Пример для варианта ALL, приведём фрагмент программы :
TRANSFER ALL,FIRST,LAST,3
FIRST GATE LS AAA
ADVANCE 5
GATE LR BBB TRANSFER ,LAST+2
ADVANCE 2
TRANSFER ,LAST+2
LAST GATE LS CCC
ADVANCE 3,1
Транзакт последовательно пытается войти в следующие блоки: FIRST, FIRST+3, FIRST+6 (LAST).
Вариант вероятностного перехода
1. TRANSFER .370,THIS,THAT
В примере с вероятностью 0,37 транзакт перейдет к блоку ТНАТ (37% транзактов), а с вероятностью 0,63 - к блоку ТНIS (63% транзактов).
TEST (проверить)
Этот ОБ определяет направление движения транзакта в зависимости от выполнения условия, заданного алгебраическим соотношением. Оператор имеет расширенное поле операции, включающее общепринятые обозначения логических операций: L(меньше), LE(меньше или равно), E (равно ), NE (не равно ), G ( больше ), GE ( больше или равно ).
Формат записи имеет вид :
TEST XX A, B, C
XX - дополнительный код логической операции (L, LE, E, NE, G, GE.);
А - не имеет значения по умолчанию, представляет собой выражение, левая часть которого сравнивается с требуемой операцией, если сравнение истинно, то Хакт продвигается в следующий последовательный ОБ.
В - не имеет значения по умолчанию, представляет собой выражение, правая часть которого сравнивается с операндом А;
С - не имеет значения по умолчанию и представляет собой имя или номер ОБ к которому направляется Хакт, если результат сравнения ложный ( альтернативный адрес). Если операнд С отсутствует, а результат сравнения ложный, Хакт запрещён вход в ОБ TEST и сравнение проводится каждый раз, пока Хакт находится в СТС.
Такое обстоятельство приводит к избыточному использованию памяти, в этом случае ( операнд С не определён ) следует пользоваться ОБ GATE. Рассмотрим примеры использования ОБ
1. ТESТ LE Q1,10
2. ТЕST NE S1,PF2
3. TEST GE PF1,PF2,CPU
В первом примере транзакт задерживается, если длина очереди 1 больше 10;
Во втором примере транзакт задерживается, если текущее содержимое памяти 1 равно значению 2-го параметра транзакта форматом слово;
В третьем примере транзакт переходит к следующему блоку, если PF1 PF2, либV, в противном случае, направляется к блоку СPU.
ASSIGN (задать)
Этот ОБ изменяет атрибуты транзактов. К числу таких атрибутов относятся значения, записываемые в полях операндов F- I ОБ GENERATE. операнды F,G,H,I, относящиеся к параметрам транзакта, задаются по умолчанию в виде листов параметров и с помощью ОБ ASSIGN могут быть видоизменены.
Формат ОБ ASSIGN имеет вид:
ASSIGN A,B,C,D
A - не имеет значения по умолчанию , определяет имя или номер параметра, которому назначается значение. Если последний символ в операнде А + или -, то параметр уменьшается или увеличивается на значение, определяемое операндом В.
В - не имеет значения по умолчанию, представляет собой замещаемое значение, которое вычитается или прибавляется к значению операнда А, если модифицируется параметр, представляемый числом с плавающей точкой, то операнд В то же должен иметь такой вид.
С не имеет значения по умолчанию, определяет имя или номер оцениваемой функции, значение операнда В умножается на значение функции, предварительно определив знак функции.