Программирование в GPSS - Создание и уничтожение транзактовСоздание транзактов осуществляется блоком GENERATE (генерировать). Этот блок имеет 5 операндов, которые определяют моменты создания транзактов, количество транзактов и их приоритет. Моменты модельного времени, в которые из блока GENERATE будут выходить транзакты, задаются операндами A,B и C. Операнд A задает длительность интервалов времени между появлениями транзактов. Например, блок
GENERATE 100
будет генерировать транзакты через каждые 100 единиц модельного времени: первый транзакт выйдет в момент 100, второй – в момент 200, третий – в момент 300 и т.д. Число генерируемых транзактов будет неограниченным. В поле B записывается модификатор. Если записанный в поле B СЧА является функцией FNj, то его называют «модификатор-функция», в противном случае – «модификатор-интервал». Модификатор используется для модификации длительности интервалов времени, заданной полем А. Рассмотрим вначале применение модификатора-интервала. Если он задан, то для каждого временного интервала поступления транзактов длительность определяется как значение случайной величины, равномерно распределенной от «А-В» до «А+В». Например, блок
GENERATE 10,5
будет генерировать транзакты через интервалы времени, длительность каждого из которых выбирается случайно в пределах от 5 до 15. Необходимо помнить, что время в GPSS всегда целое. Поэтому в пределах от 5 до 15 могут выбираться только целые значения времени. Каждое из этих 11-ти целых значений будет выбираться с одинаковой вероятностью. Таким образом, если в поле В задан модификатор-интервал, то блок GENERATE генерирует случайный поток транзактов, в котором время между транзактами равномерно распределено в диапазоне «А±В» и имеет среднее значение «А». Если же в поле В задан модификатор-функция, то для каждого временного интервала поступления транзактов длительность определяется как произведение «А*В». Пусть, например, в модели имеются строки
DIS FUNCTION C1,D3 3000,3/5000,2/6000,1 GENERATE 10,FN$DIS
В этом случае блок GENERATE будет генерировать транзакты вначале через каждые 30 единиц времени, пока модельное время не достигнет 3000 единиц, затем - через каждые 20 единиц времени, пока время не достигнет 5000 единиц, а после этого - через каждые 10 единиц времени. Если использовать блок
GENERATE 1000,FN$EXP,
где функция с меткой EXP описана ранее, то интервал времени между генерируемыми транзактами будет псевдослучайной величиной, распределенной экспоненциально и имеющей математическое ожидание 1000. Следовательно, данный блок GENERATE будет моделировать простейший (пуассоновский) поток транзактов. В поле C записывается момент создания первого транзакта, в поле D - число генерируемых транзактов. Ко всему сказанному об использовании полей A и В в блоке GENERATE необходимо добавить, что: - операнды A - D могут быть не заданы; в этом случае принимаются их значения по умолчанию: A = 0, B = 0, C=1, D = Ґ. - если при вычислении значения операнда C получен нуль, то симулятор игнорирует это значение и принимается C = 1; - если операнд A не задан или равен нулю, то обязательно должен быть задан операнд D. Приоритет создаваемых транзактов задается операндом Е. По умолчанию приоритет равен нулю.
Пример. Задания поступают в ЭВМ через каждые 5±5 мин. Принимая минуту за единицу модельного времени, поступление заданий можно смоделировать блоком
GENERATE 5,5 ;ПОСТУПЛЕНИЕ ЗАДАНИЙ.
Однако при таком описании потока заданий возникает заметная численная ошибка дискретизации: Время между поступлениями реальных заданий распределено непрерывно в интервале от 0 до 10 мин, а модельное время между транзактами может принимать только значения 1,2,3,...,10. Для уменьшения роли такой численной ошибки можно в качестве единицы времени выбрать секунду. Тогда блок, моделирующий поступление заданий, примет вид:
GENERATE 300,300 ;ПОСТУПЛЕНИЕ ЗАДАНИЙ.
Пример. Задания поступают в ЭВМ через каждые 5 мин; первое задание поступает в 0 ч, последнее - в 6 ч. Принимая за единицу времени секунду, можно поступление заданий представить в модели следующим блоком:
GENERATE 3000,,0,73.
Уничтожение транзактов осуществляется блоком TERMINATE (уничтожить). Никаких других действий этот блок не выполняет, если единственный возможный операнд A в блоке не задан. Если же задан операнд А, то его значение вычитается из содержимого счетчика транзактов. Начальное значение счетчика транзактов задается в команде START. Когда в результате входа очередного транзакта в блок TERMINATE значение счетчика становится нулевым или отрицательным, симулятор прекращает выполнение модели и передает управление программе вывода, которая распечатывает накопленные симулятором данные о модели.
|
