
- •1. Процессы, коммуникация и координация в распределенных системах
- •1.1. Процессы
- •1.1.1. Структуры действий как процессы
- •1.1.2. Структурирование процессов
- •1.1.3. Последовательное представление процессов с помощью трасс
- •1.1.4. Рашуженис процесса на подпроцессы
- •1.1.5. Действия как переходы состояний
- •1,2. Описания систем через множество процессов
- •1.2.1. Сети Петри
- •1.2.2. Термы для описания процессов
- •1.2.3. Синхронизация и координация агентов
- •1.2.4. Предикаты над процессами
- •1.3. Языки программирования для описания взаимодействующих систем
- •1.3.1. Коммуникация через обмен сообщениями
- •1.3.2. Общие программные переменные
- •1.3.3. Языковые средства для параллельных ходов работы
- •1.3.4. Потоки ввода/вывода
- •2.1. Основные аспекты операционных систем
- •2.1.1. Функции операционной системы
- •2.1.2. Режимы обработки
1.2.3. Синхронизация и координация агентов
До сих пор при параллельной композиции агентов мы не накладывали никаких ограничений на отношение порядка между событиями агентов. Однако часто мы хотим выразить, что между множествами событий процессов параллельно протекаемых агентов должны иметь место определенные отношения. Тогда мы говорим о координации иди синхронизации параллельных процессов. Дш этой цели наряду с уже представленной полностью независимой параллельной композицией агентов мы введем несколько позже оператор композиции, который разрешает координацию параллельно выполняющихся агентов.
Координация особенно необходима, чтобы при параллельно протекающих процессах можно было исключить конфликты.
Пример (координируемый параллельный процесс). Рукопожатие двух персон можно описать как параллельный процесс, как это показано на рис. 1.29. При этом рукопожатие есть общее действие обоих параллельно протекающих процессов, которые моделируют поведение персон А и В. Г
Пусть pi = (Ei, <i, ai) a P2 = (Е2, <2- ct2) - параллельно протекающие промессы. Элементы множества событий К = Ej п Е2 называются общими событиями процессов pi и р2. Действия, которыми помечены общие события, называются синхронными. Естественно, мы требуем, чтобы для причинных порядков координирование протекающих пара-тлелышх процессов pi и р2 причинные порядки на общих событиях совпадали:
<l|K х К = <2|к х К ■
Рис.
1.29. Процесс рукопожатия
Пусть S - подмножество множества действий А. Процесс ро = (Ео, <о, ао) может быть сложен из процессов р] и р2 тем, что мы события, помеченные действиями из S, установим в качестве общих событий. Тогда справедливо:
ispar(po, рь Р2. S) .
Нам хотелось бы также использовать другие отличительные признаки .для охватывация соответствующих действий применительно к синхронизируемому множеству S, чтобы установить, какие события параллельных процессов должны быть общими. Однако сначала мы ограничимся этим простым случаем. Как будет видно позже, также и действия посылки и приема, которые принадлежат к событиям действий по коммуникации (англ. rendezvous, handshake), могут рассматриваться как действия, которые являются метками общих событий обоих участвующих процессов.
Позднее, при рассмотрении языков программирования для описания параллельно функционирующих систем, мы вернемся к этим вопросам.
Ради простоты в этом разделе мы рассмотрим лишь следующий частный случай для установления общих событий. Множество действий А разлагается на два дизъюнктивных подмножества U и S:
действия множества U являются асинхронно выполняемыми действиями,
действия множества S являются только синхронно выполняемыми действиями.
Введение параллельных композиций агентов, которые относительно событий, помеченных определенными действиями, должны протекать синхронно, порождает новые вопросы и проблемы. Что произойдет, если оба параллельно выполняющиеся агента настаивают на синхронном выполнении различных (не согласующихся друг с другом) действий? В этом случае не может иметь место событие (не выполняется никакое действие), поскольку для каждой пары сшгхронных действий требовалась бы готовность обоих агентов. Здесь мы также говорим о тупике.
Наряду с обсуждавшейся до сих пор простой, несинхронизируемой параллельной композицией агентов мы заинтересованы и в синхронизируемой параллельной композиции агентов. Это может происходить, например, посредством синхронной параллельной композиции ||$, nie S обозначает множество действий, которые при параллельно протекающих процессах должны выполняться синхронно.
Пример (рукопожатие). Пусть имеют место действия, как в предыдущем примере. Определим процесс рукопожатия, как он задан на рис. 1.29, с помошью агента:
(al; с; а2) ||(с, (Ы; Ь2; с; ЬЗ) .
С гюмошыо параллельной композиции ||(С) действие с выполняется синхронно, а все остальные действия выполняются асинхронно. I
Точное значение синхронной параллельной композиции по отношению к ходу течения процесса задается следующими правилами:
t, —-—> г, л t2 —-—>г2 л ispar(p, рь р2, S) => t, |is t2 —r, ||s r2,
tj —Ei—>skip л t2 ———»skip л ispar(p,pi,p2,S) => t, ||st2 —-—vskip.
Эти правила яаляются обобщением уже рассматривавшихся правил для несинхронизируемой параллельной композиции. Здесь имеет место то, что какой-либо процесс есть ход работы агента ц [|st2, если он возникает через параллельную композицию ходов работы t] и t2, причем в парат- лельной композиции этих процессов события, помеченные действиями из S, яаляются общими событиями. Обратим внимание, что по этому определению существуют агешы, которые отличны от skip, но тем не менее являются терминальными и тем самым не могут выполнять какого-либо процесса, кроме пустого. Говорят, что такие агенты находятся в тупике.
Пример (тупик). Агент а ; b ||(a.b) b ; а
находится в тупике, поскольку он не может выполнять ни действия а, ни действия Ь. □
Наряду с синхронизацией процессов относительно определенных действий над общими событиями имеется дальнейшее пожелание относительно координации параллельно выполняющихся агентов о "взаимных исключениях". Определенные последовательности действий одного areirra должны выполняться без того, чтобы параллельно имели место определенные действия другого агента, например дтя избежания конфликтов между действиями. С помощью синхронной параллельной композиции
Ч lis t2
порождается процесс, который (при отсутствии возникновения тупиков) содержит определенные линеаризации ходов работы Ц и t2 как частичных процессов. Возникают дальнейшие причинные отношения между событиями в обоих частичных процессах - это можно ввести дтя обеспечения взаимных исключений.
■ч |
|
|
Р |
|
/ |
ы |
/ |
X |
|
|
|
at , \ |
/ |
\ |
ч |
\ |
/ |
\ |
ч |
Р
Рис. 1.30. Процесс с взаимным исключением deucmsuu Ь] и Ь2Пример (взаимное исключение через пару синхронизируемых действий). Пусть даны следующие три агента:
ti = xl :: al ; р ; Ы ; v ; xl = х2 :: а2 ; р ; Ь2 ; v ; х2 к = у :: р ; v ; у .
Предположим, что действия bj и Ь2 могут конфликтовать между собой и поэтому не должны выполняться параллельно. Для агента
Ч II t2
возможен ход работы, заданный с помощью следующего графа действий:
al -> р bl -> v —► al —» р —► Ы -> v —► ...
а2 -> р Ь2 —► v —> а2 —> р —> Ь2 v —► ...
Этот процесс содержит пару параллельных событий, которые помечены конфликтующими действиями bj и Ь2. В агенте
OlIM2) ll(v.p)k
такой ход работы исключается; возможный ход работы показан на рис.
Обратим внимание, что каждое выполнение действий р и v агента к совпадает с одними из действий р и v или агента tb или агента t2, но что р и v - действия в процессах tj и t2 не помечают каких-либо общих событий.
Во всех ходах работы модифицированного агента нет больше ни одной пары параллельных событий, помеченных действиями Ь| и Ь2. В нотации сетей Петри наш пример представляется так, как показано на рис.
Здесь в сеть Петри введен вспомогательный вентиль с для обеспечения взаимных исключений.
Рис.
1.31. Сеть Петри для взаимных исключений
bj и b2
Методика обеспечения взаимных исключений, описанная в примере для агентов, может быть использована в более обших случаях. Пусть а - действие, находящееся в конфликте с самим собой, которое встречается сколь угодно часто в агентах t] и t2. В агентах tj и t2 заменим действие а на терм агентов
Р ; а ; V ,
причем пусть р и v - до сих пор не встречавшиеся действия в t[ или t2. Тогда мы получим агенты tf и t2'. Агент с::р; v; с в каждом ходе работы агента
О Г II (2') lljp.vt с :: р; v; с
по мерс надобности вынуждает один из обоих агентов tf или t2' ждать с выполнением р; a; v - до тех пор, пока агент с::р; v; с снова будет готов для события, помеченного действием р. Мы получим ходы работы вида, приведенного на рис. 1.32.
События с действием а в t'i или t"2 в ходах работы, описанных с помощью агента
01* II h') 11{Р. V} С :: р; v; с,
полностью линейно упорядочены. Впрочем, при таком способе действий для обеспечения взаимных исключений возникают агенты, которые обнаруживают дополнительные возможные тупики - в случае, когда в агенте tj или t2 в параллельных композициях действие а должно выполняться синхронно.
Лемма (взаимное исключение). Для любого агента t, в котором действие а всегда встречается в виде р; a; v и иначе действия р и v не встречаются, справедливо, что каждый из процессов, порождаемых агентом I' вида
= 0 ll(p. V} с :: р; v; с )
не содержит никакой пары параллельных событий, помеченных действием а.
Доказательство. Пусть р' - процесс, порождаемый агентом t'. События, которые помечены действиями р или v, образуют последовательный под- Процесс, в котором р и v чередуются. Каждому событию е, помеченному через а, может быть однозначным образом предписано натуральное число nv(e), соответственно пр(е) - число событий, которые являются причиной Для е и которые помечены через v, соответственно через р. Каждому событию е, помеченному через а, можно однозначно предписать помеченное через р событие егр(е), которое является причиной для е, а также помеченное через v событие erv(e), для которого е яатяется причиной.
Ч
-396с: p; v; с
P
t2
Puc.
1.32. Взаимное
Индукция по числу событий показывает, что np(e) = пр(егр(е)), nv(e) = nv(erv(e)). Транзитивность отношения причинности дает, что помеченные действием а события образуют также последовательный подпроцесс. □
Обратим внимание, что благодаря обеспечению взаимного исключения путем дополнительного введения координирующих действий, надо принимать в расчет новые тупики. Поэтому, как правило, требуется тщательный анализ, чтобы исключить такие нежелательные побочные эффекты.
К вопросу о взаимных исключениях мы еще раз вернемся в разделе о языках программирования для описания распределенных систем.