
- •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.5. Действия как переходы состояний
До сих пор множества действий мы не интерпретировали дальше. Важное значение для действий в процессах имеет изменение состояния. Если действия могут изменять состояние системы, то эти изменения состояния мы можем принять в качестве значений действий. Теперь нас интересует, в частности, вопрос о том, можно ли через такие предписывания значений действиям также однозначно предписать значения и процессам.
Для этой цели определим недетерминированные автоматы состояний с транзитивными действиями. Такие автоматы задаются следующими составными частями:
S множество состояний,
А множество транзитивных действий,
R с S х А х S отношения переходов состояний,
So множество возможных начальных состояний.
Пусть заданы состояния cq, Ст| « R и действие а € А. Отношение (сто, а, стО е R выражает, что в состоянии ctq действие а может быть выполнено и это может привести к следующему состоянию ctj е R. Этот тип автоматов называется недетерминированным, так как для одного состояния могут быть возможными многие транзитивные действия и каждое из этих действий может вести к различным последующим состояниям.
Мы будем использовать запись
а
Сто > CTi ,
чтобы выразить, что (сто, a, Ст() е R справедливо.
- Каждому автомату состояний можно, исходя из заданного множества Начальных состояний, предписать трассы. Последовательность а;, где Ui<k,keNu {х}, есть конечная или бесконечная трасса действий автомата, если существует последовательность состояний <т,, 0 < i < к, с со e So и
а •
ст;-! 1—> с^ для всех i, 1 < i < к.
С помощью переходов состояний можно охарактеризовать ряд существенных свойств действий.
Действие а называется детерминистическим, если для каждого состояния сто € S существует не более одного последующего состояния Ст[ е S с
СТо —_—> а,.
Действие а называется тотальным, если для каждого состояния ао е S существует одно последующее состояние <3] с
ст0 —-—► ах.
Тотальным, детерминистическим действиям можно предписать (тотальные) отображения изменений состояний. Пусть S - множество состояний. Каждому' действию в А предпишем изменение состояния в силу отображения р: р: А (S S).
Конечным, последовательным процессам можно тотчас предписать ото браження изменения состояний с помощью функциональных следующих друг за другом переключений отображении изменения состояний отдельных действий.
Пример (процесс выполнения программы с изменениями состояний). Ход выполнения следующей программы
у := 1; х := 10; while х > 0 do у := х * у; х := х - 1 od
соответствует последовательной структуре действий, для которой ее события, действия и состояния приведены в табл. 1.5.
Здесь такие действия, как (х > 0)'?, обозначают действия опроса, которые не изменяют пространства состояния данных. Если, однако, мы добавим управляющие состояния (например, счетчик команд) к пространству состояний, то опрос также будет изменять состояние.
Для приведенной выше программы состояния заданы парой чиа л (n, т), которые представляют значения программных переменных х и v. Для встречающихся действий рассмотрим следующие отображения изменений состояний:
p(y:=l)(n,m) = (п.1), р(х := 10) (n, т) = (10, т),
р(у := х * у) (n, m) = (n, п * ш), р(х := х - 1) (n, m) = (п - 1, ш), р(х > 0) (п, т) = (п, т).
Событие |
Действие |
Состояние |
|
X |
У |
||
ао |
у := 1 |
? |
1 |
ь0 , |
х := 10 |
10 |
1 |
а1 |
(х > 0) ? |
10 |
1 |
bl |
у := х * у |
10 |
10 |
Cl |
х := х - 1 |
9 |
10 |
а10 |
(х > 0) ? |
1 |
10! |
ь10 |
у := х * у |
1 |
10! |
с10 |
х := х - 1 |
0 |
10! |
ац |
(х > 0) ? |
0 |
10! |
Таблица
1.5. События,
действия и состояния хода выполнения
программы
С каждым присваиванием в императивной программе связывается действие, которое соответствует отображению изменения состояния. Отображение изменения состояний процесса получается путем композиции отображений изменения состояний отдельных действий в том порядке их следования, который задан с помощью таблицы. D
В связи с программами и поставленными им в соответствие процессами возникает вопрос о том, какие изменения состояний могут быть без ка- ких-либо трудностей произведены параллельно во времени (т. е. наряду Друг с другом). Во многих случаях действия могут выполняться одновременно. Однако определенные изменения состояний не могут быть выполнены одновременно без того, чтобы не возник конфликт. Мы скажем, что такие действия находятся в конфликте относительно друг друга.
Пример (конфликты при параллельно выполняемых присваиваниях). Рассмотрим действия, которые соответствуют присваиваниям
х := х + 1,
х := 2 * х.
Если зафиксировать порядок, в котором будут выполняться оба действия, То тем самым однозначно определяется отображение состояний. Если же °ба действия должны выполняться параллельно, то соответствующему процессу нельзя однозначно предписать какое-либо отображение изменения состояний. В обоих действиях должна изменяться программная переменная х. Действия находятся в конфликте. □
Конфликтующими действиями в примере пешеходного перехода дороги являются действия ''Пешеход пересекает проезжую часть" и "Машина переезжает пешеходный переход". Кажется невозможным параллельно выполнять события с конфликтующими действиями и, соответственно, такому выполнению нельзя однозначно предписать изменение состояний.
Чтобы правильно подойти к проблеме конфликта действий при моделировании распределенных систем, введем на действиях двухместное отношение, которое указывает, когда пара действий катается конфликтующей. Отношение
Conflict £ А х А
для каждой пары действий аь а2 е А задает, существует ли конфликт. В случае присваиваний это отношение конфликтности может быть определено следующим образом.
В процедурной программе два коллективных присваивания
(Zj) X], ..., хп := Еь ..., Еп,
(Z2) уь уш := F;, ..., Fm
являются бесконфликтными, если программные переменные, изменяемые в одном из этих присваиваний, не встречаются в другом присваивании Тогда справедливо, что
никакая из переменных xf (для 1 < i < п) не встречается в (Z2),
никакая из переменных yj (для 1 < j < m) не встречается в (Zj).
Это условие называется условием Бернштейна. Если данное условие вы полняется, то порядок выполнения обоих присваиваний не оказывает влияния на достигаемое заключительное состояние.
Множество присваиваний называется бесконфликтным, если все присваивания попарно бесконфликтны.
Обратим внимание, что даже присваивания
(Y0 х := х + 2,
(Y2) х := х + 1
не являются бесконфликтными, хотя оба возможных порядка их выполнения
х := х + 2; х := х + 1 х := х + 1; х := х + 2
ведут к одному и тому же состоянию. Однако если эти присваивания разбить на ряд присваиваний (что иногда делается при переводе на машинный язык)
(Yj) hi :=х; hi := hi + 2; х := hi (Y2) h2 := x; h2 := h2 + 1; x :=• h2,
то при установлении такой последовательности выполнения
hi := х; h2 := х; hi :== hi + 2; h2 := h2 + 1; x := hi; x := h2
будет получен иной результат. На этом основании действия Y) и Y2 нельзя считать бесконфликтными.
Впрочем, мы предполагаем, наоборот, что для бесконфликтных действий а), а2 соответствующие им изменения состояний являются независимыми, и тем самым порядок выполнения действий не играет роли для изменения состояния. Тогда справедливо
p(ai) »р(а2) = р(а2) »p(ai).
Более того, для бесконфликтных действий aj и а2 мы даже примем, что они без каких-либо проблем могут выполняться во времени наряду друг с другом (параллельно).
Для (составных) действий, которые состоят из параллельного выполнения ai и а2, мы будем писать также aj (( а2. В предположении бескон- флмктг (ости с к ра ведливо:
P(al) °р(а2) = р(а2) »р(аО .
Тогда определим:
P(ai II а2) =def р(а,) 0 р(а2).
Мы предполагаем, что параллельная композиция бесконфликтных действий не вводит никаких новых конфликтов:
—'((аь a;,) е Conflict) л ~Ч(а2, аз) е Conflict) =s> —■((aj I а2, а3) е Conflict).
Тем самым оказывается, что параллельная композиция || по отношению к индуцируемому изменению состояния яатяется коммутативной и ассоциативной. Справедливы следующие законы:
ai II а2 = а21| аь ( ai I а2) || а3 = а, || ( а21| а3 ).
Если нарушается условие бесконфликтности, то относительно действия параллельного выполнения ничего сказать нельзя.
I
35
Процесс (Ео, <о, о-) называется бесконфликтным, если все конфлик- товозможные действия встречаются только в непараллельных парах событий, и тем самым для каждой пары событий е, d б Ео справедливо следующее высказывание:
(а(е), a(d)) е Conflict => е <о d v d <о е.
Другими словами, действия с конфликтами не выполняются параллельно. Обратим внимание, что в обычных вычислительных архитектурах одновременное чтение и запись, так же как и кратные одновременные записи в какую-либо ячейку памяти, также технически приводят к конфликту.
Пусть заданы множество состояний S, множество действий А и отношение перехода состояний для действий. Это отношение может быть распространено на конечные процессы и, соответственно, на трассы. Дли трасс такое распространение определим следующим образом. Пусть ст0, О; и с*2 - состояния, а - действие, а si и S2 " последовательности действий. Переходы состояний определим индукцией по длинам последовательностей следующим образом:
с
сто > Сто,
сто > Ст! =>ст0 — * СЬ
s, s, s, s, сто * О) л Ст) > с2 => Сто * а2 ■
Тем самым для трасс индуцируется отношение переходов на состояния.
Конечным процессам также можно предписать переход состояний. Для конечного процесса р определим отношение перехода следующим
образом. Переход р
ст0 ► СТ!
возможен лишь в том случае, если существует трасса s процесса р такая, что справедливо
сто ——> CTi-
Для бесконфликтных действий а, b всегда справедливо:
..а Ь> • Ь а> Сто > <=> Сто —► СТ)
Если все действия в конечном процессе тотальны и детерминистичны, го для каждого состояния е S существует единственное состояние ctj е 5 с
р
сто ► CTi .
Таким образом, бесконфликтному конечному процессу р = (Ео, <о, а) Просто может быть предписано изменение состояния р(р):
р(р): S S
с
р(р) = p(a(ej)) ° ... ° p(a(en)) , где множество событий Ео пусть определено как Е0 = {еь ..., еп}
и пусть имеют место следующие отношения причинности (1 < i, j < n): i < j <= ef <o ej.
Обратим внимание, что в случае бесконфликтности отображение изменения состояний р(р) не зависит от выбора индицирования.
Пример (параллельный процесс для вычисления факториала). Рассмотрим процесс р с диаграммой действий, приведенной на рис. 1.15. Заданный процесс является бесконфликтным и вычисляет п!, если пара действий
у := у * z, z := х
встречается ровно п раз. □
у := 1 —- у := y'z *
X
х 1 —*- z := х —х := х-1
Рис. 1.15. Диаграмма действий для процесса р
Итак, конечные процессы определяют даже однозначные изменения состояний, если только действиям предписаны отображения изменений состояний и процессы яатяются бесконфликтными. Тем самым (конечный) процесс каждому начальному состоянию предписывает конечное состояние.
Часто нам хотелось бы, в связи с процессами и их переходами состояний, рассматривать также промежуточные состояния. В процессе со Многими параллельными событиями промежуточные состояния при определенных обстоятельствах в действительности никогда не достигаются. Если одно из событий закончилось, то другие параллельные события еще Продолжаются. Никогда между ними состояние покоя не достигается. И тем не менее мы можем в бесконфликтных процессах определить виртуальные (мыслимые) промежуточные состояния. Для этого может быть
y:=y*z ...
использована концепция конечных префиксов. Каждый конечный префикс р, процесса ро определяет для заданного начального состояния сто промежуточное состояние aj в силу
Pi
с0 > с, .
Если рассматривать отображения состояний как значения процессов, то получаются дальнейшие требования для уточнения процессов.
Для уточнения pi = (Ej, <ь од) процесса ро = (Eq, <q, а0) посредством отображения у: Е] Ео мы требуем, чтобы были выполнены определенные предположения относительно интерпретации действий.
Бесконфликтность продолжает сохраняться. Выражаясь математически, тогда для всех событий e,d е Ei справедливо:
7(e) ~ 7(d) => -^((aj(c), aj(d)) е Conflict) v е <t d v d <j е,
7(e) * v(d) => ((a,(e), ai(d)) e Conflict <=> (a0(y(e)), a0(y(d))) e Conflict).
Порождаются одинаковые отображения состояний. Выражаясь математически, справедливо:
V с е Е0: (p(pi|m) = p(a0(e)), причем М = (de Еь y(d) = е}.
Процесс ро называется огрублением пли абстракцией. Часто поступают "либеральнее" по сравнению с приведенных! выше определением уточнения и допускают, что уточнение может дополнительно изменять состояния определенных вспомогательных переменных.
Наряду с изменением состояний с действиями можно также связатг и другие эффекты. Для каждого моноида М с двухместным связыванием с п нейтральным элементом е и каждого отображения р: А -> М ,
для которого справедливо следующее высказывание:
(аа2) g Conflict => p(as) => р(а2) = р(а2) ° р(а,),
можно каждому- бесконфликтному конечному процессу р предписат1 элемент m(p) е М. Если р = (Ео, <о, а) есть пустой процесс, то мы опрс делим
ш(р) = е.
Если р = (Ео, <о, «) не пустой процесс, то определим т(р) = р(а(е)) ° т(р|Ео\(е|),
если е есть любое минимальное событие из Ео. Здесь мы говорим о моноиде действий.Процессы, коммуникация и координация в распределенных системах
Первым примером для моноида действий были отображения изменений состояний. Нейтральным элементом здесь является отображение идентичности. Другой пример мы получим при рассмотрении пар последовательностей. Пусть
М = D* х D\
где D - любое множество "элементов данных". Для (Ъь b2), (dj, d2) е М определим связывание через поэлементную конкатенацию:
(bb b2) ° (db d2) = (bi о dj, b2 ° d2).
Для d e D рассмотрим действия read(d) и print(d) с интерпретацией p(read(d)) = (<d>, e) и p(print(d)) = (e, <d>).
Порождаемая процессом пара (dj, d2) может значить как последовательность di прочитанных процессом данных и, соответственно, как последовательность d2 записанных процессом данных.
Пример (процесс ввода/вывода). Процесс на рис. 1.16 соответствует следующей паре последовательностей:
(<1 2 3 ... 9>, <1 2 3 ... 9>) и
read(1) read(2) —*• read(3) —... read(9)
\ \ \ \
print( 1) —print(2) print(3) print(9)
Puc. 1.16. Процесс с вводом u выводом
Из этого примера еше раз становится ясным, что процессы и их значения являются формальными описаниями историй протекания процессов.
Процессы соответствуют ориентированным на транзакции (протоколы) описаниям функционирования систем. Отображения изменений состояний абстрагируются от отдельных действий и ограничиваются остающимся от действий видимым эффектом, предстааленным с помощью возникающих состояний.