Используется модель синхронной связи по каналам. Это означает, что если процесс передал данные по каналу, то он может находиться в состоянии ожидания до тех пор пока эти данные с канала не будут извлечены или может продолжать вычисления, на данные из канала будут извлечены только при обращении к этому каналу других процессов на получение данных. Процесс, который первым инициировал обмен переходит в режим ожидания до тех пор пока второй процесс не инициирует обмен по этому каналу. В теории этот обмен называется обменом сообщений без буферизирования.
Самое интересное, что язык ОККАМ поддерживает только эту модель. Как только вы что-то передали в канал – ваш процесс заблокирован до тех пор пока другой процесс не примет данные того же типа по этому же каналу. Организовать обмен с буферизированием сообщений можно написав процесс, который это делает, то есть процесс находиться постоянно в процесс чтения входной очереди из входного канала и извлекает из этого входного потока номер того процесса которому он предназначен, выдает во входной канал свой выходной канал, но входной канал для другого процесса, который ожидает ввода. То есть можно легко организовать буферизирование, используя стандартные средства языка.
Пример:
а) CHAN OF INT C: // объявляется канал С, который предназначен
для пересылки целых чисел. С является глобальным идитификатором доступным всем процессам.
INT a // а определяется как целая переменная
PAR // задается секция параллельного выполнения.
Самое интересное, что нет фигурных скобок в языке ОККАМ. Это язык позиционного программирования. Секции определяются теми строками, которые расположены далее выступают на 2 пробела от начала слова PAR.
С!1 // порождается 1-ый процесс, который выдает целое число в канал С
C!a // порождается 2-ой процесс, который считывает из этого канала целое число, которое присваивается идинтификатору а.
То есть PAR создает 2 параллельных процесса(каждый из них описывается отдельной строкой): один из них выводит 1 в канал С, другой – вводит из канала значение которое будет передано по нему и присваивает это значение индетификатору а. Вот кусочек программы, который определяет особенности связи по каналам – самое ценное в языке ОККАМ.
Этот пример можно представить следующей схемой:
Имеется процесс С, которые выводит 1 и имеется процесс, который вводит индетификатор а и этот канал называется С. Здесь процесс не имеет имени, хотя можно было бы и присвоить ему имя.
б) использование конструкции ALT. Это альтернативное выполнение процессов взависимости от готовности данных в канале.
INT
WHILE TRUE (скобок никаких нет, но то что имеет отношение к телу WHILE имеет отступ 2 пробела от 1-го знака слова WHILE)
ALT // альтернативное выполнение процессов
left.chan?x // в левый канал вводим число x
output!x // тело процесса left.chan
right.chan?x //
output!x
Эта конструкция непрерывного объединения 2-х потоков данных.
Есть некий процесс alt:
Alt конструкция означает, что войдя в тело этого процесса не ожидает готовности данных, а проверить: есть ли готовность данных – выполняется этот процесс, если нет готовности, то второй процесс выполняется. Предположим целые числа поступающие с левого или правого канала всегда однозначно подаются в выходной канал – это объединение 2-х потоков данных.
