Понятие процесса
Применительно к системам моделирования процесс может быть определен с помощью концепции событий. Все множество событий {EV1, EV2, …, EVK} разбивается на подмножества {E1,E2,…, Ek} может быть пересекающееся, каждая из которых может быть связана с определенным процессом. Возникновении события EVi, принадлежащее подмножество Ek означает активизацию процесса PRk. То есть в течении интервала времени между метками ближайших событий EVl v EVm, принадлежащий подмножеству Ek в течении времени процесс PRk ждет активизации.
Процесс – это ориентированное по времени последовательность событий, наступление которых приводит к изменению состояния системы за счет выполнения активности. Понятие процесса концептуально более емкое, чем понятие события или состояния. Состояние – это моментальный «снимок» процесса. А событие – управляющее воздействие, заставляющее процесс изменить состояние. В концепции параллельных процессов важное значение имеет их синхронизация.
Схема слабо связанных процессов. Интеррагативное управление специального вида с помощью сигналов
|
|
С помощью схемы слабо связанных процессов организуется взаимодействие квазипараллельных процессов. Каждый процесс представляет собой последовательную программу. Выполнение нескольких таких программ организуется за счет передачи управления между ними с помощью монитора моделирования.
Термин «слабо связанные» означает взаимодействие через монитор моделирования. Вместо функций условий для интерраготивного управления используются объекты специального вида – сигналы. Сигнал может находится в двух состояниях: послан, не послан. Посылка сигнала связана с выполнением условия: CN=(сигнал послан?)=true.
На уровлен реализации сигнал связан с множеством процессов, ожидающих его.
Структура объекта сигнал
SIGNAL
Состояние сигнала |
Указатель на список процессов, ожидающих сигнал |
Все существующие в системе процессы представляются дескрипторами, связанными в кольцевой список
DESCR
Идентификатор процесса |
Признак готовности: 0 - готов |
Указатель на следующий дескриптор в списке процессов |
Указатель для связи дескрипторов в очередь к некоторому сигналу |
Кольцо готовности процессов. P1 – P4 – идентификаторы
CP
P1 |
0 |
P1 |
P2 |
0 |
P3 |
0 |
P4 |
0 |
CP – указатель на текущий выполняемый процесс.
Каждый процесс может посылать сигнал (оператор SEND) и ожидать посылки сигнала (оператор WAIT). Управление пересылкой сигналов производит монитор.
|
|
Когда один текущий процесс выдает команду WAIT(S) его признак готовности устанавливается в единицу и он включается в конец очереди к сигналу S. Текущим становится ближайший в кольце процесс, у которого признак готовности 0. Когда текущий процесс выдает команду SEND(S), то если очередь к сигналу S пуста, ничего не происходит – продолжается выполнение текущего процесса. Если очередь к сигналу S не пуста, из неё удаляется первый процесс, признак готовности у него устанавливается в 0 – он становится текущим. Процесс выдавший команду SEND остается готовым, но перестает быть текущим. Одновременно могут существовать очереди к нескольким сигналам, но они не пересекаются, т.к. любой процесс может ожидать посылки единственного сигнала
CP
P1 |
0 -> 1 |
P1 |
P2 |
0 -> 1 |
P3 |
0 -> 1 |
P4 |
0 |
SEND(S)
P1 |
0 |
P1 |
P2 |
1 |
P3 |
1 |
P4 |
0 |
Сигнальная сигнализация слабосвязанных процессов
Процесс 1 . . . SEND(S) |
Процесс 2 WAIT(S) . . . |
Монитор |
Передача управл.
Передача управл.
Взаимодействие квазипараллельных процессов организуется по схеме сопрограмм, когда тело процесса выполняется не с самого начала, а с той точки, где выполнение было приостановлено.
Пример: Взаимодействие двух процессов поставщик и потребитель происходит с использованием общего буфера сообщений.
Пример: взаимодействие двух процессов: поставщик и производитель происходит с использованием с использованием общего буфера входящих сообщений.
IMPLEMENTATION MODULE BUFFER;
Const N=128; (*размер буфера*)
Var n:[0..N]; (*текущее число элементов в буфере*)
НЕПОЛОН: SIGNAL; (*n<N*)
НЕПУСТ: SIGNAL; (*n>0*)
IN, OUT: [0..N-1]; (*индексы*)
BUF: array[0..N-1] of char; (*буфер*)
procedure ПОМЕСТИТЬ(x:char);
begin
If n=N then WAIT (НЕПОЛОН);
n:=n+1; BUF[IN]:=x;
IN:=(IN+1) mod N; SEND (НЕПУСТ);
end;
procedure ИЗВЛЕЧЬ (x:char);
begin
If n=0 then WAIT(НЕПУСТ);
n:=n-1; x:=BUF[OUT];
OUT:=(OUT+1) mod N;
SEND (НЕПОЛОН);
end;
begin
n:=0; IN:=0; OUT:=0;
INITSIGNAL (НЕПОЛОН);
INITSIGNAL (НЕПУСТ);
end.