- •Введение
- •Раздел 1. Предмет распределенных вычислений
- •1.1. Понятия распределенных вычислений и распределенной системы
- •1.2. Цели построения распределенных систем
- •1.3. Требования к распределенным системам
- •1.3.1. Прозрачность (Transparency)
- •1.3.2. Открытость (Openness)
- •1.3.3. Масштабируемость (Scalability)
- •1.3.4. Сложности разработки распределенных систем
- •1.4. Понятие и назначение программного обеспечения промежуточного уровня
- •1.5. Взаимодействие в распределенных системах
- •1.5.1. Физическое время
- •1.5.2. Синхронные и асинхронные распределенные системы
- •1.5.3. Упорядочивание событий
- •1.5.4. Примитивы взаимодействия
- •1.5.5. Синхронный и асинхронный обмен сообщениями
- •Раздел 2. Модель распределенного вычисления
- •2.1. Модель распределенной системы
- •2.2. Причинно-следственный порядок событий
- •2.3. Эквивалентные выполнения
- •2.4. Конус прошлого и конус будущего для события
- •2.5. Свойства каналов
- •Раздел 3. Логические часы
- •3.1. Общие принципы построения логических часов
- •3.2. Скалярное время Лэмпорта
- •3.2.1 Основные свойства
- •3.2.2 Примеры использования
- •3.3. Векторное время
- •3.3.1 Основные свойства
- •3.3.2 Пример использования
- •3.4. Методы эффективной реализации векторных часов
- •3.4.1 Дифференциальная пересылка векторного времени
- •3.4.2 Часы, фиксирующие прямую зависимость
- •3.4.3 Адаптивный метод Жарда-Жордана
- •3.5. Матричное время
- •3.5.1 Основные свойства
- •Раздел 4. Взаимное исключение в распределенных системах
- •4.1. Общие концепции
- •4.2. Централизованный алгоритм
- •4.3. Алгоритмы на основе получения разрешений
- •4.3.1 Алгоритм Лэмпорта
- •4.3.2 Алгоритм Рикарта-Агравала
- •4.3.3 Алгоритм обедающих философов
- •4.4. Алгоритмы на основе передачи маркера
- •4.4.1 Широковещательный алгоритм Сузуки-Касами
- •4.4.2 Алгоритм Реймонда на основе покрывающего дерева
- •Список литературы
- •Основная литература
- •Дополнительная литература
3.3.1 Основные свойства
Изоморфизм. Если события распределенного вычисления отмечаются с помощью механизма векторных часов, то для любых двух событий ei и ej' с векторными отметками времени V(ei) и V(ej'), соответственно, имеем:
ei → ej' V(ei) < V(ej'), ei || ej' V(ei) || V(ej').
Необходимое условие для ei → ej' обеспечивается правилами продвижения векторного времени процесса.
Для доказательства того, что V(ei) < V(ej') является достаточным условием для ei → ej', вначале покажем, что если события ei и ej' различны, то
ei →/ ej' V(ej')[i] < V(ei)[i].
Неформально, можно сказать, что в этом случае событие ej' "не знает" о событии ei, а "знает" лишь о каком-то событии, предшествующим событию ei в процессе Pi (если V(ej')[i] ≠ 0).
Действительно, если i = j, т.е. ei и ej' – события одного процесса Pi, то из ei →/ ej' следует, что ej' произошло раньше ei. Поэтому на основании
Правила 1 продвижения локального |
времени |
процесса Pi |
имеем |
V(ej')[i] < V(ei)[i]. Теперь предположим, |
что i ≠ j, |
т.е. события |
ei и ej' |
происходят в разных процессах. В этом случае V(ei)[i] представляет собой значение локального времени процесса Pi в момент наступления события ei. Очевидно, процесс Pj не мог получать это значение через поступающие к нему сообщения, т.к. ei →/ ej', т.е. V(ej')[i] < V(ei)[i].
Отсюда имеем, |
что |
ei →/ |
ej' ¬(V(ei) < V(ej')), что |
равносильно |
V(ei) < V(ej') ei → ej', |
т.е. |
V(ei) < V(ej') является достаточным условием |
||
для ei → ej'. |
|
|
|
|
Истинность утверждения |
ei || ej' V(ei) || V(ej') |
следует из |
определений параллельных событий и несравнимых векторных отметок времени.
Таким образом векторные часы являются изоморфизмом, т.е. взаимно однозначным соответствием, сохраняющим порядок, между множеством событий распределенного вычисления (E, →) и множеством их векторных отметок времени (V, <).
Стоит отметить, что если кроме векторных отметок времени событий ei и ej' еще известны процессы Pi и Pj, в которых эти события происходили (т.е. мы знаем значения i и j), то проверка на наличие причинноследственной зависимости между событиями может быть упрощена согласно следующим выражениям:
79
ei → ej' V(ei)[i] ≤ V(ej')[i],
ei || ej' (V(ei)[i] > V(ej')[i]) ˄ (V(ei)[j] < V(ej')[j]).
Первое выражение свидетельствует о том, что событие ej' "знает" о наступлении события ei в процессе Pi. Второе выражение говорит о том, что на момент наступления события ej' процесс Pj "не знает" о событии ei в процессе Pi (первая часть этого выражения), равно как и процесс Pi "не знает" о событии ej' в процессе Pj на момент наступления ei (вторая часть этого выражения). Поэтому при известных значениях i и j двух событий ei
иej' достаточно сравнить всего два компонента их векторных отметок времени.
Строгая непротиворечивость. Векторные часы являются строго непротиворечивыми, что позволяет по отметкам времени двух событий судить о том, оказывают ли эти события потенциальное влияние друг на друга или нет. Поэтому, в отличие от скалярных часов, позволяющих построить одно из эквивалентных выполнений распределенной системы, векторные часы могут быть использованы для определения всех возможных выполнений.
Свойство строгой непротиворечивости логических часов является очень важным: благодаря ему векторные часы широко применяются при построении распределенных алгоритмов. Например, механизм векторных часов используется в коммуникационных сетях, сохраняющих причинноследственный порядок доставки сообщений, в хранилищах данных, поддерживающих причинную непротиворечивость, а также применяется для отладки распределенных программ (англ. distributed debugging) и при установке непротиворечивых точек восстановления (англ. checkpoints) распределенной системы в случае сбоя.
Основным недостатком механизма векторных часов является необходимость хранить для каждого события и пересылать в каждом сообщении отметки времени, состоящие из N целых чисел, что может приводить к значительным накладным расходам, особенно, в случае большого числа N процессов, работающих в распределенной системе. Однако было показано, что векторами меньшей длины для определения причинно-следственной зависимости между событиями по их отметкам времени обойтись невозможно. А именно, если события распределенного вычисления системы, состоящей из N процессов, отобразить в пространство векторов длины n так, чтобы V(ei) < V(ej') было необходимым
идостаточным условием для ei → ej', то неизбежно будем иметь n ≥ N.
Подсчет событий. Если значение прироста логических локальных часов всегда равно единице (d = 1), то i-й компонент векторных часов процесса Pi, Vi[i], будет определять количество событий, произошедших в Pi до настоящего момента. Если событие ei имеет векторную отметку времени V(ei), то j-й компонент вектора V(ei)[j] содержит в себе число
80
событий, выполненных в процессе Pj и предшествующих ei согласно отношению причинно-следственного порядка. Очевидно, величина ∑ j V(ei)[j] – 1 представляет собой общее число событий, произошедших раньше ei в распределенном вычислении, т.е. принадлежащих конусу прошлого данного события. Здесь стоит обратить внимание, что поверхность конуса прошлого и, как следствие, все множество событий, произошедших раньше ei, определяется вектором, совпадающим с V(ei) за исключением i-го компонента: для поверхности конуса прошлого i-й компонент будет на единицу меньше V(ei)[i].
Если событие ei представляет собой внутреннее событие останова процесса при отладке распределенной системы (англ. breakpoint event), то глобальное состояние, следующее сразу за поверхностью конуса прошлого события ei, будет определять контрольную точку, фиксирующую состояние системы непосредственно после всех событий, потенциально влияющих на ei, (англ. casual distributed breakpoint). Другими словами, такое глобальное состояние не включает в себя результат наступления событий, не влияющих на ei, и, как следствие, позволяет дать неискаженную информацию о причинах возникновения ei. Такая распределенная контрольная точка является естественным расширением обычного понятия контрольной точки, устанавливаемой для последовательно выполняемого процесса с целью определения его состояния сразу после всех событий, предшествующих этой контрольной точке.
3.3.2 Пример использования
Банковская система. Для иллюстрации применения векторных часов при решении различных задач вернемся к рассмотренной в п. 3.2.2 задаче подсчета полной суммы денег, находящихся на счетах в разных филиалах банка. При решении этой задачи с помощью скалярных часов предполагалось, что всем процессам известен некоторый момент логического времени t, в который процессы будут подсчитывать денежные средства на своих счетах и в каналах между филиалами. Однако сама процедура достижения соглашения между процессами о таком будущем моменте t представляет определенные сложности. Действительно, при использовании механизма скалярных часов процесс не может произвольным образом выбрать значение t для согласования с другими процессами, т.к. не исключено, что на момент выбора t логические часы других процессов ушли далеко вперед, и их текущее логическое время потенциально может превышать любое предлагаемое значение t. Кроме того, если t окажется слишком большим, то придется долго ожидать наступления этого момента.
Использование векторных часов может помочь в решении этой задачи. А именно, для любых двух процессов Pi и Pj в любой момент верно
81