Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lit / Kosyakov_-_raspredelennye_sistemy_unlocked.pdf
Скачиваний:
222
Добавлен:
16.03.2016
Размер:
3.86 Mб
Скачать

Отношение причинно-следственного порядка иррефлексивно и задает отношение частичного порядка на множестве E событий выполнения распределенной системы, поскольку могут найтись события ei и ej', для которых не выполняется ни ei ej', ни ej' ei.

Для любых событий ei и ej' запись ei / ej' обозначает тот факт, что ej' не зависит от ei ни напрямую, ни транзитивно, и наступление события ei не влияет на событие ej'. Важно отметить, что, если ei / ej', то событие ej' "не знает" не только о событии ei, но и обо всех других событиях, произошедших после ei в том же процессе Pi. Например, на рис. 2.6

e13 / e33 и e24 / e31.

Стоит обратить внимание на следующие два правила:

для любых двух событий ei и ej': ei / ej' / ej' / ei;

для любых двух событий ei и ej': ei ej' ej' / ei.

События ei и ej', для которых ei / ej' и ej' / ei, будем называть параллельными (англ. concurrent) или независимыми (англ. independent) и для обозначения этого факта будем использовать запись ei || ej. Для

выполнения распределенной системы, представленного на рис. 2.6, e13 || e33

и e24 || e31.

Следует отметить, что отношение || не является транзитивным, т.е.

(ei || ej') ˄ (ej' || ek'') / ei || ek''. Например, на рис. 2.6 e33 || e24 и e24 || e15,

однако e33 ||/ e15.

Таким образом для любых двух событий ei и ej', происходящих при выполнении распределенной системы, либо ei ej', либо ej' ei, либо ei || ej'.

2.3.Эквивалентные выполнения

Вэтом подразделе мы покажем, что любое изменение порядка следования событий в выполнении, сохраняющее причинно-следственный порядок, не оказывает влияния на результат выполнения. Такая перестановка событий приводит к другой последовательности глобальных состояний, но полученное при этом выполнение будет считаться

эквивалентным исходному выполнению.

Рассмотрим выполнение R = (e0, e1, … ex, ex+1, …) и связанную с ним последовательность глобальных состояний (S0, S1, … Sx, Sx+1, …), где Sx+1 = ex(Sx) для всех x ≥ 0. Перестановкой Ȓ элементов R является последовательность Ȓ = (ê0, ê1, … êx, êx+1, …) такая, что êx = eσ(x), где σ – перестановка на множестве натуральных чисел или на конечном множестве {0, …, k – 1}, если R – конечное выполнение, в котором происходит k событий. Перестановка Ȓ событий выполнения R сохраняет

причинно-следственный порядок, если êx êy x < y, т.е. ни одно событие

56

êy не появляется в этой последовательности перед событием êx, от которого êy зависит.

Пусть Ȓ = (ê0, ê1, … êx, êx+1, …) – перестановка событий выполнения R, сохраняющая причинно-следственный порядок событий в выполнении. Тогда Ȓ является выполнением распределенной системы с начальным состоянием S0. При этом если R – конечное выполнение, то последнее

глобальное состояние Ŝk в выполнении Ȓ для последовательности (Ŝ0 = S0, Ŝ1, … Ŝk), где Ŝx+1 = êx(Ŝx), 0 ≤ x k – 1, будет совпадать с последним

глобальным состоянием Sk в выполнении R.

Для доказательства этого утверждения будем формировать глобальные состояния Ŝx в последовательности (Ŝ0 = S0, Ŝ1, … Ŝx, Ŝx+1, …) одно за другим, и для построения Ŝx+1 достаточно показать, что событие êx допустимо в состоянии Ŝx.

Предположим, что для всех 0 ≤ y x – 1 событие êy допустимо в состоянии Ŝy и Ŝy+1 = êy(Ŝy). Пусть событие êx является событием, происходящим в процессе Pi, и êx = (Рi, s, s', m, С). Тогда событие êx будет допустимым в глобальном состоянии Ŝx, если (1) в состоянии Ŝx процесс Рi находится в состоянии s и (2) если êx – событие получения сообщения, то сообщение m находится в канале С и может быть принято из него.

Чтобы показать, что в состоянии Ŝx процесс Рi находится в состоянии s необходимо рассмотреть два случая. В обоих случаях важно обратить внимание на то, что причинно-следственный порядок событий линейно упорядочивает события процесса Pi для любого i. Это означает, что порядок следования событий процесса Pi в перестановке Ȓ будет таким же, что и в выполнении R.

Случай 1: êx – первое событие процесса Pi в перестановке Ȓ. Тогда в глобальном состоянии Ŝx процесс Pi находится в своем начальном состоянии si0. Событие êx также является первым событием процесса Pi в

выполнении R, т.е. переводит Pi из его начального состояния si0 в другое. Поэтому s = si0.

Случай 2: êx – не является первым событием процесса Pi в

перестановке Ȓ. Пусть последним событием процесса Pi, предшествующим êx в перестановке Ȓ, является событие ei = (Рi, si, si', mi, Сi). Тогда в

глобальном состоянии Ŝx процесс Pi находится в состоянии si'. Событие ei также является последним событием процесса Pi, предшествующим êx в выполнении R, и поэтому s = si'.

Чтобы показать, что сообщение m находится в канале С и может быть принято из него, если êx – событие получения сообщения, важно обратить внимание на то, что взаимосвязанные события отправки и получения в перестановке Ȓ расположены в том же порядке, что и в выполнении R. Поэтому событию êx в перестановке Ȓ предшествуют те же самые события отправки и получения сообщений по каналу С, что и в выполнении R. Следовательно, состояние канала С перед наступлением êx

57

в перестановке Ȓ идентично состоянию канала С перед наступлением этого же события eσ(x) = êx в выполнении R.

Таким образом мы показали, что для каждого x событие êx

допустимо в глобальном состоянии Ŝx, и тогда в качестве Ŝx+1 можно взять

êx(Ŝx).

Нам осталось показать, что, если выполнение R – конечно, то последнее глобальное состояние Ŝk в выполнении Ȓ будет совпадать с последним глобальным состоянием Sk в выполнении R. Если в выполнении R не содержится ни одного события процесса Pi, то в Sk процесс Pi будет находиться в своем начальном состоянии si0. Так как в этом случае Ȓ также не будет содержать ни одного события процесса Pi, состояние Pi в Ŝk также будет si0. В противном случае состояние процесса Pi в Sk – это то состояние, в которое Pi переходит при наступлении последнего события этого процесса в выполнении R. Это событие также является последним

событием Pi и в выполнении Ȓ. Значит, состояние Pi в Ŝk будет точно таким же, что и в Sk.

Состояние каналов распределенной системы в глобальном состоянии Sk определяется совокупностью сообщений, отправленных по этим каналам, но еще не полученных принимающими процессами в выполнении R. Но коль скоро в R и Ȓ содержится одна и та же совокупность событий, те же сообщения окажутся в состоянии пересылки и для последнего глобального состояния Ŝk в выполнении Ȓ.

Таким образом мы показали, что Ŝk = Sk, что и требовалось доказать.

В обоих выполнениях R и Ȓ происходит одна и та же совокупность событий, и причинно-следственный порядок этих событий одинаков для R

иȒ. В этом случае, мы будем говорить, что выполнения R и Ȓ эквиваленты

иобозначать это отношение R ~ Ȓ.

На рис. 2.7. изображена пространственно-временная диаграмма выполнения, эквивалентного выполнению, представленному на рис 2.6. На оси Ȓ цветом выделены события с измененным порядком следования по сравнению с выполнением R. Диаграммы эквивалентных выполнений можно получить из заданной диаграммы путем "растягивания" и "сжимания" осей времени отдельных процессов, при условии, что стрелки, обозначающие передачу сообщений, остаются направленными слева направо.

58

Рис. 2.7. Пространственно-временная диаграмма распределенного выполнения, эквивалентного выполнению на рис 2.6.

Несмотря на то, что изображенные на рис. 2.6 и рис. 2.7 выполнения эквивалентны и в них происходит одна и та же совокупность событий, эти выполнения порождают разные множества глобальных состояний.

Например, выполнение на рис. 2.6 содержит глобальное состояние S, в котором сообщения, отправленные при наступлении событий e13 и e23, одновременно пребывают в состоянии пересылки. В свою очередь выполнение на рис. 2.7 не содержит ни одного такого глобального состояния, т.к. сообщение, отправленное при событии e23, оказывается полученным раньше, чем наступает событие e13.

Сторонний наблюдатель, которому одномоментно доступна вся картина происходящего и который имеет возможность видеть фактическую последовательность событий, способен отличить одно эквивалентное выполнение от другого, т.е. он всякий раз видит только одно из возможных выполнений. Однако процессы не могут отличить два эквивалентных выполнения, т.к. с точки зрения процессов невозможно понять, какое из двух эквивалентных выполнений происходит на самом деле. Поясним это на следующем примере. Предположим, что необходимо определить, действительно ли сообщения, отправленные при наступлении событий e13 и e23, находились в состоянии пересылки одновременно. Пусть в одном из процессов поддерживается булева переменная isSim, которая принимает значение true, если сообщения находились в состоянии пересылки одновременно, и false – в противном случае. Тогда в последнем глобальном состоянии выполнения на рис 2.6, значение isSim должно быть равно true, а в последнем глобальном состоянии выполнения на рис. 2.7 –

59

false. Однако, как было показано выше, последние глобальные состояния для эквивалентных конечных выполнений должны совпадать, поэтому ожидаемого присваивания значений переменной isSim достичь невозможно.

Класс эквивалентности выполнений по отношению ~ однозначно определяется множеством событий и действующим на нем причинноследственным порядком. Такое частично упорядоченное множество событий называют распределенным вычислением (англ. computation) и обозначают через :

= (E, →).

Выполнение распределенной системы R можно рассматривать как линеаризацию (англ. linear extension) частичного порядка, т.е. введение на множестве событий отношения линейного порядка <, сохраняющего частичный причинно-следственный порядок событий →, т.е. для любых

двух событий ei и ej': ei ej' ei < ej'.

Из теории частично упорядоченных множеств следует, что для любых двух событий ei и ej' таких, что ei / ej', существует такая линеаризация < частичного порядка →, для которой выполняется соотношение ej' < ei. Это означает, что если ei и ej' – параллельные события вычисления , то существуют два таких выполнения R и Ȓ этого вычисления, в одном из которых событие ei наступает раньше события ej', а в другом – наоборот, событие ej' наступает раньше события ei. Процессы же по ходу выполнения не могут определить, какое из этих двух событий происходит первым, и, стало быть, через какое глобальное состояние проходит система.

Таким образом имеет смысл говорить о совокупности событий вычисления, т.к. во всех выполнениях одного и того же вычисления происходят одни и те же события. И не имеет смысла говорить о совокупности глобальных состояний вычисления, потому что различные выполнения одного и того же вычисления могут порождать разные множества глобальных состояний.

Существенные события (англ. relevant events). Не все события,

происходящие в распределенной системе, могут оказаться важными или существенными с точки зрения конкретного прикладного приложения. Например, в задачах восстановления распределенной системы после сбоя существенными могут являться только внутренние события установки контрольных точек (англ. checkpoints). Обозначим через ER E непустое подмножество всех существенных событий, и через →R ограничение

отношения → на подмножество ER, т.е. ei, ej' ER: ei R ej' ei ej'. Тогда распределенное вычисление, определяемое существенными

событиями и порядком →R, обозначается через = (ER, →R).

60

Соседние файлы в папке Lit