
- •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.1.3. Последовательное представление процессов с помощью трасс
Последовательные процессы яатяются частным случаем параллельных процессов. Дтя представления последовательных процессов предлагается существенно более простая форма представления в виде структуры действий. Для предстаатения последовательных процессов можно полностью отказаться от явного задания множества событий, а вместо них использовать конечную или бесконечную последовательность действий.
Обозначим через А* бесконечную последовательность элементов из А. Элементы из А" могут быть отождествлены с тотальными отображениями "N на А. Определим множество Ам как
А® = А* и А£ .
Об элементах А03 мы говорим как о потоках (англ. stream) над множеством А. Множество А* последовательностей над А служит для представления конечных потоков над А.
Конкатенация может быть обобщена от конечных последовательностей на бесконечные, при этом для бесконечных последовательностей определим:
х °у = х дтя х б Ах, у е А(0.
Если х g А*, у е А*, то х ° у обозначает бесконечную последовательность, которая начинается элементами в х и за которыми следуют элементы в у.
Каждому последовательному процессу можно однозначно сопоставить поток действий - мы говорим в этом случае о трассе (spur, англ. trace) процесса. Это сопоставление происходит с помощью следующего отображения:
spur: {р: р последовательный процесс } -> А{0 . Определим: spur(p) = с,
если р = (Ео, <о, а) есть пустой процесс и тем самым Ео = 0. Если Ео * 0, то определим
spur(p) = <а> = spur(p|E0Me)) ,
причем пусть событие а есть однозначно определенное, наименьшее в смысле причинного порядка событие ври имеет место а(е) = а. Обратим внимание, что с помощью этого определения бесконечным последовательным процессам можно однозначно предписать бесконечные последовательности.
Трассы являются более простыми моделями дтя последовательного "ода работы системы, чем структуры действий. Так как в случае не последовательных систем во многих применениях вопрос о том, какие действия могут выполняться параллельно, имеет подчиненное значение, кажется естественным для таких систем упрощенно вместо одновременно протекающих в них процессов рассматривать их линеаризацию в качестве хода работы системы. Это упрощенное представление хода работы системы можно объяснить при помощи концепции последовательного наблюдателя. Представим себе, что наблюдатель системы каждое встречающееся действие протоколирует в линейном (последовательном) списке действий. Если действия во времени встречаются наряд}' друг с другом, наблюдатель принудительно приводит их случайным образом в линейный порядок следования. Если эти последовательные наблюдения применяют для представления хода работы системы, то говорят об "интерливинг"-модели.
Через множество линеаризаций процесса можно также-не последовательным процессам предписать множество потоков действий в качестве трасс. Для какого-либо (возможно, непоследовательного) процесса р = = (Е0, <о, а) определим множество его трасс с помощью следующего равенства:
трассы (р) = {трасса (q): процесс q есть совершенная линеаризация процесса р}.
Для моделирования распределенных систем многие склонны использовать не процессы с их явным представлением параллельности (в английском языке не очень удачно используется выражение true concurrency - истинный параллелизм), а технически более простые для применения множества потоков действии. В этом случае говорят об искусственной линеаризации (англ. interleaving).
Пример (трассы процесса). Процесс р, который описывается с помощью диаграммы действий, приведенной на рис. 1.6, обладает следующим множеством трасс:
трассы (р) = {<abcdef>, <abdcef>, <abcedf>, <acebdf>, <acbdef>, <acbedf> }.
A
b с
d e
\ /
f
Puc. 1.6. Процесс p
Правда, для наперед заданной структуры действий из ее множества трасс не всегда можно однозначно восстановить структуру процесса в смысле причинного порядка.
Пример (процессы, структура которых представляется с помощью трасс не однозначно). Процесс pi = (Ej, <j, cq) с
Ei = {e, d},
<, = {(e, c), (d, d)},
ai(e) = a, a,(d) = а
имеет, так же как и процесс р2 = (Е2, <2, а2) с Е2 = {е, dh
<2={(е, е), (d, d), (е, d)}, <х2(е) = a, a2(d) = а,
множество {<а а>} в качестве трассы. Это показывает, что при рассмотрении трассовой модели параллельность действий описывается не полно.
Предписывание конечному процессу множества потоков действий в качестве трасс, как показывает приведенное выше определение, не является проблематичным.
При предписывании конечному процессу множества потоков действий в качестве трасс наряду с выбранным выше сопоставлением напрашивается следующая альтернатива индуктивного определения. Определим множество S(p) трасс пустого процесса (процесса с пустым множеством событий) через {е>, а непустого процесса р = (Eq, <q, a) - через следующее уравнение:
S(p) = {<а> ° t: 3 е е Е0: а0(е) = а л V d е Е0: е <e dAt е S(p|EoMel) }.
S есть отображение, которое каждому процессу предписывает множество трасс. Это естественное уравнение для отображения S и тем самым для множества трасс процесса имеет для конечных процессов однозначное решение.
Индукцией по числу событий в р нетрудно доказать, что для каждого Конечного процесса р с Spuren (р) существует в точности одно решение Приведенного выше уравнения для S(p). Это, однако, не имеет места в случае бесконечных процессов - для них существуют различные решения указанного выше рекурсивного уравнения для отображения S. Решение с помощью Spuren(p) всегда является заданным отображением, кото- Рое процессам сопоставляет множества трасс их линеаризации.
Для бесконечных процессов - и с точки зрения теории неподвижной
Для бесконечных процессов - и с точки зрения теории неподвижной точки - кажется естественным семейству решений приведенного выше уравнения поставить в соответствие в качестве множества трасс наибольшее (в смысле включения множеств) из этих множеств. Это множество, как это можно показать индукцией по префиксу трасс, определяется однозначно. Будем обозначать это множество через Max_Spuren(p).
Множество Max_Spuren(p), однако, в общем случае не совпадает с множеством Spuien(p). Это отклонение снова должно иметь дело с понятием "справедливость" (англ. fairness).
Бесконечные потоки в множестве Max_Spuren(p)\Spuren(p) будем называть несправедливыми трассами бесконечного процесса р, а потоки в Spuren(p) - справедливыми трассами. Обратим внимание, что каждый конечный префикс последовательности в Spuren(p) является также последовательностью в Max_Spuren(p), и наоборот.
При упорядочении бесконечного множества событий и связанных с этим действий в линейном порядке, перекликающемся с причинным порядком, важную роль играет уже упомянутое понятие справедливости. Для определенных структур действий трассы, которые соответствуют определенным лннсаризаниям бесконечных префиксов рассматриваемого процесса, могли бы быть выбраны таким образом, что определенные события, а тем самым и соответствующие действия, не встречаются в ли- неаризапиях.
Проше говоря, трасса является справедливой, если каждое событие рассматриваемого процесса в конце концов принимается во внимание в трассе и тем самым соответствующее действие встречается в трассе Определенные выше трассы процесса, заданные с помощью множества Spuien(p), являются справедливыми в следующем смысле: каждому событию е в р можно однозначно поставить в соответствие индекс i е N так, что а(е) яаляется i-м элементом трассы. Бесконечный поток действий, трасса бесконечного префикса р, не являющаяся трассой самого р, называется несправедливой. Эти потоки, как правило (и по приведенному выше определению), сознательно не рассматриваются в качестве действительных трасс процесса.
Пример (трассы бесконечного процесса). Для бесконечного процесса р с графом действий, заданным на рис. 1.7, все последовательности ш {а, Ь}*, содержащие бесконечно много действий а и Ь, являются справедливыми трассами. Последовательности, которые содержат конечное число экземпляров действий а или же Ь, но бесконечно много экземпляров - смотря по обстоятельствам - других действий, являются несправедливыми трассами.
а —а —а —а —а —...
Рис. 1.7. Граф действий процесса р
Рассмотрим для представления графа действий нашего примера процесс Pi = (Е[, <|, а]) со следующих! определением (пусть < и соответственно < есть обычные порядки на целых числах Z):
Е, =Z\{0},
e<|d»0<e<dv0>e>d,
е < 0 => а 1 (с) = а, с > 0 => ai(e) = b .
Каждая трасса процесса р| является бесконечной последовательностью над множеством {а, Ь>, которая содержит как бесконечно много экземпляров действия а, так и бесконечно много экземпляров действия Ь. В трассах бесконечных префиксов, и тем самым в несправедливых трассах, может встретиться также бесконечно много экземпляров действия а, однако лишь конечное число экземпляров действия b или же бесконечно много экземпляров действия Ь, но лишь конечное число экземпляров действия а. □
При определении множества трасс бесконечного процесса кажется естественным ограничиться справедливыми трассами. Это ограничение, однако, влечет за собой ряд математических затруднении, так как тогда мы не можем определить множество трасс из множества трасс конечного префикс-процесса. Однако часто нам хотелось бы изучать свойства бесконечного процесса путем рассмотрения только конечных префиксов (аппроксимаций). Получается тесная связь с так называемым предположением справедливости для параллельно выполняющейся программы. К этому мы вернемся в разд. 1.2.