Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VPKS_v2_UKR_new.doc
Скачиваний:
21
Добавлен:
11.09.2019
Размер:
2.31 Mб
Скачать

2. Найпростіші процеси-примітиви

Їх два: SKIP і STOP.

SKIP - процес, що нічого не виконує, але благополучно закінчується.

STOP так само нічого не робить, але побуджує виняткову ситуацію, що викликає передчасне закінчення OKKAM-програми.

3. Послідовні процеси-композиції

У послідовній програмі всі дії зводяться до умовних або безумовних обчислень деяких значень.

Обчислення значення виразів в Оккам-програмах виробляються у процесах-примітивах присвоєння виду:

Змінна := вираз

Щоб сформулювати мовою ОККАМ послідовний процес, необхідно написати ім'я конструктора послідовного процесу композиції – SEQ, а далі записати його підпроцеси – компоненти один під іншим з відступом стосовно SEQ у два пробіли. Якщо під зарезервованим словом SEQ не буде перебувати жодного процесу-компонента, послідовний процес-композиція буде поводитися так само як процес-примітив SKIP.

Наприклад: SEQ

a := 1

b := a + 7

a := d-11

SKIP

Умовні обчислення виразів реалізуються на основі умовного конструктора IF і списку процесів-компонентів, у кожного з яких є своя умова виконання. Кількість умов і відповідних їм процесів-компонентів в одному конструкторі IF теоретично не обмежено.

Процеси-компоненти записуються під своєю умовою з відступом у два пробіли і являють собою або процеси-примітиви, або процес-композиції.

При обробці конструктора IF умови проглядаються зверху вниз доти, доки не буде знайдена перша умова, що має значення “істина” у цей момент обчислення. Після цього виконується процес-компонент під цією умовою. Якщо жодна з умов конструктора IF не є істиною, процес-композиція, утворений за допомогою конструктора IF вироджується в процес-примітив STOP.

Наприклад IF

X < 0 X < 0

Y := 1 y:=1

X = 0 x = 0

Y := 0 y := 0

X > 0 TRUE

Y := -1 Y := 1

В останньому випадку, TRUE гарантує від дедлока, тобто виконується оператор STOP якщо не виконується жодна з умов.

4. Паралельні процеси

Для проектування процесів-композицій, для яких порядок виразів і дій не важливий, у мові передбачений конструктор паралельних процесів PAR.

Процес-композиція, утворений за допомогою PAR, закінчується, коли всі підпроцеси-компоненти цього процесу в довільному порядку закінчать свою роботу. Якщо конструктор PAR не має підпроцесів-компонентів, він вироджується в процес-примітив SKIP.

Якщо ж який-небудь із підпроцесів-компонентів не може закінчитися, не може закінчитися й весь процес-композиція. При цьому збуджується виняткова ситуація, що поширюється нагору по ієрархії процесів до кореневого процесу Оккам-програми, наприклад

PAR

a := b - 5.

d := b + 1

Процес встановлює значення для змінних a і d. Порядок виконання цих процесів-компонентів неважливий. Ще приклад:

PAR

a := b - 5.

b := a + 2

Тут результат непередбачений.

Деякі компілятори з мови ОККАМ розпізнають подібні ситуації й видають повідомлення про помилки, як ми вже зазначали, процеси мови ОККАМ можуть мати загальну пам'ять тільки для читання.

5. Канали зв'язку

Як механізм передачі повідомлень обрана синхронна модель. Вона будується на основі посередника з назвою “канал”. Кожний канал має унікальне ім'я й передає інформацію тільки в одному напрямку, і так само використовується тільки одним процесом-передавачем і одним процесом-приймачем.

Для передачі значення виразу через канал можна використати простий процес-примітив виводу:

channel ! expression або

ім'я_каналу ! вираз.

Символ “!” позначає вивід у канал. Для прийому значення з каналу в деяку змінну використовується процес-примітив введення:

channel ? variable або

ім'я_каналу ? змінна.

Символ “?” позначає введення значення змінної.

Зв'язок між процесами синхронний. Тому перший процес, що виконав одну із цих команд буде припинений доти, доки його не “наздожене” процес-контрагент, що виконує процес-примітив вводу-виводу. Як приклад розглянемо ОККАМ- реалізацію буфера даних.

SEQ

buffer.in ? x

buffer.out ! x

Цей процес має на увазі, що паралельно із ним функціонує хоча б один процес, що містить процес-примітив виводу в каталог з ім'ям buffer.in і процес-примітив введення з каналом з ім'ям buffer.out.

Для скорочення запису при прийманні або передачі складних структур даних в один канал можливий запис:

channel ? variable.1;variable.2; ...або

сhannel ! expression.1;expression.2;....

Ці записи еквівалентні наступним процесам-композиціям.

SEQ

channel ? variable1

channel ? variable2

SEQ

channel ! expression...1

channel ! expression.2

Розглянемо два паралельних процеси:

Р1 P2

SEQ SEQ

chan1 ! A chan1 ? X

chan2 ! B chan2 ?Y

Якщо Р1 починає виконуватися раніше Р2, то Р1 буде затриманий при спробі запису в chan1 значення вираз А. Р1 буде перебувати чекаючи доти, поки не стане виконуватися Р2, а це його процес-примітив прийому з каналу chan1 значення вираз А і запису його в змінну Х. При виконанні цього процесу-примітива Р2 звільняє з режиму очікування Р1 і сам попадає в цей режим при виконанні процесу-примітива виводу значення вираз Y у канал 2.

Р2 перейде зі стану очікування, коли процес Р1 передасть керування своєму процесу-примітиву введення через chan 2 значення Y c записом його в змінну В. Після цього обидва процеси Р1 і Р2 стають активними.

Модифікація цього приклада приведе програму в стан дедлоків.

P1 P2

SEQ SEQ

chan1 ! A сhan2 ! Y

сhan2 ? B chan1 ? X

Р1 не може запуститися доки Р2 не зчитає з каналу chan 1 значення вираз А, Р2 не може цього зробити поки не виконає операцію запису значення Y в chan 2.

Це класичний приклад дедлока в паралельній програмі.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]