На основе языка СЛАМ и на принципах имитационного моделирования, которые интерпретируют и выполняют описывающие сеть операторы, имитируют тем самым реальную систему.
При сетевом моделировании исследуемая система представляется в виде множества компонентов, проходящих через сеть, состоящую из узлов и действий. По мере прохождения по сети компоненты занимают обслуживающие устройства, продвигают время, ожидают, захватывают и освобождают ресурсы, открывают и закрывают затворы, образуют очереди, изменяют значения переменных, т.е. вызывают изменения состояния модели системы. Основное предположение, на котором базируется реализованный подход к сетевому имитационному моделированию, заключается в том, что изменения состояния системы могут происходить только в момент поступления какого-либо ее компонента в узел. Процессор СЛАМ генерирует полную картину изменений состояния сетевой модели в процессе обработки упорядоченной во времени последовательности событий, моделирующих поступление компонентов в узлы.
Механизмом обработки упорядоченной во времени последовательности событий поступления компонентов в узлы является календарь событий. Календарь состоит из списка событий поступления компонентов, каждое из которых характеризуется «временем свершения» и «узлом завершения». Время свершения события определяет момент времени, в который компонент должен поступить в узел. Узел, в который затем следует компонент, называется узлом завершения. События в календаре ранжируются во времени свершения в соответствии с правилом LVF (low-value-first – меньшее значение первым).
На рисунке 1 приведена блок-схема процедуры обработки следующего события, применяемой в СЛАМ при имитации сетей. Работа процессора начинается с интерпретации операторов СЛАМ. Затем осуществляется фаза инициализации, которая завершается до начала фазы выполнения имитации. В течение фазы инициализации процессор помещает в календарь все события, которые должны произойти в каждом узле CREATE в момент первого его освобождения. Кроме того, генерируются компоненты в узлах QUEUE и, где необходимо, планируются события окончания обслуживания. Следовательно, календарь событий первоначально содержит по одному событию поступления компонента для каждого узла CREATE и по одному событию окончания обслуживания для каждого занятого обслуживающего устройства в сети.
Фаза выполнения имитации начинается с извлечения первого события из календаря. Процессор при этом увеличивает текущее имитационное время TNOW так, чтобы оно стало равным моменту наступления первого события. Затем происходит обработка события с выполнением всех действий, предусмотренных логической процедурой, связанной с типом узла, в который поступил компонент. Например, если компонент поступил в узел
AWAIT, процедура обработки данного события состоит в следующем: первоначально проверяется наличие необходимого ресурса; если имеется необходимое количество ресурса, компонент захватывает его и покидает узел; в противном случае компонент помещается в определенный файл и ожидает поступления необходимого количества ресурса. Хотя логические процедуры обработки событий в разных узлах различны, они всегда приводят к одному из трех следующих результатов:
1) компонент направляется в другой узел;
2) компонент уничтожается в узле;
3) компонент задерживается в узле в зависимости от состояния системы.
При направлении компонента в другой узел осуществляется проверка действий, начинающихся в узле, из которого он направляется. Если в нем не начинается ни одно из действий, в текущий момент времени TNOW планируется поступление компонента в следующий узел. Если следующего узла нет, компонент уничтожается. Если в данном узле начинается несколько действий, для выполнения выбираются только М из них (М – заданное для этого узла число). Выбор осуществляется в соответствии с определенными для этих действий условиями и вероятностями. Пусть выбрано некоторое действие; тогда компонент или его дубликат направляется в узел, в котором это действие завершается. Компонент поступит в завершающий узел в момент времени, равный TNOW плюс продолжительность действия.
После того как все события запланированы, процессор СЛАМ осуществляет проверку следующих условий завершения имитационного прогона:
- TNOW больше или равно заданного пользователем времени завершения имитационного прогона;
- календарь событий пуст;
- узел TERMINATE освобожден, т.е. пуст.
Если ни одно из условий завершения имитации не выполняется, процессор СЛАМ переходит к обработке следующего события поступления, выбранного из календаря событий. При завершении имитационного прогона вычисляются статистические оценки, и печатается заключительный отчет. Затем осуществляется проверка необходимости выполнения дополнительных имитационных прогонов. Если такая необходимость есть, инициируется следующий прогон. При завершении всех прогонов работа процессора СЛАМ прекращается, и управление передается операционной системе.
Описанная выше процедура обработки следующего события хорошо определена для всех случаев, кроме случая, когда на один и тот же момент времени запланированы два или больше событий поступления. Чтобы лучше понять проблему, рассмотрим пример, в котором имеется затвор DOOR. Этот затвор в текущий момент времени открыт. Имеются также компоненты, поступление которых запланировано в один и тот же момент времени следующими операторами:
оператор 1 оператор 2
AWAIT, DOOR; CLOSE, DOOR;
Если первым обрабатывается оператор 1, то затвор DOOR будет открыт, а компонент покинет узел AWAIT. Напротив, если первым обрабатывается оператор 2, поступление компонента в операторе 1 будет задержано в узле AWAIT, т.к. затвор DOOR только что был закрыт. Следовательно, порядок обработки одновременных событий поступления компонентов в узел может влиять на результаты имитации. Эта проблема важна только в имитационных языках с целочисленным счетчиком времени.
При описании правил развязки в узле одновременных событий поступления, применяемых в СЛАМ, удобно разбивать все события, содержащиеся в календаре, на «текущие» и «будущие». Текущими являются те события, наступление которых запланировано на текущий момент имитационного времени, тогда как будущие события запланированы на некоторые моменты в будущем. Причиной основного различия между текущими и будущими событиями поступления является различие применяемых при этом процедур развязки.
Планирование события поступления как текущего может быть результатом планирования либо поступления в следующий узел, либо поступления в узел окончания операции в случае, когда операция имеет нулевую продолжительность. В обоих случаях момент наступления события равен текущему имитационному времени. Процедура планирования события в СЛАМ всегда помещает текущие события в начало календаря независимо от других находящихся в нем событий. Следовательно, текущие события помещаются в календарь по правилу LIFO (last-in, first-out – «последним вошел – первым вышел»). В том случае, когда из одного и того же узла начинаются несколько действий с нулевой продолжительностью выполнения, события поступления, соответствующие окончанию каждого действия, помещаются в начало календаря в порядке, предусмотренном последовательностью операторов событий, т.е. первое событие соответствует первому действию с нулевой продолжительностью, второе событие – второму подобному действию и т.д.
Поскольку единственным механизмом продвижения имитационного времени в сетевых моделях СЛАМ является завершение действия, планирование будущих событий обязательно связано с событием поступления, вызванным завершением действия с ненулевой продолжительностью. Процедура развязки при планировании будущих событий использует вторичное ранжирование, которое в СЛАМ определяется по умолчанию правилом FIFO (first-in, first-out – «первым вошел – первым вышел»). Вторичное ранжирование может задаваться разработчиком в соответствии с правилами FIFO; LIFO; LVF (NATR) (меньшее значение атрибута с номером NATR – первым, или HVF (NATR)), (большее значение атрибута с номером NATR – первым). Если при вторичном ранжировании по правилам LVF или HVF связка событий остается, то она разбивается с помощью ранжирования по правилу FIFO.
II Входные операторы СЛАМ.
Имитационная программа сетевой модели состоит не только из операторов описания узлов и действий. Для задания таких параметров, как продолжительность прогона, начальные значения, выходные спецификации правила ранжирования файлов, необходимы входные операторы.
Форматы входных операторов.
Процессор СЛАМ считывает входные операторы с терминала или его эквивалента. Первые три символа имени каждого входного оператора его однозначно идентифицируют. Каждое поле оператора разделяется запятой или косой чертой либо заключается в скобки. Выбор разделителя зависит от особенностей типа оператора и записи поля и указывается в описании каждого типа оператора. Косая черта и скобки используются в основном для разделения необязательных спецификаций; поэтому они сами необязательны. Запятыми разделяются поля, которые надо указывать обязательно. Специальные знаки ( +, — , *, / ) применяются для обозначения арифметических операций, а точка с запятой обозначает конец оператора. Эти знаки не должны употребляться в метках сетевых операторов или в задаваемых пользователем алфавитно-цифровых именах.
Поле в операторе может отсутствовать из-за того, что нет соответствующей записи. Например, действие нулевой продолжительности условий. заканчивающееся в узле с меткой EXIT, может быть задано с помощью умолчания полей продолжительности и условий следующим образом:
ACTIVITY,,, EXIT;
Поля, оставшиеся неопределенными в операторе принимают значения по умолчанию. Например, действие ACTIVITY с продолжительностью 1, не имеющее условий и заканчивающееся в следующем узле, может быть задано с умолчанием двух последних полей таким образом:
ACTIVITY, 1;
Узлом завершения данного действия считается узел следующего по порядку оператора.
Входные операторы считываются по свободному формату, который позволяет размещать один оператор в любом месте строки и на нескольких строках. Единственным ограничением является то, что одно поле не может быть разнесено на разные строки. Предполагается, что оператор продолжается на следующей строке в том случае, если последним, отличным от пробела символом оператора на данной строке являются [, / (+ — *)] или последняя точка логического оператора (.AND.). Если последний, отличный от пробела символ строки является любым другим, предполагается, что оператор закончился. Тем не менее предпочтительнее, если оператор заканчивается явно, т.е. с использованием завершающей точки с запятой, которая позволяет добавлять комментарии после текста самого оператора. Игнорируются все пробелы, кроме встретившихся внутри алфавитно-цифрового поля, что позволяет улучшить читабельность операторов. Например, оператор:
ACTIVITY, 10, ATRIB (1). EQ.1 .AND.TNOW.LT.100,LOOP;
может быть разнесен на три строчки следующим образом:
ACTIVITY, 10,
ATRIB (1).EQ.1.AND.
TNOW.LT.100, LOOP;
Следует отметить, однако, что три строки потребуют большего времени на интерпретацию, чем одна.
Числовые данные могут вводиться в целом и десятичном виде, со знаком или без него. Кроме того, очень большие или очень малые числа могут вводиться в форме с плавающей запятой с использованием формата Е. Например, число 10 может быть введено как 10, 10., +10, 1.Е+1, 1Е1 или 100Е-1. Если десятичное число вводится в поле, определенное как целое, то дробная часть отбрасывается. Аналогично, если целое число вводится в десятичное поле, оно переводится в десятичный формат. Таким образом, входной процессор СЛАМ не отличает 1. от 1 независимо от заданного типа поля.
Алфавитно-цифровые поля воспринимаются при вводе как некоторые последовательности символов, начинающиеся с буквы, но не содержащие специальных знаков, перечисленных выше. Пробелы внутри алфавитно-цифровых полей воспринимаются как значащие символы, т. е. Ь 1 и Ы будут рассматриваться как разные последовательности. Поскольку поля не могут быть разнесены на несколько строк, длина алфавитно-цифрового поля не должна превышать 80 символов. Кроме того, т зависимости от введенного поля читаются только первые 3, 4, 8, 16 или 20 символов. В качестве примера допустимых алфавитно-цифровых полей можно привести следующие: ВАКВЕК, СКАЫЕ, 5927, К.1. или Л.ООЕ.
Форматы сетевых операторов
Сетевые операторы, записываются, начиная с 7-й колонки, причем в колонках с 1 по 5 указывается метка узла. Из пяти знаков метки узла принимаются во внимание только первые четыре. Так, например, метки ЬАЫЕ1 и ЬАЫЕ2 не различаются.
Сетевым операторам должен предшествовать оператор МЕТ\УОКК, а за последним сетевым оператором должен стоять оператор ЕМОМЕТ\\ЮКК. Ключевыми в имени оператора КЕТ\\ЮКК являются символы МЕТ, располагаемые в любом месте строки, которые сообщают процессору СЛАМ, что в последующих строках стоят сетевые операторы. Оператор — МЕТШОКК имеет два дополнительных поля:
ЫЕТ\\ЮКК, опция, устройство;
которые определяют способ запоминания декодированной сети для последующей загрузки. Если опция принимает значение 5АУЕ, декодированная сеть запоминается на устройстве с указанным логическим номером (накопитель на магнитной ленте или магнитном диске). Следовательно, оператор
ТШОКК, ЗАУЕ,3; определяет, что декодированная сеть будет записана на устройстве с логическим номером 3. При последующем использовании сети оператор
ЫЕТШОКК, ЬОАО.З;
осуществит загрузку декодированной сети с устройства 3. Таким образом, существенно экономится машинное время, необходимое на декодирование большого набора сетевых операторов. Если опция принимает значение ЬОАО, после оператора NЕТ\\ЮКК не надо записывать ни одного сетевого оператора, включая и оператор ЕНОЫЕТ\\ЮЯК. Если опция и номер Таблица 1. Типы сетевых операторов СЛАМ
устройства опущены, по умолчанию предполагается, что сеть должна быть декодирована. Ключевыми в операторе ЕЫВЫЕТ\\ЮКК являются символы ЕЫО, которые располагаются в строке, начиная с 7-й позиции, что обозначает конец набора сетевых операторов. В табл. 1 представлены перечень сетевых операторов и значения полей по умолчанию.
Некоторые из особенностей входных сетевых операторов требуют дальнейшего пояснения. Общая концепция разработки сетевых средств в СЛАМ обеспечивает повышенную читабельность операторов без перегрузки пользователя излишними информационными требованиями. С этой целью применяются четыре разделителя значений по следующим правилам:
- Запятые используются для разделения полей.
- Косой чертой разделяются возможные двойные задаваемые или умалчиваемые значения полей опций. Этот разделитель может указывать также, что набор полей должен быть повторен.
- Круглые скобки используются для указания размера или относящегося к данной сети файла.
- Точка с запятой обозначает конец оператора.
Эти разделители позволяют в более понятной форме описать, входные операторы. Любой имитационный язык в целях удобства пользования им должен иметь широкий набор альтернатив.
Другой особенностью входных операторов является то, что для всех типов узлов в качестве имен выступают глаголы. Это соответствует принятой концепции моделирования, которая требует принятия решений и осуществления логических функций I в узлах сети.
Форматы управляющих операторов
В данном разделе описаны дополнительные типы операторов, которые используются при написании имитационных программ на языке СЛАМ. В противоположность входным сетевым операторам, которые начинаются только с 7-й позиции, управляющие операторы могут начинаться с любой (обычно они начинаются с первой позиции). В табл. 2 приводится перечень, управляющих операторов.
Результирующие сообщения СЛАМ
Цель данного раздела — описать отчеты о результатах имитации, генерируемые процессором СЛАМ. Эти отчеты состоят из распечатки исходных данных, сообщений о трассировке и заключительного отчета СЛАМ. Ниже приводятся описания всех сообщений.
Листинг операторов и сообщения об ошибках ввода.
Процессор СЛАМ интерпретирует каждый входной оператор и осуществляет подробную проверку возможных ошибок ввода. Если переменная 1Ы5Т в операторе ОЕМ равна УЕ5 или опущена, процессор печатает листинг входных операторов. Каждому оператору присваивается номер строки, и если выявлена ошибка, сообщение о ней печатается сразу после оператора, в котором она обнаружена. Неправильное задание входных операторов приводит к выдаче сообщений об ошибках ввода, форматы которых приводятся ниже. Прочерки в них означают величины, которые указывает процессор СЛАМ:
ПОЛЕ НОМЕР_____НЕ ЗАДАЕТСЯ ПО УМОЛЧАНИЮ
ПОЛЕ НОМЕР_____НЕ МОЖЕТ БЫТЬ ЧИСЛОВЫМ
ПОЛЕ НОМЕР_____НЕ МОЖЕТ БЫТЬ АЛФАВИТНЫМ
Каждый элемент данных в операторе рассматривается как поле. Поля нумеруются слева направо, причем первым полем читается метка узла даже в том случае, когда она отсутствует. Например, для приведенного ниже оператора с полями, помеченными номерами в кружках, будет выдано следующее сообщение: ПОЛЕ НОМЕР 5 НЕ МОЖЕТ БЫТЬ АЛФАВИТНЫМ:
Выражение XX является недопустимым для поля, в котором должен быть указан максимальный размер очереди.
Например, оператор даст ошибку в поле 5.
Эта ошибка выявляется при инициализации в случае запланированного первоначального освобождения узла СКЕАТЕ. Узел СКЕАТЕ не может быть освобожден до момента начала имитации.
Вызывается невозможностью интерпретации поля ввода из-за того, что оператор имеет слишком большую длину, или же в поле, начинающемся с цифры, присутствует буква. Обычным источником этой ошибки является ввод буквы О вместо нуля.
Все ошибки ввода рассматриваются процессором СЛАМ как фатальные, т.е. выполнение прогона не начинается при наличии хотя бы одной из них. Отчет о трассировке инициируется оператором МОМТК с использованием опции ТКАСЕ и вызывает формирование и печать отчета по данным о каждом событии поступления компонентов в узел в процессе имитационного прогона. Отчет о трассировке дает подробную информацию о ходе имитации, включающую для каждого события поступления: момент свершения события, метку и тип узла, в который поступает компонент, атрибуты поступающего элемента. Кроме того, печатаются данные о всех выполненных операциях в узлах, о продолжительности запланированных операций и узлах завершения.