Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Средства имитационного моделирования






 

Совокупность средств имитационного моделирования описана в системном классе SIMULATION, кото­рый является подклассом другого системного класса SIMSET позволяющего эффективно обрабатывать упорядоченные множества, организованные в виде циклических двунаправленных списков - наборов вхо­дящих в них объектов. Поэтому* сначала дадим определение набора и опишем детали приведенной ниже структуры декларации класса SIMSET:

class simset; begin class linkage;

begin ref (linkage) SUCC, PREDD;

ref (link) procedure SUC;......;

ref (link) procedure prod;.....;

end linkage;

linkage class link;

begin procedure out;....;

procedure follow(x); ref (linkage) x;....;

procedure precede(x); ref (linkage) x;....;

procedure into(s); ref (head) s;.....;

end link;

linkage class head;

begin ref (link) procedure first;...;

ref(link) procedure last;....;

boolean procedure empty;...;

integer procedure cardinal;.....;

procedure clear;...;

SUCC: -PREDD: - this linkage;

end head;

end simset;

Набор - циклическая последовательность элементов из которых все, кроме одного, имеют ссылки на процесс и на своего преемника (SUC) и предшественника (PREDD). Элемент без ссылки на процесс называется головой набора.

Здесь следует пояснить термин " процесс". Процесс является фундаментальным элементом системы программирования Симула - 67. Он служит для организации и классификации действий, происходящих в системе с дискретными событиями синхронизированными по системному времени. Процессом называ­ется объект класса, имеющего process своим префиксом. Класс process имеет префикс link и описан в декларации класса simulation.

Голова набора всегда присутствует в нем, является одной и той же для набора. Если в наборе нет других элементов, он считаются пустым. В непустом наборе преемник головы набора называется первым элементом, а предшественник - последним. Набор имеет фиксированное наименование, которое называ­ется указателем, указатель может быть простым или с индексами.

Объявления наборов синтаксически записывается аналогично объявлению простых переменных или переменных с индексами. Однако указатель набора не является переменной в том смысле, что набору нельзя делать явных присваиваний. Описания набора недостаточно для его создания. Для этого одним из первых исполняемых операторов в программе должен присутствовать оператор: < указатель набора >: - new head:

Результатом работы этого оператора является порождение головы набора. Первоначально набор пуст. Элемент набора, не являющийся головой называется просто членом набора.

Опишем класс simset: подкласс linkage является общим названием для голов наборов и для членов наборов. Атрибут SUC является ссылкой на преемника данного объекта класса linkage в наборе, а пере­менная PREDD является ссылкой на предшественника.

Значение этих ссылок можно получить посредством процедур sue и predd. Эти процедуры имеют значение попе, если указанный объект не может быть членом никакого набора. Атрибуты SUC и PREDD можно модифицировать только посредством процедур, определенных внутри классов link и head. Поясним значение процедур описанных в подклассах класса SIMSET:

1. out класса link исключает объект, атрибутом которого она является, из содержащего его набора.

2. процедуры follow(X) и precede(X) включают объект в набор рядом после и перед объектом X.

3. into*) - вставляет объект в конец набора S.

4. процедура first и last дают доступ к крайним элементам набора.

5. empty* - дает значение true, если набор пуст.

6. cardinal - дает число членов набора.

7. clear - исключает из набора все его члены - делает набор пустым.

Приведем фрагмент симула -программы, использующей средства класса simset для имитации поста­новки двух автомобилей в очередь, отображаемую набором СТОЯНКА.

simset begin integer k;

link class АВТОМОБИЛЬ (...);

ref(head) СТОЯНКА; ref (АВТОМОБИЛЬ) ABTI, ABT2;

СТОЯНКА: -- new head;

ABT1: - new АВТОМОБИЛЬ(...);

ABT2: - new АВТОМОБИЛЬ (...);

ABT1.into(CTOЯHKA);

ABT2. precede(ABT1);

………………………………………..

ABT1.OUT;

………………………………………

k: = СТОЯНКА. cardinal;

end (декларации класса автомобиль).

Средства класса simset могут быть дополнены и даже переопределены программистом. Но имеющиеся средства этого класса вполне достаточны для имитации. Вернемся к классу SIMULATION.

В основе класса SIMULATION, кроме понятия процесс лежит понятие системного времени, которое отображает течение времени в моделируемой системе и представляет собой неубывающую и неотрица­тельную величину. Основным инструментом синхронизации процессов, применяемым в классе, является управляющий список. Он представляет собой упорядоченный по системному времени набор, членами которого состоят объекты, отображающие запланированные, но еще не исполненные к этому времени со­бытия. Эти объекты называются уведомлениями о событиях. Каждое уведомление содержит информацию о запланированном времени события и ссылке на процесс, очередная активная фаза которого должна исполняться в это время. Первое уведомление в управляющем списке указывает на активный в данный момент процесс. Время события, указанное в нем равен токующему системному времени. Во время испол­нения своей текущей активной фазы процесс может запланировать события для других процессов, а так же следующую активную фазу для самого себя и, кроме того, отменить ранее запланированные события. Планирование и отмену выполняют специальные операторы, определенные в классе, которые включают в управляющий список уведомления и соответственно исключают их из него.

Описание модели на Симула - 67 оформляется в виде вложенного блока с префиксом SIMULATION: simulation begin.... end. В ходе работы модели процессы могут находиться в активном, приостановленном, пассивном и завершенном состоянии. В активном состоянии в каждый момент времени может находиться только один процесс, он исполняет свои правила действий. По окончании текущего события он может перейти в любое из перечисленных состояний.

В приостановленном состоянии находится процесс, на который есть уведомление в управляющем спи­ске, но оно не первое в этом списке. В пассивном состоянии процесс не имеет уведомлений в управляющем списке, то есть событий для него не запланировано, но его локальное управление указывает на один из операторов его правил действий и активная фаза для него может быть запланирована. Другими словами: пассивный процесс может быть переведен в активное или приостановленное состояние. Непосредственно после генерации процесс находится в пассивном состоянии, его ЛУ* указывает на первый оператор правил действии.

В завершенном состоянии процесс не представлен в управляющем списке и он не может перейти ни в какое другое состояние, то есть он присутствует в модели только как структура данных. Завершенным считается процесс при выходе управления через end его декларации класса. Рассмотрим общую структуру класса simulation. В нем есть два подкласса: EVENT NOTICE (уведомление о событии) PROCESS и ряд процедур управляющих моделирова­нием.

Определен так же набор SQS членами которого являются объекты класса event notice, составляю­щие управляющий список. Создание головы набора и занесение туда первого уведомления выполняется операторами тела класса, работа которого предшествовала началу моделирования. Структура декларации класса имеет следующий вид:

simset class simulation; begin ref(head) SQS:

link class EVENT NOTICE(EVTIME, PROC); real EV*TIME: ref(p*ocess) PROG;...; link class process:.......; end: procedure passi *'ate:...: procedure cancel(X): ref(process) X;...: procedure hold (Т); real Т:............;

SQS: - new* head; (другие операторы выполняющие ряд действий по организации моделирования)

ABTI. OUT;

k: = СТОЯНКА. cardinal; end (декларации класса автомобиль).

Средства класса simset могут быть дополнены и даже переопределены программистом. Но имеющиеся средства этого класса вполне достаточны для имитации. Вернемся к классу SIMULATION.

В основе класса SIMULATION, кроме понятия процесс *лежит понятие системного времени, которое отображает течение времени в моделируемой системе и представляет собой неубывающую и неотрица­тельную величину. Основным инструментом синхронизации процессов, применяемым в классе, является управляющий список. Он представляет собой упорядоченный по системному времени набор, членами которого состоят объекты, отображающие запланированные, но еще не исполненные к этому* времени со­бытия. Эти объекты называются уведомлениями о событиях. Каждое уведомление содержит информацию о запланированном времени события и ссылке на процесс, очередная активная фаза которого должна исполняться в это время. Первое уведомление в управляющем списке указывает на активный в данный момент процесс. Время события, указанное в нем равен токующему системному времени. Во время испол­нения своей текущей активной фазы процесс может запланировать события для других процессов, а так же следующую активную фазу для самого себя и, кроме того, отменить ранее запланированные события. Планирование и отмену выполняют специальные операторы, определенные в классе, которые включают в управляющий список уведомления и соответственно исключают их из него.

Описание модели на Симула - 67 оформляется в виде вложенного блока с префиксом SIMULATION: simulation begin.... end. В ходе работы модели процессы могут находиться в активном, приостановленном, пассивном и завершенном состоянии. В активном состоянии в каждый момент времени может находиться только один процесс, он исполняет свои правила действий. По окончании текущего события он может перейти в любое из перечисленных состояний.

В приостановленном состоянии находится процесс на который есть уведомление в управляющем спи­ске, но оно не первое в этом списке. В пассивном состоянии процесс не имеет уведомлений в управляющем списке, то есть событий для него не запланированно, но его локальное управление указывает на один из операторов его правил действий и активная фаза для него может быть запланирована. Другими словами: пассивный процесс может быть переведен в активное или приостановленное состояние. Непосредственно после генерации процесс находится в пассивном состоянии, его ЛУ* указывает на первый оператор правил действии.

В завершенном состоянии процесс не представлен в упраляющем списке и он не может перейти ни в какое другое состояние, то есть он присутствует в модели только как структура данных. Завершенным считается процесс при выходе управления через end его декларации класса. Рассмотрим общую структуру класса simulation. В нем есть два подкласса: EVENT NOTICE (уведомление о событии) PROCESS и ряд процедур управляющих моделирова­нием.

Определен так же набор SQS членами которого являются объекты класса event notice, составляю­щие управляющий список. Создание головы набора и занесение туда первого уведомления выполняется операторами тела класса, работа которого предшествовала началу моделирования. Структура декларации класса имеет следующий вид:

simset class simulation;

begin ref(head) SQS;

link class EVENT NOTICE (EVTIME, PROC);

real EVTIME; ref(process) PROC;...;

link class process:.......; end;

procedure passivate;...;

procedure cancel(X); ref(process) X;...;

procedure hold (Т); real Т;............;

………………………………….;

SQS: - new head; (другие операторы выполняющие ряд действий по организации моделирования)

inner;

end simulation;

Декларация класса EVENT NOTICE описывает уведомление о событиях, характеризуемых временем события и ссылкой на процесс. При планировании очередной очередной активной фазы для пассивного процесса Х на системное время Т программа класса создает уведомление о событии при помощи генератора объектов new EVENT NOTICE (Т, Х) и включает его в управляющий список, с помощью процедур класса simset. Деклорация класса process задает общие свойства для всех объектов, работа которых связана с системным временем.

Задание конкретных классов процессов выполняется внутри блока с префиксом simulation. Для этого достаточно употребить имя process, в качестве префикса в декларации определяемого класса. Вместе с тем, объекты класса process и его подклассов могут быть членами наборов, т.к. декларация класса processимеет префикс link.

Среди атрибутов процессов заданных в декларации класса process присутсствует TERM (имеет значение true для завершенных процессов) и EVENT (указывает на уведомление, ссылающийся на данный процесс), а также ряд процедур позволяющих определить состояние процесса. Например, процедура a terminated – true только для совершенных процессов. Процедура evtime выдает в качестве значения число равное системному времени на которое запланировано для ее процесса (в котором она является атрибутом). Значение текущего системного времени дает процедура – функция time, а процедура – функция carrent дает ссылку на активный процесс, и т.д..

Кроме того, в теле декларации класса simulation определены ряд операторов (процедур), позволяющих управлять процессами.

Одновременно, со средствами отображения параллельно работающих объектов в языке есть и другие средства. Это операторы detach и resume (открепить и возобновить). В Симула-67 выделяют следующие состояния объекта (не процесса): прикреплен, самостоятелен, завершен. В прикрепленном состоянии объект находится с момента начала работы соответствующего генератора объектов до первого выполнения оператора detach в его правилах действий. «Откреплен» и «прикреплен» отображают тот факт, что в процессе вычисления генератор объектов создаваемый объект считается частью объекта, содержащий его генератор, то есть прикреплен к нему. При откреплении его локальное управление останавливается на операторе, следующим за оператором detach с которого начинается исполнение правил действий в активной фазе, то есть объект становится самостоятельным. Возобновление работы самостоятельного объекта осуществляется с помощью оператора resume (X), где Х – объект, исполнение правил действий которого нужно возобновить. При выполнении этого оператора в правилах действий некоторого объекта Y, переходит передача центрального управления от объекта Y к X. Локальное управление объекта Y останавливается на операторе, следующим за оператором resume(X) и он перестает быть активным, а объект Х начинает выполнять свои правила действий с того оператора, на который указывает его локальное управление, то есть становится активным.

Вся программа является самостоятельным объектом, который получает управление от операционной системы, он называется главной программой.

Далее опишем операторы задержания и отмены процессов (событий). При описании работы объектов моделируемых систем, отображаемых процессами, часто возникает необходимость задержать дальнейшее выполнение этих процессов на некоторый интервал системного времени или вовсе отменить их, если, например, в ходе моделирования сложились условия делающие невозможным выполнение процессов. Кроме того, задержкой можно имитировать затраты времени на выполнение какого-либо действия моделируемым объектом.

Так, для того, чтобы обеспечить исполнение новой активной фазы некоторого процесса через время Т, после окончания его текущей активной фазы достаточно употребить в качестве ее последующего исполняемого оператора: hold(T): T- арифметическое выражение равное требуемому времени задержки.

В результате выполнения этого оператора время события в уведомлении текущего процесса будет увеличено на Т, а само оно будет установлено в УС с первого места в позицию соответствующую системному времени time +T, после уведомлений с таким же временем. При этом текущая активная фаза процесса заканчивается, его ЛУ останавливается пере оператором следующим за hold(T), а активным становится процесс, уведомление о котором в результате стало первым в УС. Если же при выполнении оператора hold(T) оказалось, сто в интервале времени (time, time+T) не запланированно ни одного события, то результатом действия этого оператора будет просто изменение текущего времени на величину Т.

Следует отметить, что hold(T) не является необходимым и эквивалентен оператору: reaktivate current delay Т

Для отменны запланированных активных фаз процессов в классе simulation предусмотрен оператор cansel(X), где X - процесс активная фаза которого должна быть отменена. Этот оператор переводит про­цесс в разряд пассивных, исключая уведомление о нем из управляющего списка. Если X уже пассивен или завершен, то оператор не производит никаких действий. Если же исключается уведомление о при­остановленном процессе, то его ЛУ не меняется, тогда как для активного процесса ЛУ, в этом случае, устанавливается на операторе следующем за cansel.

Перевести активный процесс в пассивное состояние можно также с помощью оператора pssivate, кото­рый эквивалентен оператору cansel(carent).

Тогда, когда требуется включить процесс в набор S, отображающий, например, очередь, а затем сделать его пассивным удобно пользоваться оператором wait, который эквивалентен составному оператору begin carrent.into(S); passivate end В заключение несколько слов о планирующих операторах. Синтаксис планирующих операторов определяется следующим образом

| activate | X | | at Т | [ prior ] |

| reactivte | | | delay Т | |

| after Y |

| before Y |

| < пусто >, |

где X - объектное выражение, обозначающее процесс, для которого планируется событие; Т - арифме­тическое выражение, значение которого трактуется как абсолютное системное время (в случае at Т) или как время задержки планируемого события относительно текущего момента системного времени (в слу­чае delay Т): Y объектное выражение, обозначающее активный или приостановленный процесс; prior

- указатель приоритета, необязательный параметр: вертикальные линии - квазискобки указывают на аль­тернативу для конструкций помещенных в строках.

Оператор reaktivate планирует события только для активных и приостановленных процессов, тогда как activate - только для пассивных. И тот и другой вставляют уведомления в управляющий список.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.