Федеральное агентство по образованию Национальный исследовательский ядерный университет «МИФИ»
С.П. Бычков
А.А. Храмов...
13 downloads
416 Views
549KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Федеральное агентство по образованию Национальный исследовательский ядерный университет «МИФИ»
С.П. Бычков
А.А. Храмов
ПРОГРАММИРОВАНИЕ В СИСТЕМЕ МОДЕЛИРОВАНИЯ GPSS
Учебное пособие
Москва 2010
УДК 004.4 (075) ББК 32.973.26-018.2я7 Б 95
Бычков С.П.
, Храмов А.А. Программирование в системе моделирования GPSS. Учебное пособие. М.: НИЯУ МИФИ, 2010. - 60с.
Пособие предназначено для изучения средств построения имитационных моделей систем массового обслуживания в системе моделирования GPSS. Содержит краткие сведения об основных средствах системы GPSS. Приведены примеры моделей в системе моделирования. Пособие является основой для проведения занятий по дисциплине «Теория игр и исследование операций. Моделирование систем» по специальности «Прикладная математика и информатика». Рецензент с.н.с. ИПМ им. М.В. Келдыша РАН, канд. физ.-мат. наук В.А. Фисун Рекомендовано редсоветом НИЯУ МИФИ к изданию в качестве учебного пособия.
ISBN 978-5-7262-1298-2 © Национальный исследовательский ядерный университет «МИФИ», 2010
ОГЛАВЛЕНИЕ 1. Основные средства системы GPSS…………………………..….4 1.1. Общая характеристика GPSS…………………………….…4 1.2. Типы объектов в GPSS.........................…………………..…6 1.2.1. Динамические объекты.................……………..…….….6 1.2.2. Объекты типа "оборудование".............………..…….….7 1.2.3. Статистические объекты...............…………..…….…....8 1.2.4. Операционные объекты.....................………..………....8 1.2.5. Операторы управления моделью…………………….…9 1.3. Организация работы модели в системе GPSS……………9 1.4. Изображение блоков в GPSS - модели........……………..12 2. Основные блоки системы GPSS………………………………….14 2.1. Задержка транзактов. Блок ADVANCE.....………………...14 2.2. Блоки, описывающие работу устройств.....……………….15 2.2.1. Блоки SEIZE и RELEASE....................………………….16 2.2.2. Блоки PREEMPT и RETURN...................………………17 2.3. Накопители. Блоки ENTER и LEAVE..........……………….19 2.4. Очереди. Блоки QUEUE и DEPART............……………….22 2.5. Логические ключи. Блоки LOGIC и GATE.....……………..25 2.6. Создание и уничтожение транзактов. Блоки GENERATE и TERMINATE........…………..………..……………………27 2.7. Размножение транзактов. Блок SPLIT......………………..30 2.8. Синхронизация транзактов. Блоки ASSEMBLE, MATCH и GATHER........................…………..………………….……….31 2.9. Изменение значений параметров транзактов. Блок ASSIGN................................……………………………..…………33 2.10. Отметка времени. Блок MARK..................……………….34 2.11. Приоритеты транзактов. Блок PRIORITY……….……….35 2.12. Изменение маршрутов движения транзактов в модели. Блок TRANSFER...................………………….35 2.13. Таблицы. Блоки TABULATE и TABLE......…….....……….37 2.14. Пример модели. Модель порта.................…………….…39 3. Дополнительные возможности системы GPSS ……………….40 3.1. Организация цикла. Блок LOOP.................……………….40 3.2. Обработка прерываний с приоритетами......……………..41 3.3. Сравнение значений. Блок TEST................…………..…..43 3.4. Переменные...................................……………………..…..44 3.5. Хранимые значения............................……………..……… 48 3.6. Функции......................................…………………….……... 50 3.7. Пример модели………………………………..……………... 53 3.7.1. Модель вычислительного центра…….……………….53 3.7.2. Модель многоканальной СМО………………………….54 Список литературы............................…....………………………….57
3
1. ОСНОВНЫЕ СРЕДСТВА СИСТЕМЫ GPSS В практике исследования и проектирования сложных систем часто встречаются системы, функционирование которых состоит в обработке потоков заявок (клиентов, сигналов, сообщений и т.д.), проходящих через обслуживающие приборы. Такие системы принято называть системами массового обслуживания (СМО). Для моделирования СМО разработан ряд систем имитационного моделирования. Наиболее популярной для моделирования СМО является система GPSS. Наиболее полно система моделирования GPSS описана в монографии /1/, а в работах /3, 4, 5/ наряду с кратким описанием языка приводятся многочисленные примеры его применения в различных областях. Система моделирования GPSS является удачной реализацией понятий СМО и не является языком программирования. Системы, модели которых могут быть реализованы с помощью GPSS, называются системами с дискретными событиями. Для моделирования СМО может использоваться язык Симула-67 /6/. Симула-67 – это язык программирования, ориентированный на широкий класс задач. В плане моделирования Симула-67 позволяет разрабатывать модели как систем с дискретными событиями, так и модели непрерывных систем. Симула-67 является одним из первых языков программирования (наряду со Smalltalk), в котором используется подход, названный позднее объектноориентированным. Создание модели является лишь частью работы. Основная задача состоит в исследовании модели и в определении зависимости одних параметров модели (моделируемой системы) от других параметров. 1.1. Общая характеристика GPSS Система GPSS (General Purpose System Simulator) предназначена для написания имитационных моделей систем с дискретными событиями. Наиболее удобно в
4
системе GPSS описываются модели систем массового обслуживания, для которых характерны относительно простые правила функционирования составляющих их элементов. В системе GPSS моделируемая система представляется с помощью набора абстрактных элементов, называемых объектами, каждый из которых принадлежит к одному из типов объектов. Объект каждого типа характеризуется определенным способом поведения и набором атрибутов, которые определяются типом объекта. Например, если рассмотреть работу порта, выполняющего погрузку и разгрузку прибывающих судов, и работу кассира в кинотеатре, выдающего билеты посетителям, то можно заметить большое сходство в их функционировании. В обоих случаях имеются объекты, постоянно присутствующие в системе (порт и кассир), которые обрабатывают поступающие в систему объекты (корабли и посетители кинотеатра). В теории массового обслуживания эти объекты называются приборами и заявками. Когда обработка поступившего объекта заканчивается, он покидает систему. Если в момент поступления заявки прибор обслуживания занят, то заявка становится в очередь, где и ждет до тех пор, пока прибор не освободится. Очередь также можно представлять себе как объект, функционирование которого состоит в хранении других объектов. Каждый объект может характеризоваться рядом атрибутов, отражающих его свойства. Например, прибор обслуживания имеет некоторую производительность, выражаемую временем, которое он затрачивает на обработку одной заявки. Сама заявка может иметь атрибуты, учитывающие время ее пребывания в системе, время ожидания в очереди и т.д. Характерным атрибутом очереди является ее текущая длина, наблюдая за которой в ходе работы системы (или ее имитационной модели), можно определить ее среднюю длину за время работы (или моделирования). Большая часть необходимой статистики собирается в GPSS автоматически и не требует поэтому дополнительных
5
усилий разработчика модели. Всю статистику, выводимую системой, можно разделить на статическую и динамическую. Статистические данные, которые выводятся системой моделирования GPSS после завершения работы модели или после очередного прогона модели, являются итоговыми, статическими. Стандартные числовые атрибуты (СЧА) и стандартные логические атрибуты (СЛА) обеспечивают доступ к динамической статистике – характеристикам объектов модели в процессе моделирования. Эти характеристики могут использоваться блоками модели в процессе моделирования. Описание модели должно начинаться описательным блоком SIMULATE. Завершает описание модели описательный блок END. Система моделирования GPSS читает блоки модели до описательного блока START и начинает работу модели. При одном обращении к системе моделирования модель можно перезапускать несколько раз с различными параметрами. В следующем разделе рассмотрим общую характеристику основных типов объектов в GPSS и статистику, которая связана с этими блоками. 1.2. Типы объектов в GPSS Средства GPSS для разработки и выполнения модели можно разделить на операторы, управляющие работой системы GPSS, и объекты. Объекты разделяются на блоки и динамические объекты. Блоки в GPSS подразделяются на: выполняемые, через которые проходят транзакты; описательные на этапе выполнения отсутствуют. Выполняемые блоки разделяются на блоки типа “оборудование”, статистические и операционные. 1.2.1. Динамические объекты Динамические объекты, называемые в GPSS транзактами, служат для моделирования заявок на обслуживание
6
(корабли, посетители кинотеатра, покупатели). Транзакты могут порождаться во время моделирования и уничтожаться (покидать систему). Порождение и уничтожение транзактов выполняется специальными объектами (блоками) GENERATE и TERMINATE, работа которых будет рассмотрена ниже. Если обратиться к модели порта, как к системе массового обслуживания, то приходящие в порт корабли можно отобразить в модели с помощью транзактов: каждому кораблю, входящему в порт, соответствует в модели отдельный транзакт. Каждый транзакт может иметь несколько (до 100) числовых параметров, значения которых можно изменить в процессе моделирования. Обращение к параметрам транзакта выполняется по их номеру. У каждого транзакта имеется параметр, связанный со временем пребывания транзакта в системе, и параметр, который определяет приоритет транзакта. В процессе моделирования транзакты проходят через другие объекты модели, производя в них некоторые действия и, в свою очередь, испытывая на себе их влияние. 1.2.2. Объекты типа "оборудование" С помощью объектов этого типа в моделях на языке GPSS представляются различные элементы систем, через которые проходят транзакты. Транзакт, поступивший на объект типа "оборудование", изменяет состояние этого объекта. В системе GPSS имеются три типа объектов типа "оборудование": "устройство", "память", "логический ключ". “Устройства” используются для представления в модели приборов обслуживания, возможных "узких" мест и т.д. При моделировании порта, например, с помощью устройств можно представить пристани, портальные краны. Устройство может находиться в свободном состоянии или может быть занято транзактом, причем только одним в каждый момент времени. В системе GPSS с устройствами "работают" блоки SEIZE, RELEASE, PREEMPT, RETURN.
7
Объекты типа "память" (или "накопитель") служат для реализации различного рода хранилищ, например: портовых складов, емкостей, автостоянок, памяти ЭВМ и т.д. Каждая память характеризуется конечным объемом, который может быть частично или полностью занят. Одна память может быть одновременно занята несколькими транзактами. Используются блоки STORAGE, ENTER, LEAVE. “Логические ключи” – это объекты, каждый из которых может находиться в одном из двух состояний: "включен" или "выключен". Транзакт, проходя через логический ключ, может в зависимости от его состояния изменять маршрут движения по модели, а также менять состояние самого логического ключа. Управляет состоянием ключей блок LOGIC. Проверяет состояние ключа блок TEST. 1.2.3. Статистические объекты Статистические объекты применяются для сбора и обработки данных, характеризующих работу моделируемой системы. В системе GPSS имеются два типа статистических объектов: "очередь" и "таблица". Каждый объект типа "очередь" (в дальнейшем просто "очередь") содержит список транзактов, задержанных в одном или нескольких пунктах системы, и ведет в процессе моделирования подсчет среднего числа задержанных транзактов, среднего времени задержки каждого транзакта и других статистических характеристик соответствующей очереди. Используются блоки QUEUE и DEPART, QTABLE. Объекты типа "таблица" используются для получения гистограмм случайных величин, распределение которых интересует исследователя. Построение таблиц выполняется блоками TABULATE, TABLE, QTABLE. 1.2.4. Операционные объекты К операционным объектам, называемым также блоками, относятся объекты нескольких типов, которые служат для задания логики работы системы путем определения
8
маршрутов движения транзактов и изменений в состоянии системы, обусловленных прохождением транзактов через операционные объекты. Основные операционные объекты (SPLIT, ASSEMBLE, TEST, TRANSFER, GATE, LOOP, GATHER) будут подробно рассмотрены после описания общей схемы работы моделей в системе GPSS. Правила функционирования операционных объектов составляют основную часть семантики модели GPSS. 1.2.5. Операторы управления моделью При одном обращении к системе моделирования операторы управления моделью позволяют перезапускать модель несколько раз с различными параметрами и получать, тем самым, различные статистические данные о работе модели. Система моделирования GPSS читает блоки модели до описательного блока START и начинает работу модели. Между блоками START и END могут быть размещены другие блоки START, а также блоки CLEAR, INITIAL, REPORT /5/. Система моделирования опять читает блоки модели до очередного блока START и начинает работу модели. 1.3. Организация работы модели в системе GPSS Для лучшего понимания работы объектов, определенных в GPSS, целесообразно рассмотреть несколько общих вопросов, касающихся работы системы моделирования GPSS. На рис. 1.1 изображена общая схема проведения имитационного моделирования в системе GPSS. Модель, дополненная необходимыми управляющими предложениями операционной системы, вводится в ЭВМ и поступает на обработку программой перевода текста модели на GPSS во внутреннюю форму. Эта программа проводит синтаксический анализ модели и преобразует ее во внутреннюю форму, удобную для проведения моделирования – ассемблер GPSS.
9
Модель на GPSS
Модель на ассемблере GPSS
Программа перевода модели на ассемблер GPSS
Интерпретатор GPSS
Результаты работы модели Рис. 1.1. Моделирование в системе GPSS
Модель на ассемблере передается интерпретатору модели, который выполняет моделирование. Во внутренней форме все объекты, описанные в модели, получают последовательные номера в порядке поступления. Последовательности номеров выстраиваются отдельно по типам объектов: среди устройств, накопителей, очередей и т.д. Эти номера могут быть напрямую указаны в тексте модели программистом. Интерпретатор модели является основной частью системы моделирования GPSS. Главной функцией интерпретатора является создание транзактов и проводка их через блоки модели с одновременным выполнением действий, связанных с каждым блоком. Движение транзактов в модели соответствует движению отображаемых ими объектов в реальной системе. Всякое изменение состояния модели, например переход транзакта от одного блока к другому, можно рассматривать как некоторое событие, происходящее в определенный
10
момент условного (системного) времени, задаваемого "часами" системы, работа которых организуется интерпретатором. Фактически, "часы" в интерпретаторе GPSS – это целая переменная, значение которой соответствует текущему моменту системного времени модели. При построении модели пользователь должен задаться соотношением единицы системного времени, используемого в модели, к реальному времени, в котором происходит функционирование моделируемой системы. Отметим, что системное время никак не связано с машинным временем, затрачиваемым на выполнение моделирования. При разработке модели программист должен определить «вес» единицы системного времени и везде в модели учитывать этот вес. В процессе моделирования интерпретатор автоматически определяет правильную очередность наступления событий. В случае, если нужные действия в намеченный момент времени не могут быть выполнены (например, занято устройство, к которому обращается транзакт), интерпретатор временно прекращает обработку "застрявшего" транзакта, но продолжает следить за причиной, которая вызвала блокировку его обработки. Как только эта причина исчезает (например, освобождается занятое устройство), интерпретатор возвращается к обработке задержанного транзакта. При продвижении транзактов через блоки могут происходить события четырёх основных типов: 1. Создание или уничтожение транзакта; 2. Изменение значения атрибута объекта или параметра транзакта; 3. Задержка транзакта на некоторый промежуток системного времени; 4. Изменение маршрута движения транзакта по блокам модели. Модель на GPSS представляет собой последовательность предложений, изображающих объекты того или иного типа, а ее работу нужно представить как одновременное движение транзактов через блоки модели в разных ее частях. Таким
11
образом, в отличие от традиционных языков программирования в GPSS по модели идет не управление, а транзакты. 1.4. Изображение блоков в GPSS-модели При описании блоков в квадратных скобках указан операнд или метка, которые могут быть опущены. В качестве метки обычно используется идентификатор ограниченной длины. Первые три символа – обязательно буквы. Различные реализации системы GPSS допускают различные написания меток, операндов и стандартных числовых и логических атрибутов. Комментарий записывается через пробел за операндами или целой строкой со звездочкой в первой позиции. В качестве операндов могут быть использованы стандартные числовые и логические атрибуты. В GPSS применяется бланковая форма записи программ, т.е. требуется учитывать номер колонки в записи. Каждый блок записывается в отдельной записи, которая разбивается на ряд полей: поле метки, поле операции, поле операндов и поле комментария. Операндов может быть 7. Они обозначаются буквами А, В, С, D, E, F, G (рис. 1.2). Количество операндов и их значения зависят от блока. Пробел один или несколько между полями обязателен. Метка 1 6 MET1 *пример
7
Операция 8 18 ADVANCE комментария
19
A, B, C, D, E, F, G 20 10,5 комментарий
Рис. 1.2. Формат записи для модели GPSS
В поле метки (позиции 1–6) программист может поместить символическую метку блока, по которой он может обращаться к нему, например передавать на него транзакты из других блоков модели. Первый символ метки должен быть в первой позиции. Поле операции (позиции 8–18) служит для задания типа блока, а поля операндов – для задания его операндов.
12
При записи операнды блоков разделяются запятыми. Операнды позиционные. Если какой-либо из операндов пропускается, то соответствующая ему запятая сохраняется при условии, что правее его имеется, хотя бы один операнд. Концом поля операндов считается первый пробел после 19 позиции. Вслед за ним может быть помещен комментарий. При необходимости комментарий может занимать всю строку. Тогда в ее первую позицию нужно записать символ *(звездочка). В некоторых реализациях системы GPSS нет бланковой формы записи, т.е. они допускают разделение полей одним или несколькими пробелами без соблюдения позиций. Кроме описания всех блоков, составляющих модель, интерпретатору для проведения моделирования нужна еще некоторая дополнительная информация, например продолжительность счета, указания о повторных запусках модели и т.д. Эта информация задается с помощью специальных управляющих операторов интерпретатора. Модель должна начинаться управляющим оператором SIMULATE. Заканчивается модель оператором END. Исходный текст модели система моделирования читает до оператора START, в котором задается значение счетчика для завершения моделирования. Поэтому все блоки модели как выполняемые, т.е. те, через которые проходят транзакты, так и декларативные для накопителей, функций, переменных, таблиц и так далее должны быть размещены до оператора START. “Начать моделирование” START Значение_счетчика Пример: START 200 Работа модели остановится после того, как через блок TERMINATE 1 пройдет 200 транзактов. Из счетчика, указанного в START, вычитается значение, указанное в TERMINATE. Некоторые реализации системы GPSS допускают повторные запуски модели путем указания операторов управления моделью и других операторов START, которые следуют друг за другом /5/. Для всех выполняемых блоков, составляющих модель,
13
после завершения работы модели выводится номер блока, имя блока, количество транзактов, задержанных в блоке на момент завершения моделирования, и общее количество транзактов, вошедших в блок. Эти данные помогают собрать часть статистики и проанализировать работу модели, что особенно полезно при отладке модели. СЧА для блоков: Nj – число транзактов, вошедших в блок j; Wj – число транзактов, ожидающих входа в блок j. Пример: N31, W73 Значением первого СЧА является количество транзактов, вошедших в блок с номером 31 на момент обращения к СЧА. Значением второго СЧА является количество транзактов, ожидающих на момент обращения к СЧА входа в блок с номером 73 (очередь к блоку 73). Например: N31=350, W73=23. Некоторые реализации требуют, чтобы всем идентификаторам в программе были заранее присвоены целые числа с помощью оператора EQU. Например: Comp Equ 4. Во многих блоках вместо идентификаторов – имен устройств, памяти, очередей – могут быть использованы целые числа. 2. ОСНОВНЫЕ БЛОКИ СИСТЕМЫ GPSS 2.1. Задержка транзактов. Блок ADVANCE Удобным средством моделирования различного рода обслуживания, длящегося некоторый промежуток времени, является задержка транзакта, которая выполняется в GPSS с помощью блока ADVANCE. “Задержать транзакт” [Метка] ADVANCE Среднее_значение_задержки [,Отклонение_от_среднего] | [,Имя_функции или Номер_функции] Пример: ADVANCE 37,7 Поля А и В блока ADVANCE служат для задания времени, на которое этот блок задерживает входящий в него
14
транзакт. Постоянное время задержки указывается в поле А, при этом поле В остаётся пустым. Пример: ADVANCE 50 выполняет задержку транзакта на 50 единиц системного времени. Если нужно задать задержку на случайное время, то используются следующие формы блока ADVANCE. Время задержки имеет равномерное распределение в интервале [Т1, Т2]. В этом случае в поле А указывается среднее значение интервала времени, а в поле В – максимальное отклонение от среднего. Пример: задать задержку в интервале от 7 до 21 единицы времени ADVANCE 14,7 Время задержки может иметь более сложное распределение. В этом случае время задержки определяется умножением числа, заданного в поле А, на значение функции, указанной в поле В. Эта функция определяет требуемый закон распределения случайных чисел. Пример: ADVANCE 100,FN$EXPON задает задержку на f единиц времени, где f – целая часть от произведения 100 на значение функции EXPON. Функции описаны в п.3.6. 2.2. Блоки, описывающие работу устройств В GPSS транзакты могут оказывать на устройства определенные воздействия, которые часто встречаются при имитационном моделировании СМО. Содержание воздействия определяется блоком, через который проходит транзакт, а конкретное устройство, на которое направлено это воздействие, задается в поле операндов этого блока. В GPSS устройства задаются при помощи номеров или имен, употребленных в соответствующих блоках модели.
15
2.2.1. Блоки SEIZE и RELEASE В результате входа транзакта в блок SEIZE указанное в нем устройство становится занятым данным транзактом и остается в этом состоянии до тех пор, пока тот же самый транзакт не пройдет через блок RELEASE, указывающий на это же устройство. Один транзакт может занять любое число устройств, но каждое устройство в любой момент времени может быть занято лишь одним транзактом. “Занять устройство без приоритета” [Метка] SEIZE Устройство Пример: SEIZE IBM5 “Освободить устройство” [Метка] RELEASE Устройство Пример: RELEASE IBM5 Устройство указывается с помощью имени или номера. Если устройство, указанное в блоке SEIZE, уже занято, то другой транзакт не может войти в этот блок и задерживается перед ним до момента освобождения устройства. Несколько транзактов, задержанных на входе блока SEIZE, обслуживаются в порядке поступления. Освобождение устройства выполняется блоком RELEASE, который при прохождении через него транзакта переводит указанное в нем устройство в состояние "свободно", если это устройство было занято именно этим транзактом. При попытке освободить устройство другим транзактом выдается сообщение об ошибке. Вывод данных об устройствах и СЧА для них рассматриваются в п. 2.2.2. Пример. Рассмотрим участок модели, который моделирует обслуживание заявок сначала прибором СТАН1 в течение от 5 до 15 единиц времени, а затем одновременно двумя приборами СТАН2 и СТАН3 в течение 14 единиц времени. Метка Операция A, B, C, D, E, F, G SEIZE СТАН1 занять СТАН1 ADVANCE 10,5 обработка RELEASE СТАН1 освободить СТАН1 SEIZE СТАН2 занять СТАН2
16
SEIZE ADVANCE RELEASE RELEASE
СТАН3 14 СТАН2 СТАН3
занять СТАН3 обработка освободить СТАН2 освободить СТАН3
2.2.2. Блоки PREEMPТ и RETURN С помощью этих блоков удобно описывается приоритетное обслуживание, т.е. обслуживание с прерыванием. В этом случае обслуживающий прибор временно прекращает обработку поступившей на него заявки и переходит на обслуживание "срочной" заявки и, обслужив ее, возвращается к обслуживанию первой менее приоритетной заявки. Блок PREEMPT “Захватить устройство” имеет две формы. Первая форма, более простая, используется, как правило, совместно с блоком SEIZE, который занимает устройство раньше и задает обслуживание менее приоритетного транзакта. Когда другой транзакт входит в блок PREEMPT, PREEMPT прерывает обслуживание менее приоритетной заявки и выполняет обслуживание на этом устройстве более приоритетной заявки. Первая форма задаёт два уровня приоритетов. Один уровень связан с блоком SEIZE и задаёт фоновый уровень. Второй уровень приоритета задаётся первой формой PREEMPT. “Захватить устройство по двухуровневому приоритету” [Метка] PREEMPT Устройство Пример: SEIZE CHANL и PREEMPT CHANL. Транзакты с различными приоритетами попадают на устройство в первой форме в порядке общей очереди. При поступлении транзакта на блок PREEMPT при использовании первой формы происходит следующее: - устройство, указанное в поле А этого блока, прерывает обслуживание транзакта, который его занимал блоком SEIZE (этот транзакт будем называть прерванным), и начинает обслуживание прерывающего транзакта; - прерванный транзакт ждет окончания обслуживания прерывающего транзакта. При этом время его ожидания не
17
фиксируется; - обслуживание устройством прерывающего транзакта прекращается тогда, когда этот транзакт пройдет блок RETURN, в котором указано это устройство: “Вернуть захваченное устройство” [Метка] RETURN Устройство Пример: RETURN CHANL; - если в момент поступления транзакта на блок PREEMPT указанное в нем устройство уже занято обслуживанием прерывания (был транзакт, который вошел в PREEMPT с этим устройством), то транзакт задерживается на входе блока PREEMPT. Когда указанное устройство закончит обслуживание первого прерывания, транзакт, задержанный на входе блока PREEMPT, войдет в него, если его приоритет опять выше приоритета прерванного транзакта, и устройство займется обслуживанием второго прерывающего транзакта, а не прерванного транзакта (от блока SEIZE). Один транзакт может прерывать одновременно несколько устройств. Первая форма блока содержит только один операнд – имя или номер устройства, работа которого прерывается. В приводимом примере транзакт второго потока заявок может прервать обслуживание на устройстве WERK1, если транзакты первого потока раньше заняли это устройство, и начинается приоритетное обслуживание. Освобождается устройство WERK1 через 100 единиц времени. После этого продолжится обслуживание транзакта из первого потока. Пример: Метка Операция A, B, C, D, E, F, G GENERATE первый поток заявок SEIZE WERK1 занять устройство ADVANCE 300 обработка RELEASE WERK1 освободить WERK1 … GENERATE второй поток заявок … PREEMPT WERK1 прерывание WERK1 ADVANCE 100 обработка RETURN WERK1 освободить WERK1
18
Для устройств после завершения моделирования выводятся следующие (основные) данные: - имя или номер устройства; - количество транзактов, вошедших в устройство; - доля занятости устройства в процессе моделирования; - среднее время занятия устройства одним транзактом. Стандартные числовые атрибуты для устройств: j – номер или $имя устройства Fj – статус устройства по занятости: 0 – устройство j свободно, 1 – устройство j занято; FIj – статус устройства по прерыванию: 0 – устройство j не прервано, 1 – устройство j прервано; FVj – статус устройства по доступности: 0 – устройство j не доступно, 1 – устройство j доступно; FRj – коэффициент использования (загрузка) устройства (в тысячных долях). Если устройство 1 используется 27 % времени, то FR1=270; FCj – число транзактов, вошедших в устройство j; FTj – среднее время использования устройства одним транзактом (округленно). Пример: FR$WERK3, FC$CPU, FR7 Первый СЧА содержит на момент обращения коэффициент загрузки устройства WERK3, например FR$WERK3=875, т.е. устройство WERK3 использовалось на момент обращения на 87,5 %. Второй СЧА содержит на момент обращения к СЧА количество транзактов, вошедших в устройство CPU, например FC$CPU=423, т.е. в устройство CPU вошло 423 транзакта. Вторая форма использует различные значения приоритетов транзактов и рассматривается в п.3.2. 2.3. Накопители. Блоки ENTER и LEAVE Накопитель ("память") в GPSS – это особый тип оборудования, которое в отличие от устройств содержит заранее определенное количество единиц. Поэтому накопители могут использоваться для представления объектов, выполняющих параллельную обработку нескольких заявок.
19
Для того чтобы задать в программе моделирования память некоторого объема, используется описательный блок STORAGE “Описать накопитель”. Нужно записать в поле метки номер памяти или ее имя, по которому на нее можно ссылаться, в поле операции слово STORAGE. В поле операндов записывается целое число, определяющее объем памяти. “Описать накопитель” Имя_накопителя STORAGE Количество_единиц_памяти Пример: DISK STORAGE 4000 В примере задается память с именем DISK объемом в 4000 условных единиц. Если где-либо в модели происходит обращение к неописанной памяти, то считается, что она имеет объем 2 147 483 647 единиц. В начале работы программы все памяти считаются незанятыми. Для фиксации входа транзакта в память применяется блок ENTER, в поле А которого указывается имя или номер памяти, а в поле В – число единиц памяти, которые занимает в ней транзакт. Поле В может быть опущено, в этом случае считается, что занимается одна единица памяти. “Занять накопитель” [Метка] ENTER Имя_накопителя [,Количество_занимаемых_единиц] Пример: ENTER STOR1,2 Транзакт, проходя через блок ENTER, занимает в памяти STOR1 две единицы памяти. Что понимается под единицей памяти, зависит от решаемой задачи. Если второй операнд опущен, то считается, что он равен единице. Если в памяти нет достаточного числа свободных единиц, запрашиваемых блоком ЕNTER, то транзакт задерживается на входе этого блока до тех пор, пока в этой памяти не будет освобождено необходимое число единиц памяти. Причем в то время, пока этот транзакт ждет входа в блок ENTER, другой транзакт, пришедший позже, может войти в блок ENTER, если для него достаточно свободных единиц памяти. Освобождается содержимое памяти с помощью блока
20
LEAVE, имеющего те же операнды, что и блок ENTER. Только число, стоящее в поле В, указывает, сколько единиц памяти надлежит освободить при прохождении транзакта через блок LEAVE. Поле В может быть опущено, в этом случае считается, что освобождается одна единица памяти. “Освободить накопитель” [Метка] LEAVE Имя_накопителя [,Количество_освобождаемых_единиц] Пример: LEAVE DISK Транзакт, проходя через блок LEAVE, освобождает в памяти DISK одну единицу памяти. Отметим, что в отличие от блоков RELEASE и RETURN, транзакт, освобождающий память, не обязательно должен был ее занимать; кроме того, он не обязан освобождать точно такое же количество памяти, которое он занимал. Если освобождается большее количество единиц памяти, чем осталось, то выводится сообщение об ошибке. В качестве примера рассмотрим участок модели, имитирующий прерывание работы центрального процесса ЭВМ (в программе устройство с именем CPU) для выполнения срочной задачи, требующей для работы 3200 единиц памяти и 180 единиц времени. По завершении этой задачи затребованная память освобождается. Пример: Метка Операция A, B, C, D, E, F, G ENTER MAIN,3200 занять память PREEMPT CPU прерывание фоновой ADVANCE 180 счет срочной задачи RETURN CPU конец прерывания LEAVE MAIN,3200 освободить память MAIN STORAGE 40000 Для накопителей после завершения моделирования выводятся следующие данные: - имя или номер накопителя; - объем накопителя, определенный в модели; - максимальное содержимое накопителя за время моделирования; - количество транзактов, вошедших в накопитель; - среднее значение содержимого накопителя за время
21
моделирования; - коэффициент использования накопителя. Стандартные числовые атрибуты для накопителей: j – номер или $имя устройства; Sj – количество занятых единиц накопителя j; Rj – количество свободных единиц накопителя j; SRj – использование накопителя j (в тысячных долях); SAj – средняя занятость накопителя (округленно) j; SMj – максимальная занятость накопителя j; SCj – количество входов в накопитель j; STj – среднее время использования единицы емкости накопителя j. Пример: S$DISK, R$BUFFER, SM3, SC$CHANNL Значение первого СЧА представляет количество занятых единиц емкости накопителя DISK на момент обращения к СЧА. Второй СЧА представляет количество свободных единиц в накопителе BUFFER. Третий СЧА дает значение максимальной занятости накопителя с номером 3, достигнутой к моменту обращения к нему. Четвертый СЧА содержит количество входов транзактов в накопитель CHANNL к моменту обращения к СЧА. 2.4. Очереди. Блоки QUEUE и DEPART Одним из важных показателей качества функционирования систем массового обслуживания являются возникающие в процессе работы очереди заявок к тем или иным устройствам. Основными характеристиками очереди являются ее средняя и максимальная длина, а также среднее время пребывания заявки в очереди. Для сбора статистических данных об очередях в системе GPSS предусмотрены блоки QUEUE и DEPART. Блок QUEUE фиксирует вход транзакта в очередь, а блок DEPART – выход из очереди. “Отметить транзакт в очереди” [Метка] QUEUE Имя_очереди [,Число_прибавляемое_к_длине_очереди] Пример: QUEUE QTOWRK “Покинуть очередь”
22
[Метка] DEPART Имя_очереди [,Количество_единиц_вычитаемое_из_длины_очереди] Пример: DEPART QTOWRK Если второй операнд опущен, то считается, что он равен единице. Один транзакт может входить в несколько блоков QUEUE, присутствуя таким образом одновременно в нескольких очередях. При входе транзакта в блок QUEUE интерпретатор увеличивает длину очереди, указанной в поле А этого блока, на число, записанное в поле В. Интерпретатор вычисляет временной интеграл длины очереди, фиксируя время, в течение которого длина очереди была неизменной. По окончании моделирования эти данные используются для определения средней длины очереди. Проход транзакта через блок DEPART имитирует выход его из очереди. При этом интерпретатор вычитает из длины очереди, указанной в поле А, число, указанное в поле В, фиксирует время пребывания транзакта в очереди. Причем, если оно оказалось равным 0, то число из поля В прибавляется к счетчику числа транзактов, прошедших через данную очередь без задержки («нули» очереди). Пример: Метка Операция A, B, C, D, E, F, G QUEUE 1 SEIZE 2 DEPART 1 ADVANCE 150 RELEASE 2 Прохождение транзактов через приведенную в примере последовательность блоков имитирует работу с устройством с номером 2 с очередью к нему с номером 1, которое затрачивает 150 единиц времени на обслуживание одной заявки. Для очередей после завершения моделирования выводятся следующие данные: - номер или имя очереди; - максимальное значение длины очереди в процессе моделирования;
23
- текущее содержимое очереди; - общее количество входов транзактов в очередь; - количество “нулевых” входов транзактов в очередь, т.е. таких транзактов, которые ждали ноль единиц времени; - среднее значение длины очереди; - среднее значение времени задержки транзакта в очереди с учетом "нулевых" транзактов; - среднее значение времени задержки транзакта в очереди без учета "нулевых" транзактов (всегда больше или равно предыдущему значению, поскольку учитываются только те, которые были в очереди с ненулевым временем). СЧА для очередей: j – номер или $имя очереди Qj – текущая длина очереди j; QAj – средняя длина очереди j; QMj – максимальная длина очереди j; QCj – количество входов в очередь j; QZj – количество "нулевых" входов в очередь j; QTj – среднее время пребывания транзакта в очереди j (округленно) с учётом «нулей»; QXj – среднее время пребывания транзакта в очереди j, исключая "нулевые" входы (округленно). Пример: Q$TOWRK1, QM3, QC$QUEE2 Первый СЧА имеет значением длину очереди TOWRK1 на момент обращения, второй СЧА дает максимальное значение очереди с номером 3 на момент обращения к СЧА, третий СЧА содержит количество входов в очередь QUEE2. Собирать статистику об очередях можно с помощью блока QTABLE. “Записать в таблицу время пребывания транзакта в очереди” Имя_таблицы QTABLE Имя_очереди ,Правая_граница_первого_интервала, Ширина_интервала,Количество_интервалов Пример: QUTBL QTABLE QTOWR,50,10,7 Блок QTABLE аналогичен блоку TABLE (п.2.13) для сбора статистики о любых значениях модели. В отличие от блока TABLE описательный блок QTABLE не требует никаких дополнительных выполняемых блоков.
24
2.5. Логические ключи. Блоки LOGIC и GATE Объекты типа "логический ключ", принадлежащие к типу "оборудование", применяются в моделях для управления потоками транзактов. Логический ключ может находиться в одном из двух состояний: "включен" (true) или "выключен" (false). В начале моделирования все ключи выключены. Для установления состояния ключа используется блок LOGIC. “Установить значение логического ключа” [Метка] LOGIC S | R | I Имя_ключа "S" – включение, "R" – выключение, "I" – инвертирование. В поле операндов А этого блока указывается номер или имя логического ключа. В позиции 14 поля операции (через один пробел после слова LOGIC или через подчеркивание) указывается условное обозначение того действия, которое должно быть выполнено над этим ключом. Пример: LOGIC S RTY1 или LOGIC_S RTY1 Блок устанавливает значение логического ключа RTY1 в состояние "включен" не зависимо от того, в каком состоянии был ключ. По умолчанию все ключи с началом моделирования установлены в состояние R(eset). Особенностью блока LOGIC является то, что никакие условия перед входом в него не проверяются, т.е. транзакты всегда без задержек проходят этот блок. С помощью блока GATE можно проверить состояние логического ключа, памяти или устройства и, в зависимости от этого, либо задержать транзакт на входе блока GATE, либо направить его на другой блок, либо пропустить через блок GATE. “Проверить условие” [Метка] GATE Операция Что_проверяется[,Метка_блока] Операция -> LS | LR | NI | I | NU | U | SE | SNE | SF | SNF Пример: GATE NU WERK1,TOWRK2 Мнемоническое обозначение проверяемого условия записывается в поле операции, отступив один пробел от слова GATE или через подчеркивание, т.е. в колонках 13–15. Обозначение объекта, состояние которого проверяется,
25
записывается в поле А блока GATE. Блок разрешает вход транзакта (пропускает его через себя) при выполнении указанного в нем условия. Если условие не выполнено, транзакт может быть передан на другой блок. В том случае, когда условие не выполнено и операнд в поле В отсутствует, транзакт задерживается на входе блока GATE до тех пор, пока указанный в поле А объект не придет в проверяемое состояние. Выполнение условия проверяется каждую единицу системного времени. Когда при невыполнении условия в блоке GATE нужно передать транзакт на другой блок, метку этого блока следует записать в поле В блока GATE. Мнемонические обозначения состояний для оборудования в GPSS следующие: для устройств NU – устройство свободно (не используется); U – устройство занято посредством блоков SEIZE или PREEMPT; NI – устройство работает без прерывания (не захвачено блоком PREEMPT); I – устройство обслуживает прерывание (захвачено блоком PREEMPT); для накопителей SE – накопитель пуст; SNE – накопитель не пуст; SF – накопитель заполнен полностью; SNF – накопитель заполнен не полностью; для логических ключей LR – ключ выключен; LS – ключ включен. В качестве примера приведен участок модели, имитирующей прохождение заявок через СМО с тремя последовательно расположенными приборами, которые в модели обозначены 1, 2, 3, со временами обслуживания 10, 20, 30. Дисциплина обслуживания такова, что, если прибор занят, то заявка передается на блок с именем OUT. Пример: Метка Операция A, B, C, D, E, F, G GATE NU 1,OUT если устройство 1
26
*занято, то передать транзакт на блок OUT SEIZE 1 занять устройство 1 ADVANCE 10 обслуживание RELEASE 1 освобождение устройства 1 GATE NU 2,OUT если устройство 2 * занято, то передать транзакт на блок OUT SEIZE 2 занять устройство 2 ADVANCE 20 обслуживание RELEASE 2 освобождение устройства 2 GATE NU 3,OUT если устройство 3 * занято, то передать транзакт на блок OUT SEIZE 3 занять устройство 3 ADVANCE 30 обслуживание RELEASE 3 освобождение устройства 3 … OUT … 2.6. Создание и уничтожение транзактов. Блоки GENERATE и TERMINATE Блок GENERATE используется в программах в качестве источника транзактов, поступающих на вход следующего за ним блока. “Создать транзакт” GENERATE [Среднее_значение_времени_между_транзактами] [,Отклонение_от_среднего] [,Время_до_первого_транзакта] [,Количество_порождаемых_транзактов] [,Приоритет_транзактов] [,Количество_параметров_транзакта][,F|H]. Операнды блока определяют режим работы генератора и атрибуты создаваемых транзактов. В полях А и В этого блока задается интервал системного времени между соседними моментами создания транзактов (интерпретация этих полей в блоках ADVANCE и GENERATE аналогична). В поле B может быть обращение к функции. Среднее значение времени по умолчанию – 1. Отклонение по умолчанию – 0.
27
В поле С – момент выхода первого транзакта. В поле D – число транзактов, которые должны быть созданы блоком. Если D пусто, то блок генерирует транзакты до тех пор, пока не будет остановлено моделирование. Операнд D показывает, сколько транзактов выйдет из GENERATE. Сколько транзактов дойдёт до конца модели, зависит от работы модели. Поле E служит для задания приоритета транзакта (PR). Если поле опущено, то приоритет транзакта равен 0. В противном случае приоритет транзакта может быть задан в пределах от 0 до 127. Поле F служит для задания количества параметров транзакта(P1, P2, P3,…). Если поле опущено, то количество параметров транзакта равно 12. В противном случае количество параметров транзакта может изменяться от 0 до 100. Поле G служит для задания формата параметров транзакта. Если поле опущено, то формат параметров транзакта равен полуслову H. В противном случае формат параметров транзакта может быть слово F или полуслово H. По смыслу блока транзакты не должны входить в GENERATE. Пример: GENERATE 10,,150,1000,64,25,H Данный блок генерирует транзакты каждые 10 единиц времени, начиная с момента 150. Всего будет создано 1000 транзактов, каждый из которых имеет приоритет 64 и 25 параметров формата «полуслово». Замечания. 1. После создания транзакта все параметры имеют нулевое значение. Обозначение параметров: P1, P2, Р3 и т.д. 2. Каждый транзакт имеет стандартный числовой атрибут "отметка времени" – М1, в который блок GENERATE записывает время входа транзакта в систему. 3. Момент появления следующего транзакта вычисляется после выхода предыдущего из блока GENERATE. Выходом транзакта считается его вход в следующий блок. Если он по какой-либо причине невозможен, то транзакт не считается вышедшим из блока GENERATE, что может приводить к
28
искажению временных характеристик входного потока транзактов. Для обеспечения выхода транзакта из блока GENERATE за ним помещают блок ADVANCE 0. В этом случае все транзакты при невозможности перемещаться далее по модели скапливаются в этом блоке. Пример: Метка Операция A, B, C, D, E, F, G GENERATE 23,7 ADVANCE 0 SEIZE WERK1 Блок TERMINATE служит для удаления из модели входящих в него транзактов. Если в поле А этого блока указано какое-либо число, то интерпретатор уменьшает на это число значение глобального "счетчика уничтожений", служащего для определения конца моделирования. (Моделирование прекращается, когда значение счетчика станет равным 0). Начальное значение счетчика определяется управляющим оператором START. “Уничтожить транзакт” [Метка] TERMINATE [Значение_вычитаемое_из_счетчика_в_START] Пример: TERMINATE 1 Если у всех блоков TERMINATE опущено поле А, т.е. упомянутый счетчик не изменяется, то моделирование будет продолжаться до тех пор, пока задача не будет исключена оператором ЭВМ, либо снята операционной системой по истечении времени, либо когда все транзакты, количество которых указано в GENERATE, пройдут через TERMINATE. СЧА для транзактов: Pj – значение j-го параметра транзакта; P*j – косвенная адресация: значение j-го параметра является адресом, номером (параметра), значение которого используется; М1 – время пребывания транзакта в системе от момента выхода из блока GENERATE до момента обращения к параметру; МРj – содержит разность между текущим системным временем, которое обозначается как С1, и значением Рj;
29
МР*j – косвенная адресация: значение j-го параметра является адресом, номером (параметра), значение которого используется, таким образом, параметр содержит разность между текущим системным временем, которое обозначается как С1, и значением параметра, номер которого – это значение параметра j; PR – приоритет транзакта. Пример: P1, MP7, PR, P*4, MP*2 Первый СЧА P1 позволяет получить значение первого параметра. Второй СЧА имеет своим значением разность между системным временем С1 на момент обращения к СЧА и значением Р7. Обращение к PR позволяет получить значение приоритета транзакта. Если значение четвёртого параметра транзакта P4 равно 5, то обращение P*4 даёт значение пятого параметра P5. Если значение второго параметра транзакта P2 равно 7, то обращение MP*2 даёт разность между значением системного времени С1 и значением седьмого параметра P7. 2.7. Размножение транзактов. Блок SPLIT При прохождении транзакта через блок SPLIT производится генерация определенного количества копий этого транзакта в соответствии с числом, заданным в поле А этого блока. Блок SPLIT образует “семейство” транзактов. Исходный (порождающий) транзакт, пройдя блок SPLIT, поступает на вход следующего за ним блока, а его копии – на вход блока, метка которого указана в поле В блока SPLIT “Создать копии” [Метка] SPLIT Количество_копий,Метка_блока [,Значения_параметров][,Количество_параметров] Пример: SPLIT 11,TOWERK Транзакт, который вошел в блок, пройдет на следующий блок, и одновременно на блок с меткой TOWERK будет направлено 11 транзактов. Всего в “семействе” будет 12 транзактов. Если в блоке SPLIT не заданы поля С и D, то создаваемые им транзакты будут иметь те же значения параметров, что и исходный транзакт.
30
Можно задать такой режим работы блока SPLIT, при котором будут порождаться копии, отличающиеся от порождающего транзакта числом и/или значениями своих параметров. Рассмотрим эти возможности на примерах. Пример: SPLIT 6,BLO1,10 После прохождения блока SPLIT транзактом, который имеет не менее 10 параметров, будет создано 6 его копий. Если при входе в блок SPLIT 10-й параметр порождающего транзакта имел значение N, то при выходе он получит значение N+1. Значение этого параметра у первой копии будет N+2, у второй - N+3 и т.д. Пример: SPLIT 6,BLO7,,4 Этот блок порождает 6 копий исходного транзакта, каждая из которых имеет 4 параметра вне зависимости от того, сколько параметров было у порождающего транзакта. Значения параметров порожденных транзактов копируются лишь для тех параметров, номера которых имеются и в исходном транзакте. Как сам транзакт, так и его копии могут проходить через произвольное число блоков SPLIT. “Семейство” (“ансамбль”) транзактов существует в модели до тех пор, пока не исчезнет последний его член. Основателем семейства может быть только транзакт, порожденный блоком GENERATE. Важно отметить, что транзакты, принадлежащие к одному семейству, движутся в модели независимо, однако их движение может быть синхронизировано блоками MATCH, ASSEMBLE и GATHER, которые описаны в следующем разделе. 2.8. Синхронизация транзактов. Блоки ASSEMBLE, МATCH и GATHER Для имитации различных сборочных операций удобно применять блок ASSEMBLE, действие которого состоит в том, что он собирает определенное количество транзактов
31
одного семейства. Число собираемых транзактов называется счетчиком сборки и определяется полем А блока ASSEMBLE: “Собрать семейство транзактов” [Метка] ASSEMBLE Счетчик_сборки Пример: через блок ASSEMBLE 10 пройдет только первый транзакт некоторого семейства, причем он будет задержан до тех пор, пока на блок не поступит еще 9 транзактов того же семейства, которые при этом уничтожаются. После этого первый транзакт пройдет блок ASSEMBLE. Замечания: 1. Имеется возможность косвенного задания счетчика сборки при помощи указания параметра первого транзакта, значение которого заносится в счетчик сборки данного блока ASSEMBLE – ASSEMBLE P3; 2. Один блок ASSEMBLE может одновременно собирать транзакты, принадлежащие разным семействам. Согласовать, синхронизировать движение двух транзактов, которые принадлежат к одному семейству и двигаются в модели по различным маршрутам, можно с помощью блоков MATCH: “Синхронизировать транзакты” Метка MATCH Метка_сопряженного_блока При поступлении транзакта на блок MATCH интерпретатор производит следующие действия: 1. Просматривает транзакты, задержанные на другом блоке MATCH, метка которого указана в поле А первого блока (этот блок называется сопряженным первому); 2. Если среди них имеется транзакт того же семейства, что и пришедший в блок MATCH, то оба эти транзакта получают возможность дальнейшего движения. В противном случае пришедший транзакт задерживается в блоке MATCH до тех пор, пока в сопряженный ему блок не придет транзакт того же семейства.
32
Примеры: Метка Операция A, B, C, D, E, F, G BLO1 MATCH ВLO2 пара сопряженных … ВLO2 MATCH BLO1 блоков MATCH В примере любой из транзактов, попавший в блоки BLO1 или ВLO2, будет пропущен дальше только при условии, что в сопряженном ему блоке задержан транзакт из того же семейства. Один блок MATCH может синхронизировать движение нескольких пар транзактов из различных семейств. Если необходимо в одной точке модели синхронизировать движение нескольких транзактов из одного семейства, то для этого удобно применить блок GATHER, который работает подобно блоку ASSEMBLE. Отличие в том, что, набрав необходимое количество транзактов, он пропускает их дальше все без уничтожения. 2.9. Изменение значений параметров транзактов. Блок ASSIGN В ходе моделирования часто возникает необходимость в изменении значений параметров транзактов. Например, в процессе разгрузки судна в порту количество груза на нем постепенно уменьшается, и для отражения этого в модели, имитирующей порт, необходимо изменять значение параметра, представляющего вес груза, у транзакта, который изображает судно. Основным средством для задания и изменения значений параметров транзактов является блок ASSIGN: “Присвоение параметру транзакта значения” [Метка] ASSIGN Номер_параметра_транзакта[+|],Значение [,Имя_функции или Номер_функции] Пример: ASSIGN 3,4 Блок присваивает 4 третьему параметру проходящего через него транзакта. В поле А этого блока задается номер параметра, значение которого нужно изменить, и обозначение того действия, которое необходимо с ним выполнить. Возможно
33
только сложение и вычитание. Второй операнд этого действия задается в полях В и С. В поле В может быть указано некоторое конкретное число или обозначение стандартного числового атрибута, которое участвует в выполнении операции с параметром. Если в поле С указано целое число, то оно интерпретируется как номер функции, на значение которой следует умножить число из поля В, чтобы получить второй операнд для операции с параметром транзакта. (Аналогичная конструкция уже встречалась в блоке ADVANCE.) В приводимых примерах показаны типичные случаи применения блока ASSIGN. Необходимые пояснения в виде присваиваний приведены в поле комментария. Пример: Метка Операция A, B, C, D, E, F, G ASSIGN 1,149 P1:=149 ASSIGN 11+,10 P11:=P11+10 ASSIGN 8-,P17 P8:=P8-P17 ASSIGN 7,100,4 P7:=100*FN4 2.10. Отметка времени. Блок MARK Каждый транзакт, двигающийся в модели, имеет специальный параметр, называемый “Отметкой времени” (параметр транзакта M1), с помощью которого можно определить время пребывания транзакта в модели. Начальное значение отметки времени транзакта равно времени входа этого транзакта в модель из блока GENERATE. Таким образом, время пребывания в модели любого транзакта всегда может быть вычислено как разность текущего системного времени и его отметки времени. Эта разность может быть получена обращением к стандартному атрибуту М1. Текущее время (абсолютное) системы является одним из стандартных числовых атрибутов и обозначается через С1. Блок MARK позволяет записывать текущее системное время в отметку времени проходящего через него транзакта
34
или в один из его параметров. Для записи текущего времени в отметку времени применяется блок MARK без операндов. Если текущее время нужно записать в параметр транзакта, то его номер указывается в поле А. “Записать отметку времени” [Метка] MARK [Номер_пераметра_транзакта] Если аргумент отсутствует, то текущее системное время записывается в параметр М1 вошедшего в блок транзакта. Пример: MARK 15 Блок записывает текущее время системы в 15-й параметр проходящего блок MARK транзакта. 2.11. Приоритеты транзактов. Блок PRIORITY Каждый транзакт имеет параметр-приоритет PR, который используется интерпретатором для определения порядка обработки транзактов в конфликтных ситуациях. Например, когда на одно устройство в один момент времени претендуют несколько транзактов. В таких случаях транзакт с наивысшим приоритетом может получить преимущество перед транзактами с низшими приоритетами. “Установить приоритет транзакта” [Метка] PRIORITY Значение_приоритета Пример: PRIORITY 23 Каждый транзакт, который проходит через этот блок, получает значение параметра PR=23. Приоритет транзакта может быть в пределах 0-127. Его начальное значение задается при генерации транзакта блоком GENERATE. В процессе моделирования значение приоритета может быть неоднократно изменено в большую или меньшую сторону. 2.12. Изменение маршрутов движения транзактов в модели. Блок TRANSFER При описании имитационных моделей сложных систем часто появляется необходимость передать транзакты в
35
блоки, которые непосредственно не следуют за данным блоком. Для выполнения таких передач в GPSS используется блок TRANSFER. Этот блок может работать в нескольких режимах передачи транзактов. “Направить транзакт на другую часть модели” [Метка] TRANSFER “пусто” |BOTH|Вероятность [,Метка1][,Метка2] Режим передачи определяется операндом, указанным в поле А этого блока. Поле А блока содержит три варианта: “пусто”, BOTH и значение вероятности. Метки блоков-преемников записываются в полях B и С. Если при выполнении блока нужно передать транзакт на “Метка2”, а параметр С отсутствует, то выполняется передача транзакта на следующий блок за TRANSFER. Аналогично с параметром В. Рассмотрим наиболее часто используемые режимы работы блока TRANSFER. В режиме безусловного перехода блок TRANSFER передает все поступающие на него транзакты на метку, указанную в поле В. Поле А блока должно быть при этом пустым. Пример: TRANSFER ,LABL2 Все транзакты, которые вошли в этот блок, будут всегда (безусловно) передаваться на метку LABL2. Одним из режимов условной передачи транзакта является режим ВОТН (ОБА). Для задания этого режима в поле А блока TRANSFER записывается слово ВОТН, а в поля В и С – метки некоторых блоков. При работе в этом режиме транзакт переходит к блоку, указанному меткой в поле В, если вход в этот блок возможен. Если вход в этот блок не возможен, то проверяется возможность его передачи на блок, указанный меткой в поле С. Если транзакт не может войти и в этот блок, то происходит его задержка в блоке TRANSFER до тех пор, пока не освободится один из блоков, указанных в полях В и С. Если в режиме ВОТН одно из полей В или С опущено, то считается, что в нем указан блок, следующий за блоком TRANSFER. Проверка возможности вхождения в каждый
36
блок выполняется каждую единицу системного времени. Пример: Метка Операция A, B, C, D, E, F, G TRANSFER BOTH,DISK,CPU … DISK SEIZE WERK3 … CPU SEIZE COMP В примере транзакт, поступивший в блок TRANSFER, сначала пытается войти в блок, помеченный меткой DISK. Если устройство WERK3 занято, то выполняется попытка входа в блок с меткой CPU. Если она оканчивается неудачей, то транзакт задерживается в блоке TRANSFER до момента освобождения хотя бы одного из устройств WERK3 или СOMP. Режим BOTH не является равновероятной передачей транзактов на две метки. Если в поле А блока TRANSFER задана десятичная дробь (тремя цифрами), то она трактуется интерпретатором как вероятность перехода транзакта на блок, метка которого указана в поле С. Такой режим работы блока TRANSFER, в котором производится случайный выбор между двумя блоками, получил название вероятностного. Пример: TRANSFER .400,TAPE,DISK будет случайным образом передавать 40 % поступающих на него транзактов на блок DISK, а 60 % – на блок TAPE. 2.13. Таблицы. Блоки TABULATE и TABLE Таблицы в GPSS являются удобным средством исследования распределений случайной величины – аргумента таблицы. Таблица состоит из набора частотных интервалов, в каждом из которых организован счетчик числа попаданий значений аргумента в этот интервал. Блок TABLE является описательным – его нет при выполнении модели. Для заполнения таблицы необходимо, чтобы транзакты прошли через блок TABULATE, который
37
ссылается на блок TABLE. “Описать таблицу” Имя_таблицы TABLE Табулируемое_значение, Правая_граница_первого_интервала,Ширина_интервала, Количество_интервалов “Записать в таблицу” [Метка] TABULATE Имя_таблицы Пример: TABL11 TABLE M1,10,20,7 … TABULATE TABL11 В таблице с именем TABL11 табулируется величина М1 (время пребывания транзакта в системе). Таблица состоит из семи интервалов, которые имеют ширину 20 (кроме последнего), правая граница первого интервала – 10. Значение в интервале (по оси Y) – число попаданий в интервал значений М1 (рис. 2.1). В примере в интервал от 0 до 10 попало 25 значений, в интервал от 11 до 30 попало 35 значений, в интервал от 31 до 50 попало 75 значений, в интервал от 51 до 70 попало 85 значений, в интервал от 71 до 90 попало 95 значений, в интервал от 91 до 110 попало 105 значений, в последний интервал от 111 попало 42 значения. 120 100 80 60
Время в системе
40 20 0 10
30
50
70
90
110
Рис. 2.1. Пример работы блоков TABULATE и TABLE
В процессе прохождения транзакта через блок TABULATE интерпретатор обновляет содержимое таблицы,
38
указанной в его поле А, увеличивая на число, записанное в поле В, счетчик числа попаданий того интервала, внутрь которого попало значение аргумента. (Если В пусто, то это эквивалентно записи 1 в этом поле.) В конце моделирования интерпретатор выводит содержимое таблицы в виде нескольких колонок чисел. 2.14. Пример модели. Модель порта Рассмотрим простую модель порта, в котором имеется причал для разгрузки судов, которые прибывают в порт с интервалами от 27 до 37 часов, и для разгрузки каждого судна требуется от 25 до 35 часов. В результате моделирования нужно определить распределение времени пребывания судов в порту. (В это время включается время ожидания в очереди и время разгрузки у причала.) Будем считать, что устройство PORT изображает в модели причал, а очередь OSYD – очередь судов, ждущих разгрузки, тогда модель порта может быть описана с помощью следующей программы: Метка Операция A, B, C, D, E, F, G SIMULATE GENERATE 32,5 генерация * транзактов, изображающих суда, прибывающие в порт QUEUE OSYD прибывшее * судно встает в очередь, ее длина увеличивается на 1 SEIZE PORT судно занимает * причал, когда он освободится DEPART OSYD если судно * заняло причал, то, значит, оно покидает очередь и * ее длина уменьшается на 1 ADVANCE 30,5 разгрузка судна RELEASE PORT после разгрузки * судно освобождает причал TABULATE TAB фиксирует время * пребывания судна в таблице TAB TERMINATE 1 судно покидает порт
39
* описание таблицы, имеющей 9 интервалов шириной 5 * с левой границей 23 TAB TABLE M1,23,5,9 START 480 моделирование * продолжается до тех пор, пока 480 судов не покинут * порт END В конце моделирования будет выдана информация о содержимом таблицы ТАВ, на основании чего можно судить о распределении времени пребывания судов в порту, а также информация о средней длине очереди OSYD, ее максимальной длине и среднем времени пребывания судов в очереди, количестве судов, прошедших очередь без задержки. Последние данные автоматически собираются интерпретатором для каждой очереди и позволяют судить о качестве функционирования системы. 3. ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ СИСТЕМЫ GPSS 3.1. Организация цикла. Блок LOOP Для организации циклического прохождения транзакта в модели могут быть использованы блоки TRANSFER и LOOP. “Организовать цикл” [Метка] LOOP Номер_параметра_транзакта, Метка_начала_цикла Поле А блока LOOP трактуется как номер параметра транзакта, в котором записано значение счетчика цикла. Когда транзакт входит в блок LOOP, значение указанного параметра транзакта уменьшается на единицу. Далее выполняется проверка. Если полученное значение равно нулю, то транзакт проходит через блок LOOP на следующий за ним блок. Если после вычитания это значение не равно нулю, то транзакт передается на метку, которая указана в поле В блока LOOP. Пример: Метка Операция A, B, C, D, E, F, G
40
ASSIGN 3,7 … LABL2 … начало тела цикла … тело цикла LOOP 3,LABL2 … В примере счетчик цикла со значением 7 организован в третьем параметре транзакта блоком ASSIGN. Участок модели от блока с меткой LABL2 до блока LOOP будет выполняться семь раз. (При условии, что внутри этого участка модели нет других условий выхода транзакта.) 3.2. Обработка прерываний с многоуровневыми приоритетами В GPSS имеется возможность организовать обработку заявок (транзактов) с различными приоритетами. Первая форма блока PREEMPT (п. 2.2.2) реализует только два уровня приоритетов. Нижний уровень задает блок SEIZE, верхний – простая форма блока PREEMPT. Вторая более сложная форма блока PREEMPT обеспечивает режим многоуровневого прерывания. “Захватить устройство по многоуровневому приоритету” [Метка] PREEMPT Имя_устройства,PR, [Метка_блока],[Номер_параметра],RE При многоуровневом прерывании транзакт с приоритетом n или выше войдет в блок PREEMPT и прервет обработку транзакта с меньшим, чем n приоритетом. При обработке транзакта с приоритетом n блоком PREEMPT транзакт с меньшим приоритетом не сможет войти в блок и будет поставлен в очередь задержек к блоку. Поле А блока содержит имя устройства. Поле В должно содержать ключевое слово PR. Поле С содержит метку блока, которому передается прерванный транзакт. Поле D содержит номер параметра прерванного транзакта, куда записывается время, которое осталось ему провести на обслуживании. Поле E должно содержать ключевое слово RE, обозначающее, что прерванный транзакт вернул устройство и более не претендует на обслуживание на нем.
41
Все параметры блока PREEMPT позиционные, и если какой-либо из них опущен, то вместо него должна быть поставлена запятая – PREEMPT WERK1,PR,MET7,,RE. Пример: Метка Операция A, B, C, D, E, F, G PREEMPT WERK1,PR,MET7,3,RE ADVANCE 134,54 RETURN WERK1 … MET7 SEIZE WERK2 ADVANCE P3 RELEASE WERK2 В приведенном примере транзакт с более высоким приоритетом прервет обслуживание на устройстве WERK1 транзакта с меньшим приоритетом и направит его на блок SEIZE c меткой МЕТ7. В параметре 3 прерванного транзакта будет записано время дообслуживания. Таким образом, все прерванные транзакты будут направляться на продолжение обработки на метку MET7. Время обработки каждый транзакт получает в блоке ADVANCE 134,54. Устройство WERK2 дообслужит прерванные транзакты в порядке общей очереди за время, записанное в параметре P3 каждого транзакта. Пример: Метка Операция A, B, C, D, E, F, G ASSIGN 3,30 ARB1 PREEMPT WERK1,PR,ARB1,3,RE ADVANCE P3 RETURN WERK1 Каждый транзакт, проходящий через блок ASSIGN, получает в третьем параметре значение 30. Приоритеты транзактов различны. Далее транзакт входит в блок PREEMPT. Если приоритет входящего транзакта меньше или равен приоритету транзакта, который раньше уже вошел в этот блок, то входящий транзакт ждет у входа в блок. Если же приоритет входящего больше, то он прерывает обслуживание предыдущего. При этом предыдущий транзакт передается на метку, указанную в третьем операнде блока –
42
ARB1. В параметр 3 отстраненного транзакта записывается время, которое ему осталось "досиживать" в блоке ADVANCE, когда до него дойдет очередь. Отстраненный на время от обслуживания транзакт не прошел через блок RETURN, поэтому последний операнд блока PREEMPT содержит ключевое слово RE, которое означает, что отстраненный транзакт освобождает обслуживающее его устройство. Блок ADVANCE использует косвенную форму задания времени задержки транзакта – через значение третьего параметра транзакта. Транзакт, проходя через блок RETURN, освобождает (возвращает) устройство, захваченное соответствующим ему блоком PREEMPT. Если устройство, указанное в PREEMPT, еще не занято, то блок PREEMPT действует как SEIZE. 3.3. Сравнение значений. Блок TEST Для сравнения значения двух величин и выбора направления движения транзакта в зависимости от результата сравнения может быть использован блок TEST: “Сравнить значения” [Метка] TEST Операция Первый_операнд,Второй_операнд [,Метка_передачи_транзакта] Операция -> E|NE|GE|LE|G|L В поле операции блока TEST через пробел или подчеркивание указывается символический код операции сравнения двух величин, которые указаны в поле операндов блока TEST. Коды операций: E – операнды равны; NE – операнды не равны; GE – первый операнд больше или равен второму; LE – первый операнд меньше или равен второму; G – первый операнд больше второго; L – первый операнд меньше второго. Первый операнд указывается в поле А, второй – в поле В. Если условие, заданное операцией сравнения,
43
выполняется, то транзакт проходит через блок TEST на следующий за ним блок. Если условие не выполняется, то транзакт передается на блок, метка которого указана в поле С. Если поле С пусто, тогда транзакт задерживается в блоке TEST до выполнения условия, заданного операцией сравнения. Выполнение условия операции сравнения проверяется каждую единицу системного времени. Пример: Метка Операция A, B, C, D, E, F, G MET1 TEST E P3,7,LABL3 ASSIGN 5+,1 … LABL3 … Блок TEST в примере сравнивает значение параметра P3, входящего в него транзакта, c 7. Если значение третьего параметра транзакта равно 7, то транзакт передается на следующий блок ASSIGN. Если значение P3 не равно 7, то транзакт передается на блок с меткой LABL3. 3.4. Переменные Переменные в GPSS используются для задания различных соотношений между атрибутами системы. С помощью переменной записывается некоторая формула, значение которой вычисляется в момент прохождения транзактом блока, в котором имеется ссылка на эту переменную. Имеется три типа переменных: - арифметические целочисленные (VARIABLE); - арифметические с плавающей точкой (FVARIABLE); - булевские (BVARIABLE). Рассмотрим правила описания переменных. “Описать арифметическую целочисленную переменную” Имя_переменной_или_номер VARIABLE Алгебраическое_выражение Пример: PRIOR VARIABLE RN1@7+1 12 VARIABLE RN1@7+1 Переменная PRIOR и переменная 12 получают равномерно распределенные значения в интервале от 1 до 7.
44
RN1 – датчик случайных чисел, дает случайное равномерно распределенное значение в интервале от 0 до 999. Операция @ получает остаток от деления. “Алгебраическое_выражение”, в поле операндов блока VARIABLE, может содержать: - целые арифметические константы; - другие арифметические переменные; - стандартные числовые атрибуты; - знаки арифметических операций; - допускается не более 5 пар скобок. Арифметические операции следующие: + – сложение; - – вычитание; * – умножение; / – деление, результат – целая часть от частного; @ – деление, результат – остаток от деления, который считается положительным. Промежуточные значения при вычислении алгебраического выражения арифметической целочисленной переменной округляются путем отбрасывания дробной части. Результат вычисления арифметической целочисленной переменной – целое число, которое получается округлением путем отбрасывания дробной части. Вычисление значения арифметической целочисленной переменной выполняется в момент прохождения транзакта через блок, в котором указана эта переменная. Обращение к переменной выполняется как V$PRIOR или V12. Пример: Метка Операция A, B, C, D, E, F, G LNGTH VARIABLE RN1/10+1 PRIO VARIABLE RN2@10 + 1 … ASSIGN 3,V$LNGTH PRIORITY V$PRIO В примере описана целочисленная переменная LNGTH, которая использует датчик случайных чисел RN1, который дает значения в интервале от 0 до 999. Переменная LNGTH используется для получения случайных значений в
45
интервале от 1 до 100. Первая переменная вычисляется каждый раз, когда транзакт проходит через блок ASSIGN. Полученное значение переменной присваивается третьему параметру транзакта. Вторая целочисленная переменная PRIO позволяет получить случайные значения в интервале от 1 до 10. Датчик случайных чисел RN2 аналогичен RN1 и дает значения в интервале от 0 до 999. Вторая переменная вычисляется всякий раз, когда транзакт проходит через блок PRIORITY, и служит для назначения приоритета транзакту случайным образом в диапазоне от 1 до 10. “Описать арифметическую переменную с плавающей точкой” Имя_переменной_или_номер FVARIABLE Алгебраическое_выражение Пример: PRIOR1 FVARIABLE RN2@7+1 Результат вычисления переменной PRIOR1 аналогичен результату вычисления переменной PRIOR. Промежуточные значения при вычислении алгебраического выражения арифметической переменной с плавающей точкой не округляются. Результат вычисления арифметической переменной с плавающей точкой округляется путем отбрасывания дробной части. Результат вычисления арифметической переменной с плавающей точкой – целое число. Вычисление значения арифметической переменной с плавающей точкой выполняется в момент прохождения транзакта через блок, в котором указана эта переменная. Обращение к переменной с плавающей точкой PRIOR1 – FV$PRIO1 или, если в описании имени переменной задан номер 15, а не имя, то FV15. Булевские переменные описываются блоком BVARIABLE: “Описать булевскую переменную” Имя_переменной_или_номер BVARIABLE Логическое_выражение Пример: BOOL1 BVARIABLE SE3 + LR7 Булевские переменные задают логические выражения,
46
которые состоят из: - булевских переменных; - арифметических переменных; - числовых констант; - условных операторов; - логических операторов; - стандартных логических атрибутов; - стандартных числовых атрибутов. Булевская переменная может принимать только два значения – "истина" и "ложь". Логические операции "И" и "ИЛИ" обозначаются знаками "*" и "+" соответственно. Условные операторы выполняют алгебраическое сравнение операндов, в качестве которых могут быть числовые константы, арифметические переменные, арифметические операции и стандартные числовые атрибуты. Условные операторы пишутся в кавычках и обозначаются следующим образом: - 'G' – “больше чем”; - 'L' – “меньше чем”; - 'E' – “равно”; - 'NE' – “неравно”; - 'LE' – “меньше или равно”; - 'GE' – “больше или равно”. Условный оператор и два операнда образуют операцию сравнения. Значением операции сравнения может быть "истина" или "ложь". Значение операции сравнения "истина" устанавливается, когда между операндами выполняется соотношение, указанное условным оператором. Пример: Метка Операция A, B, C, D, E, F, G BOOL1 BVARIABLE SE3 4 BVARIABLE FI7 17 BVARIABLE V$PRIO 'E' 11 7 BVARIABLE SE5 * LR9 Первая переменная BOOL1 принимает значение "истина", если память с номером 3 на момент обращения к переменной пуста (используется СЧА SE3). Вторая переменная с номером 4 принимает значение
47
"истина", если устройство с номером 7 на момент обращения к переменной было прервано, т.е. с ним работает блок PREEMPT (используется СЧА FI7). Третья булевская переменная с номером 17 принимает значение "истина", если значение целочисленной арифметической переменной PRIO на момент обращения к переменной равно 11. Четвертая переменная с номером 7 принимает значение "истина", если одновременно на момент обращения к переменной выполняются два условия (указана логическая операция "И"): накопитель с номером 5 пуст и логический ключ с номером 9 выключен (используются СЧА SE5 и СЛА LR9). Вычисление значения булевской переменной выполняется так же, как и для арифметических переменных в момент прохождения транзакта через блок, в котором указана переменная. Обращение к булевской переменной BOOL1 – B$BOOL1 или, если в описании имени переменной задан номер 17, а не идентификатор, то B17. 3.5. Хранимые значения В GPSS имеется возможность запоминать константы или вычисляемые в процессе моделирования значения с помощью хранимых значений. В моделях на GPSS они играют роль переменных в обычных языках программирования. Для обращения к хранимому значению используется стандартный числовой атрибут X для хранимых значений длиной в слово и XH для хранимых значений длиной в полуслово. Далее следует имя переменной через символ $ или номер. Пример: X3, X20, X$RATE, X$PRIOR. Описаний хранимых значений не требуется. Для операции с хранимым значением используется блок SAVEVALUE: “Сохранить значение” [Метка] SAVEVALUE Номер_хранимого_значения_или_имя[+|-],Значение
48
Пример: SAVEVALUE 3+,P2 В поле А указывается номер хранимого значения и возможная операция с этим значением – только сложение или вычитание. В поле В указывается величина, которая присваивается или участвует в арифметической операции. Операция с хранимым значением выполняется при прохождении транзакта через блок SAVEVALUE. Результат записывается в указанное хранимое значение. Пример: Метка Операция A, B, C, D, E, F, G SAVEVALUE 20+,7 X20:=X20+7 SAVEVALUE 3-,V$PRIO X3:=X3-V$PRIO SAVEVALUE X$PRIOR,37 X$PRIOR:=37 SAVEVALUE X$RA,V$LNG X$RA:=V$LNG В первом примере к хранимому значению с номером 20 (X20) прибавляется 7. Результат записывается в хранимое значение с номером 20. Во втором – из хранимого значения с номером 3 вычитается значение переменной PRIO. Результат записывается в хранимое значение с номером 3. Значение переменной PRIO будет вычисляться при вхождении транзакта в блок SAVEVALUE при обращении к переменной. В третьем примере хранимому значению PRIOR присваивается новое значение – 37. Прежнее значение теряется. В четвертом примере хранимому значению с именем RATE присваивается значение переменной LNGTH. По умолчанию все начальные значения хранимых величин равны нулю. С помощью описательного блока INITIAL “Присвоить начальное значение” могут быть заданы любые начальные значения. INITIAL XНомер_хранимого_значения, Значение_константа INITIAL XHНомер_хранимого_значения, Значение_константа INITIAL X$Имя_хранимого_значения, Значение_константа INITIAL XH$Имя_хранимого_значения,
49
Значение_константа Пример: INITIAL X4,17 X4:=17 INITIAL X$RATE,19 X$RATE:=19 В первом случае хранимой величине X4 присваивается в качестве начального значения 17. Во втором случае хранимой величине RATE – 19. 3.6. Функции Для реализации различных функциональных зависимостей наряду с формулами, которые записываются в выражении для переменных, используются функции. Функции часто используются для генерации случайных величин со сложным законом распределения. В поле метки пишется номер или имя функции. В поле операции – FUNCTION. “Описать функцию” Имя_функции_или_номер FUNCTION Аргумент,Тип_функции_и_количество_пар Значение_аргумента1,Значение_функции1/… Значение_аргументаN, Значение_функцииN Тип_функции -> C|D В GPSS имеются два типа функций – непрерывные и дискретные. Непрерывная функция кодируется буквой С, дискретная – буквой D. В поле А записывается правило для образования значения аргумента функции. Аргументом функции могут быть любые стандартные числовые атрибуты, а также другие функции. В поле В – тип функции и количество пар координат: "аргумент – значение функции". В каждой паре “аргумент – значение функции” аргумент отделяется запятой от значения функции. Каждая пара отделяется друг от друга косой чертой (/). Значение аргумента – правая граница интервала. При задании дискретной функции аппроксимация между двумя точками – значениями функции выполняется горизонтальной линией ("ступенькой"). При попадании случайного значения аргумента в интервал значение
50
функции останется постоянным (рис. 3.1). Пример: LNGTH FUNCTION RN1, D4 0.1,3/0.3,17/0.7,13/1.0,5
Рис. 3.1. Пример дискретной функции
В примере описана дискретная функция с именем LNGTH. Для формирования аргумента используется СЧА датчик случайных чисел RN1. В случае использования СЧА датчиков случайных чисел в качестве аргументов функций их значения находятся в интервале от 0 до 1. Функция имеет четыре пары "аргумент – значение". При попадании аргумента в интервал от 0 до 0.1 (0.1 входит) значение функции LNGTH постоянно и равно 3. В интервале больше 0.1 до 0.3 (0.3 входит) значение функции – 17. В интервале больше 0.3 до 0.7 (0.7 входит) значение функции 13. В интервале больше 0.7 до 1.0 значение функции – 5. При задании непрерывной функции применяется кусочнолинейная аппроксимация. В этом случае при попадании значения аргумента в интервал значение функции вычисляется по наклонному отрезку, аппроксимирующему функцию на данном интервале (рис. 3.2). Обращение к функции выполняется по имени FN$ LNGTH или, если в описании функции задан номер 4, то по номеру – FN4.
51
Рис. 3.2. Пример непрерывной функции
Пример: Метка Операция A, B, C, D, E, F, G PRT FUNCTION P1,D9 300,8/350,7/400,6/450,5/500,4/550,3/600,2/650,1/700,0 FNCT FUNCTION RN1,C5 0,0/.3,30/.5,50/.7,110/1,130 … PRIORITY FN$PRT … SAVEVALUE X$RATE,FN$FNCT Первая функция PRT является дискретной и имеет девять пар "аргумент – значение". Аргументом является первый параметр транзакта P1. В зависимости от значения параметра P1 значение функции изменяется от 8 до 0. При значении параметра P1 меньше или равном 300 значение функции равно 8. При значении функции от 301 до 350 значение функции – 7. Используется функция PRT в блоке PRIORITY для задания приоритета транзакту, который проходит через этот блок. Вторая функция F3 описана как непрерывная с пятью парами значений. Аргументом функции является стандартный числовой атрибут RN1 – датчик равномерно распределенных случайных чисел в диапазоне (0,1). Если аргумент больше 0, но меньше или равен 0.3, то значение функции равномерно изменяется от 0 до 30. В интервале аргумента больше 0.3 до 0.5 включительно значение
52
функции пропорционально изменяется от 30 до 50 и т.д. Функция FNCT используется для присвоения значения хранимой величине RATE. 3.7. Примеры моделей 3.7.1. Модель вычислительного центра Рассмотрим модель вычислительного центра, в котором пять ЭВМ обрабатывают поступающие по линии связи сигналы. Время прихода сигналов и их обработки – в секундах. Производительность ЭВМ одинаковая. Сигналы распределяются на ЭВМ последовательно: на первую, на вторую, на третью и так далее по мере поступления. Номер ЭВМ, которая будет обрабатывать данный сигнал, записывается в первый параметр транзакта. Если очередная ЭВМ занята, то для того чтобы не потерять сигнал, делается попытка прервать работу данной ЭВМ и обработать сначала вновь пришедший для данной ЭВМ сигнал, а потом возобновить обработку прерванного сигнала. Для этого делается проверка того, не находится ли данная ЭВМ уже в режиме прерывания для обработки предыдущего приоритетного сигнала. Если данная ЭВМ еще не завершила обработку предыдущего подобного события, то только в этом случае вновь пришедший сигнал теряется. Цель моделирования может состоять в том, чтобы найти такое время обработки сигналов (производительность ЭВМ) при заданных параметрах входного потока, при котором не будет потери сигналов. SIMULATE GENERATE 60,30 сигнал через 30-90 секунд SAVEVALUE 1,V3 запись в Х1 номера ЭВМ, * который вычисляется как значение переменной V3 3 VARIABLE X1@5+1 выражение для * переменной V3 изменяется следующим образом: 1, 2, * 3, 4, 5, 1, 2, 3, 4, 5,... ASSIGN 1,X1 запись в Р1 номера из Х1 GATE NU P1,PRIO проверка занятости
53
* устройства, номер которого записан в параметре Р1 SEIZE P1 занятие устройства ADVANCE 210,70 обработка сигнала RELEASE P1 освобождение устройства TABULATE TAB запись в таблицу времени * пребывания сигнала на вычислительном центре TERMINATE сигнал обработан PRIO GATE NI P1,LOSS проверка прерывания * устройства с номером в параметре Р1 PREEMPT P1 приоритетное обслуживание * нового сигнала на устройстве с номером в P1 ADVANCE 210,70 обработка сигнала RETURN P1 возврат устройства TABULATE TAB запись времени * пребывания сигнала в системе в таблицу TERMINATE уничтожение транзакта LOSS TERMINATE необработанный сигнал * потерян TAB TABLE M1,150,30,7 описание таблицы GENERATE 1 моделирование времени * работы системы в течение 10 часов = 10*60*60 = TERMINATE 1 36000 секунд START 36000 END Данные о необработанных сигналах определяются по количеству транзактов, прошедших через блок с меткой LOSS. Загрузка ЭВМ определяется как загрузка устройств 1, 2, 3, 4, 5. 3.7.2. Модель многоканальной СМО На вход многоканальной СМО с тремя каналами связи поступают потоки заявок разных типов. Интервал появления заявок распределен по экспоненциальному закону. Среднее значение равно 20 единицам времени. Каждая заявка равновероятно с вероятностью 0.2 относится к одному из типов заявок – 1, 2, 3, 4, 5. Заявка поступает на свободный канал. Передача по каналу связи для всех типов заявок
54
одинаковая и занимает 50 единиц времени. Каждый тип заявок обслуживается своим типом устройства. Время обслуживания подчинено экспоненциальному закону со средним значением, соответствующим типу заявки – 20, 50, 10, 40, 25 единиц времени. В результате моделирования нужно определить: - характеристики общей очереди к каналам связи для всех типов заявок; - характеристики очередей к каждому типу устройств; - распределение времени пребывания заявок в очередях к каждому типу устройств; - распределение времени пребывания заявок в системе. Время моделирования – 30000 единиц времени. Модель этой системы имеет вид: SIMULATE FUNE FUNCTION RN1,C25 0,0/.1,.104/.2,.222/.3,.355/.4,.509/.5,.69/.6,.915/.7,1.2/.75,1. 38/.8,1.6/.84,1.83/.88,2.12/.9,2.3/.92,2.52/.94,2.81/.95,2.99/. 96,3.2/.97,3.5/.97,3.5/.98,3.9/.99,4.6/.995,5.3/.998,6.2/.999, 7.0/.9997,8.8 TIP FUNCTION RN2,D5 .2,1/.4,2/.6,3/.8,4/1,5 MEAN FUNCTION P1,D5 1,20/2,50/3,10/4,40/5,25 CHANN STORAGE 3 три канала QUE_T QTABLE P1,10,10,10 SYS_T TABLE M1,50,40,10 GENERATE 20,FN$FUNE заявка на входе * многоканальной системы ASSIGN 1, FN$TIP запись в P1 типа * заявки QUEUE CH_OCH заявку в общую * очередь к каналам для всех типов заявок ENTER CHANN помещение заявки в * свободный канал DEPART CH_OCH выход заявки из * общей очереди к каналам ADVANCE 50 обработка заявки каналом
55
LEAVE CHANN освобождение канала QUEUE P1 вход заявки в свою очередь * в соответствии с типом заявки SEIZE P1 обработка заявки своим * устройством DEPART P1 выход заявки из своей * очереди ADVANCE FN$MEAN,FN$FUNE * обработка заявки своим устройством RELEASE P1 возврат устройства TABULATE SYS_T запись времени * пребывания заявки в системе в таблицу TERMINATE выход заявки из системы GENERATE 1 моделирование времени * работы системы в течение 30000 единиц времени TERMINATE 1 START 30000 END Для моделирования системы из трёх каналов используется накопитель из трёх единиц памяти. Заявка входит в тот канал (единицу памяти), которая свободна в этот момент. Для моделирования пяти очередей и пяти устройств для обработки заявок используется косвенный адрес, т.е. значение первого параметра транзакта – P1, куда записан тип заявки.
56
CПИСОК ЛИТЕРАТУРЫ (основная литература выделена жирным шрифтом) 1. Шрайбер Т.Дж. Моделирование на GPSS. /Пер с англ. M.: Машиностроение, 1980. 2. Киндлер Е. Языки моделирования. Пер. с чешск. М.: Энергоатомиздат, 1985. 3. Боев В.Д. Моделирование систем. Инструментальные средства GPSS WORLD: Учебное пособие. СПб.: БХВ-Петербург, 2004. 4. Советов Б.Я., Яковлев С.А. Моделирование систем: Учебник для вузов. М.: Высшая школа, 1985, 1998, 2001. 5. Советов Б.Я., Яковлев С.А. Моделирование систем: Практикум. М.: Высшая школа, 1999. 6. Андрианов А.Н., Бычков С.П., Хорошилов А.И. Программирование на языке Симула-67. М.: Наука, 1985. 7. Алгазинов Э.К., Сирота А.А. Анализ и компьютерное моделирование информационных процессов и систем. М.: Диалог-МИФИ, 2009.
57
Сергей Павлович Бычков Александр Александрович Храмов
ПРОГРАММИРОВАНИЕ В СИСТЕМЕ МОДЕЛИРОВАНИЯ GPSS Учебное пособие
Редактор Е.Е. Шумакова Оригинал-макет подготовлен А.А. Храмовым Подписано в печать 31.05.2010 Печ.л. 3,75. Уч.-изд.л. 3,75.
Формат 60х84 1/16
Тираж 200 экз. Изд.N 099-1
Заказ № Национальный исследовательский ядерный университет «МИФИ». Типография НИЯУ МИФИ. 115409, Москва, Каширское шоссе, 31.
Для заметок
Для заметок