7.4 Согласование процессов
Согласованием процессов называются действия,
осуществляемые для обеспечения согласованности процессов. Согласование процессов
происходит с помощью обмена асинхронными сообщениями.
Сообщением называется некоторое количество информации,
передаваемое между процессами, представляющее для них единое целое.
Действия, реализующие распространение информации из одного
процесса в другие, называются передачей сообщений. В общем случае, передача
сообщений из некоторого процесса может осуществляться каждый раз после
завершения очередной фазы его исполнения.
Действия, осуществляемые процессом в случае получения
сообщения, называются обработкой сообщения. Обработка сообщения является
отдельной фазой исполнения процесса. Процесс не принимает и
не посылает никакие сообщения до завершения очередной фазы своего исполнения.
7.4.1 Классификация сообщений
В языке различаются прямые и потоковые, а также
переключающие и информационные сообщения.
Прямые и потоковые сообщения имеют следующие принципиальные отличия:
1. Прямые сообщения передаются непосредственно от одного
процесса к другому (в виде дальнего вызова предиката), а потоковые сообщения — от
одного процесса ко многим (в виде значения общей переменной).
2. Прямые сообщения никогда не теряются при передаче,
в то время как потоковые сообщения, которые процесс ещё не успел обработать,
могут быть заменены более новой информацией.
Отличие переключающих и информационных сообщений состоит в том что:
1. В результате обработки переключающего сообщения
процесс может перейти в состояние «доказанный», «неудачный»
или (остаться в состоянии) «сформированный», в то время как после
обработки информационного сообщения процесс всегда оказывается в
состоянии «доказанный».
2. В отличие от переключающих сообщений,
обработка информационных сообщений процессом откладывается
до тех пор, пока он не окажется в состоянии «доказанный».
В случае если обработка переключающего сообщения
завершилась неудачей или исключительной ситуацией, процесс переходит в состояние
«неудачный» или — если перед началом обработки сообщения он находился в состоянии
«сформированный» — в состояние «сформированный». В случае если неудачей или
исключительной ситуацией завершилась обработка информационного сообщения,
происходит «поглощение» сообщения: состояние процесса восстанавливается на момент,
предшествовавший обработке сообщения, а само сообщение отменяется.
В языке используются переключающие потоковые, а
также прямые информационные и прямые переключающие сообщения.
Порядок обработки сообщений в языке не определён, однако
в случае если процессу необходимо обработать несколько сообщений, прямые сообщения
всегда обрабатываются после потоковых, а информационные, при прочих равных условиях,
после переключающих. Если процесс, получивший сообщения является целевым процессом
некоторого резидента, вычисление значений функции резидента, при прочих равных
условиях, осуществляется после обработки переключающих сообщений, но до обработки
информационных сообщений. Гарантируется, что при условии возможности обработки
сообщения, оно обязательно будет обработано через некоторый конечный промежуток времени.
7.4.2 Прямые сообщения
Прямым сообщением называется сообщение, реализующее
исполнение дальнего вызова предиката из одного процесса в другом.
Передача прямых сообщений, подготовленных в результате
исполнения дальних вызовов предикатов в течение некоторой фазы F
исполнения процесса G, происходит в случае успешного завершения рассматриваемой фазы F.
Перед передачей прямых сообщений все несвязанные
переменные в их составе заменяются соответствующими фиксированными производными значениями процесса G.
Обработка прямого сообщения (принимающим) процессом Н включает следующие действия:
1. Осуществляется активизация всех портов S,
текущее значение D которых не является пустым, а производитель текущего
значения не равен Н, таких что:
(a) порт S относится к сорту «отключающий»;
(b) порт S относится к сорту «простой», а сорт текущего значения D равен «защищенное».
2. В соответствующем мире процесса Н, указанном в дальнем
вызове предиката Р в составе обрабатываемого сообщения, (временно) создаётся
и доказывается новый актор Q, соответствующий вызову предиката Р.
В частности, если процесс Н находится в состоянии «сформированный», то в
момент (успешного) завершения доказательства предиката Р, во всех
мирах этого процесса, сформированных в ходе исполнения конструктора процесса
Н, (для согласования акторов процесса Н) создаются и доказываются новые акторы,
представленные акторными вызовами предиката goal.
3. В случае успешного завершения доказательства
актора Q, обработка сообщения считается успешно завершённой. В
случае если доказательство актора Q завершилось неудачей или исключительной
ситуацией, обработка сообщения прекращается.
4. После завершения обработки сообщения, актор Q
прекращает существование.
Обработка прямых сообщений процессом допускается лишь
в том случае, если он уже обработал все полученные им потоковые сообщения,
и, следовательно, не имеет несогласованных портов.
Примечание. Рекомендуемые графические обозначения прямых сообщений:
а) Информационное прямое сообщение.

б) Переключающее прямое сообщение.
7.4.3 Потоковые сообщения
Потоковыми сообщениями называются сообщения,
реализующие передачу производных значений общих переменных из
одного процесса в другие. Потоковые сообщения передаются и
принимаются через порты процессов.
Каждому потоковому сообщению ставятся в соответствие:
1. Значение потокового сообщения — некоторый терм.
2. Сорт потокового сообщения — вспомогательное логическое значение: «защищенное» или «незащищённое».
3. Производитель потокового сообщения — процесс, построивший значение потокового сообщения.
Существуют следующие вспомогательные разновидности потоковых сообщений:
1. «Пустые» сообщения — потоковые сообщения,
значения которых равны анонимной переменной «_». Значения пустых
сообщений называются «пустыми» значениями.
2. «Отключающие» сообщения — потоковые сообщение,
значения которых являются задерживающими.
Потоковые сообщения, отличные от пустых, называются «непустыми».
Значения непустых потоковых сообщений называются «непустыми» значениями.
Различаются два сорта потоковых сообщений — «защищенное»
и «незащищённое». Использование двух разновидностей сообщений необходимо для
управления передачей потоковых сообщений между процессами. В ходе передачи
потоковых сообщений из некоторого процесса G незащищённое сообщение не может
изменить глобальное значение, переданное в виде защищенного сообщения из
какого-либо другого процесса (отличного от G).
Потоковое сообщение является защищенным (относится к сорту
«защищенное»), если оно непустое и было отправлено (передано) через защищающий
порт. В остальных случаях потоковое сообщение является незащищённым (относится
к сорту «незащищённое»). В частности, сорт пустого сообщения всегда «незащищённое».
В дальнейшем мы будем использовать специальное обозначение — функцию «сорт потокового
сообщения», реализующую описанные выше правила и зависящую от значения А сообщения
и сорта порта R: sort_of_flow_message(A,R).
Передача непустых переключающих потоковых сообщений из
процесса осуществляется каждый раз при переходе этого процесса в состояние
«доказанный», за исключением фаз процесса, закончившихся поглощением принятого
процессом сообщения.
Передача пустых сообщений из процесса осуществляется
каждый раз при переходе этого процесса из состояния «доказанный» в состояние
«неудачный» или «неиспользуемый». Передача пустых сообщений из процесса
называется «освобождением» общих переменных.
Будем придерживаться следующих обозначений:
sort(X) — «сорт X», state(X) — «состояние X», creator(X) — «производитель,
построивший X», X==Y — «возможна унификация термов X и Y», XoY — «X не равно
Y», X:=Y — «X получает значение Y».
Передача потоковых сообщений осуществляется следующим образом:
1. После окончания очередной фазы исполнения некоторого процесса G строятся значения отправляемых потоковых сообщений:
- фиксированные производные значения процесса, если отправляются непустые сообщения, или
- пустые значения, если отправляются пустые сообщения.
2. Каждое построенное значение А сопоставляется
с текущим значением В порта R процесса G, через который оно должно быть
передано. В соответствии с результатами сопоставления осуществляются следующие
действия:
- Если А==В и sort_of_flow_message(A,R)=sort(B),
устанавливается state(R):= «согласованный», передача рассматриваемого
потокового сообщения отменяется.
- Если sort_of_flow_message(A,R)=«незащищённое»,
sort:(В)=«защищённое» и creator(B)<>G, передача рассматриваемого потокового
сообщения отменяется.
- В остальных случаях устанавливаются В:= А,
sort(B):= sort_of_flow_message(A,R), creator(B):= G, state(R):= «согласованный».
3. Текущее значение В каждого порта R процесса G
сопоставляется с текущим глобальным значением V этой переменной. В соответствии
с результатами сопоставления осуществляются следующие действия:
- Если B==V и sort(B)=sort(V), передача
рассматриваемого потокового сообщения отменяется.
- Если sort:(В)=«незащищённое»,
sort:(\/)=«защищённое» и creator(V)<>G, передача рассматриваемого
потокового сообщения отменяется.
- В остальных случаях устанавливаются V:= В,
sort(V):= sort(B), creator(V):= G.
4. Для каждого порта S каждого процесса Н,
таких что HoG и V является переменной (портом S) процесса Н, осуществляются
следующие действия:
(4i) Сопоставляются текущее глобальное значение V и текущее значение
D порта S. В соответствии с результатами сопоставления осуществляются
следующие действия:
- Если V==D, sort(V)=sort(D) и
creator(V)=creator(D), никакие действия не осуществляются.
- Если V==D, sort(V)=sort(D),
но creator(V)ocreator(D), устанавливается creator(D):= creator(V).
- Если sort(\/)=«незащищённое»,
sort(D)=«защищённое» и creator(D)=H, никакие действия не осуществляются.
- В остальных случаях устанавливаются
D:= V, sort(D):= sort(V), creator(D):= creator(V), state(S):= «несогласованный».
Последовательности действий, осуществляемых
на этапах (2), (3), (4i) не могут быть прерваны никакими операциями,
осуществляемыми другими процессами, использующими те же операнды.
Признаком получения некоторым процессом Н потокового
сообщения является наличие у процесса несогласованного порта. В случае получения
процессом потокового сообщения, он осуществляет обработку этого сообщения.
Если процесс получил задерживающее значение через некоторый
отключающий порт, обработка любых сообщений этим процессом откладывается,
а процесс переводится в состояние «неиспользуемый». В дальнейшем, процесс
будет автоматически возвращён в состояние «используемый», как только значения
всех его отключающих портов перестанут быть задерживающими.
При переходе процесса Н из состояния «неиспользуемый»
в состояние «сформированный», автоматически вызывается формирование процессов,
которые ещё не были сформированы, создателем которых является процесс Н.
Если процессу необходимо обработать несколько
переключающих потоковых сообщений, осуществляется их одновременная
обработка («интерференция» потоковых сообщений).
Обработка потоковых сообщений некоторым процессом Н
включает следующие действия:
1. Осуществляется активизация всех портов S, текущее
значение D которых не является пустым, а производитель текущего значения не равен Н,
таких что:
- порт S является несогласованным, за исключением защищающих портов S, значения которых являются незащищёнными;
- порт S относится к сорту «отключающий»;
- порт S относится к сорту «простой», а сорт текущего значения D равен «защищенное».
2. Все порты процесса Н приводятся в согласованное состояние.
3. Осуществляется согласование акторов процесса.
В частности, если процесс Н находится в состоянии «сформированный»,
во всех мирах этого процесса, сформированных в ходе исполнения конструктора
процесса Н, создаются и доказываются новые акторы, представленные акторными
вызовами предиката goal.
Специальной разновидностью переключающих потоковых
сообщений является «инициализирующее» сообщение, автоматически получаемое каждым
новым процессом. Инициализирующее сообщение считается полученным процессом
независимо от того, имеет ли он какие-либо порты, а также от состояния этих
портов. При этом, однако, осуществляется интерференция инициализирующего
сообщения с любыми другими переключающими потоковыми сообщениями, а
обработка инициализирующего сообщения происходит по общим правилам
обработки потоковых сообщений.
Примечание. Рекомендуемое графическое обозначение для переключающих потоковых сообщений:
Содержание