Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

OUT, follow, precede, into



Процедура OUT удаляет объект из набора, членом которого он является (если объект имеет членство в наборе). Если объект не состоит ни в каком наборе, то вызов процедуры OUT не влечет за собой никаких последствий.

Процедуры FOLLOW и PRECEDE удаляют объект из набора, членом которого он является (если объект имеет членство в наборе), и вставляют его в некоторый набор в указанную позицию. Набор и позиция задаются параметром типа REF (LINKAGE). Если этот параметр имеет значение NONE, или не имеет членства в наборе, или не является головой набора, то вызов процедур FOLLOW и PRECEDE имеет тот же эффект, что и вызов OUT, в противном случае объект включается непосредственно вслед за или непосредственно перед тем объектом класса LINKAGE, на который указывает параметр.

Процедура INTO, которая имеет параметр типа REF (HEAD), удаляет объект из набора, членом которого он является, и включает его в качестве последнего члена в набор, указанный параметром.

Определение класса HEAD.

Объект класса HEAD или подкласса класса HEAD служит для представления набора. Процедуру FIRST можно использовать для того, чтобы получить ссылку на первый член набора, а процедуру LAST – на последний. Логическая процедура EMPTY доставляет значение TRUE, если набор не имеет членов. Значением процедуры CARDINAL является количество членов набора, процедурой CLEAR можно воспользоваться для удаления всех членов из набора.

Рассмотрим применение наборов и процедур, определенных в классе SIMSET, для отображения и обработки иерархических древовидных структур объектов. Узлы дерева удобно отображать с помощью объектов, которые можно включать в наборы, т.е. объектов, принадлежащих подклассу класса LINK. Ветви дерева, исходящие из некоторого узла, можно представить набором, членами которого являются объекты, соответствующие узлам следующего яруса, связанным с этим узлом. Дополнительная информация, характеризующая узлы дерева, может представляться значениями атрибутов соответствующих им объектов.

Таким образом, объекты, отображающие узлы дерева, могут быть описаны следующей декларацией класса:

LINK class ver (number);

integer number;

Begin

ref (HEAD) vetv;

integer m;

vetv:- new HEAD;

End;

В данном примере предполагается, что каждый узел характеризуется дополнительно двумя целыми числами: порядковым номером (атрибут номера) и номером яруса, в котором он находится (атрибут m).

Опишем в виде рекурсивной процедуры один из возможных алгоритмов генерации дерева из k узлов. Алгоритм генерирует узлы дерева в порядке возрастания их номеров и включает каждый из них в набор ветви соответствующего узла верхнего яруса.

Нумерация вершин дерева и их генерации производится в направлении “сверху - вниз” и “слева - направо”. Будем считать, что количество ветвей для узла с номером 1 задано в 1-м элементе массива colvetv [1: k]. Например, для генерации дерева, изображенного на рисунке, номера следующие:

 
 

 


       
 
 
 
 


Элементы массива colvetv должны иметь такие значения: 2, 2, 0, 0, 0. Введем глобальные переменные koren и th для обозначения корня дерева и текущего номера генерируемого узла. Далее дан фрагмент программы, который производит генерацию дерева, узла которого отображаются объектами класса узел:

integer colvetv[1:k];

integer th;

ref (ver) koren;

procedure sv (y);

ref (ver) y;

Begin

integer kb;

kb:= colvetv[y.number];

for kb:= kb - 1 while kb=>0 do

Begin

ref (ver) nov;

th:= tn + 1;

nov:- new ver (th);

nov. into (y.vetv);

sv(nov);

End

End;

koren:- new ver(1);

th:-=1;

sv (koren);

В качестве примера обработки иерархических структур рассмотрим процедуру, выполняющую обход всех узлов дерева и помечающую каждый узел целым числом, равным номеру яруса этого узла. Будем считать, что узлы дерева представлены объектами класса ver, и номер яруса нужно занести в атрибут m каждого объекта.

Опишем процедуру yaryc (k, L), которая выполняет указанную пометку для узлов поддерева с корнем k, распложенным на ярусе L.

procedure yaryc (k, L);

ref (ver) k;

integer L;

Begin

ref (ver) Т;

k, m:=L;

T:- k, vetv, FIRST;

while T =/= none do

Begin

yaryc (T, L+1); T:- T.S UC;

End;

End;

Имея процедуру yaruc, пометку узлов можно выполнить с помощью оператора yaruc (koren.1).

Планирование процессов. Системный класс SIMULATION

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

Понятия системного времени и процесса определены в специальном классе - классе SIMULATION.

В классе SIMULATION описаны классы EVENT и PROCESS, являющиеся подклассами класса LINK. Класс SIMULATION является подклассом класса SIMSET, в классе SIMULATION описаны также процедуры, которые позволяют описывать действия над объектами.

В имитационной модели, написанной на языке СИМУЛА-67 с использованием средств класса SIMULATION, объекты моделируемых систем представляются процессами, а работа отдельных процессов и их взаимодействие отражают функционирование системы.

В модели параллельно (с точки зрения системного времени) исполняются несколько цепочек событий, каждая из которых соответствует работе отдельного процесса. В декларациях классов, задающих параметры и правила действий процессов, разработчик модели должен описать их функционирование с точки зрения отдельного описываемого процесса. Разработчику достаточно описать чередование событий отдельно для каждого класса процессов, а правильное следование во времени событий, принадлежащих различным цепочкам (синхронизацию процессов), автоматически обеспечивает система моделирования, определенная в классе SIMULATION.

В ходе работы модели процессы могут находиться в следующих четырех состояниях: активном, приостановленном, пассивном и завершенном.

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

Для приостановленных процессов запланировано событие и оно будет исполнено (т.е. приостановленный процесс станет активным), если во время предыдущих событий его никто явно не отменит или моделирование не будет прекращено.

Для пассивных процессов событий не запланировано, однако локальное управление пассивного процесса указывает на один из операторов его правил действий и на него можно запланировать активную фазу, которая начнется с исполнения этого оператора. Пассивный процесс может быть переведен в активное или приостановленное состояние. Непосредственно после генерации процесс находится в пассивном состоянии, и его локальное управление указывает на первый исполняемый оператор правил действий.

Процесс попадает в завершенное состояние при выходе управления через завершающий символ END его декларации класса или в результате исполнения оператора перехода к нелокальной метке.

Атрибутами класса SIMULATION являются процедуры PASSIVATE, CANCEL, WAIT, HOLD, которые позволяют переводить процесс из одного состояния в другое. Для планирования новых событий в классе SIMULATION предусмотрены специальные операторы ACTIVATE и REACTIVATE.

Значение текущего системного времени можно получить, обратившись к процедуре-функции TIME, процедура CURRENT выдает в качестве значения ссылки на текущий процесс.

Рассмотрим специальные процедуры и операторы класса SIMULATION.

Для планирования новых событий используются операторы ACTIVATE и REACTIVATE. Для того чтобы запланировать событие, необходимо задать момент системного времени, в который оно должно произойти, и процесс, для которого планируется данное событие.

Синтаксис данных операторов имеет вид:

[<пусто>]

[ ACTIVATE ] [ [ AT T ] [ PRIOR ]

X [ [ DELAY T ] ]

[ REACTIVATE ] [ AFTER Y ]

[ BEFORE Y ]

где Х - объектное выражение, обозначающее процесс, для которого планируется событие;

Т - арифметическое выражение, значение которого трактуется в случае AT T как абсолютное системное время, а в случае DELAY T - как время задержки планируемого события относительно текущего момента системного времени;

Y - объектное выражение, обозначающее активный или приостановленный процесс.

Оператор ACTIVATE выполняет планирование события только для пассивных процессов, а оператор REACTIVATE выполняет планирование и для процессов, находящихся в активном или приостановленном состоянии.

Оператор вида ACTIVATE X AT T активизирует процесс в системное время, равное Т.

Если указано планирование с приоритетом PRIOR, то событие будет исполнено перед другими событиями, ранее запланированными на данный момент системного времени. При планировании без приоритета одновременные события исполняются в порядке, в котором они планировались.

При планировании событий можно задать не системное время, а событие через которое ли после которого необходимо запланировать событие. В обоих случаях время события Х полагается равным времени события для процесса Х. Если процесс Y не является активным или приостановленным процессом, то никаких действий оператор не производит, если необходимо сразу запустить процесс, то нужно выполнить оператор

ACTIVATE X AT TIME PRIOR,

где Х – активный процесс

или оператор

REACTIVATE X BEFORE CURRENT,

где Х – любой процесс, кроме завершенного.

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

Оператор HOLD (T) эквивалентен оператору

REACTIVATE CURRENT DELAY T.

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

Для отмены запланированных активных фаз процессов предусмотрен оператор CANCEL (X), где X – процесс, чья активная фаза должна быть отменена, т.е. процесс Х становится пассивным.

Для перевода текущего процесса в пассивное состояние используется оператор PASSIVATE, который переводит текущий активный процесс в пассивное состояние и его локальное управление устанавливается на следующий оператор.

Если перед тем, как остановить работу некоторого процесса, его необходимо поставить в очередь, то надо выполнить оператор WAIT (S), где S обозначает очередь, в результате текущий процесс встанет в очередь S и перейдет в пассивное состояние.





Дата публикования: 2015-01-23; Прочитано: 178 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.012 с)...