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

Рис. 3.4. Пример формирования очередей в процессах.

Следует еще раз обратить внимание, что подтверждения используются исключительно для информирования процессов о том, что в каналах не осталось ни одного сообщения, которое может потеснить сообщение m в их очередях и занять первое место. Поэтому при приеме широковещательного сообщения процесс может не отправлять соответствующее подтверждение, если к этому моменту он уже разослал свое собственное широковещательное сообщение с отметкой времени большей, чем отметка времени принимаемого сообщения.

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

3.3. Векторное время

Скалярные часы не являются строго непротиворечивыми и не позволяют зафиксировать параллелизм событий. События, которые могли бы происходить одновременно, могут получить различные отметки времени как будто они происходили в каком-то определенном порядке. Для некоторых задач, например, рассмотренных в п. 3.2.2, такое ограничение не является существенным. Однако, к примеру, при отладке распределенных программ (англ. distributed debugging) информация о том,

75

оказывают ли события потенциальное влияние друг на друга или нет, становится важной.

Параллелизм событий можно зафиксировать, если часовые отметки времени параллельных событий оказываются несравнимыми. Другими словами, выявление параллельных событий возможно только тогда, когда множество T допустимых значений логического времени оказывается упорядоченным частично, но не линейно. Чтобы понять, из каких элементов может состоять такое множество, предположим, что в каждом процессе работают логические локальные часы, увеличивающие свои показания на единицу перед наступлением каждого события. Тогда для стороннего наблюдателя, которому одномоментно доступна вся картина происходящего, ход выполнения распределенной системы будет определяться совокупностью показаний локальных часов всех процессов. Подходящей структурой данных для представления такого глобального времени будет являться N-мерный вектор, в котором i-й компонент содержит текущее значение локального времени процесса Pi. Пример изменения глобального векторного времени V с точки зрения стороннего наблюдателя приведен на рис. 3.5.

Рис. 3.5. Пример изменения глобального векторного времени.

Процессам же текущее значение глобального времени недоступно. Каждый процесс может лишь сформировать свое собственное представление о ходе выполнения процессов распределенной системы через поступающие ему сообщения. Для этого каждый процесс Pi должен локально поддерживать работу с вектором Vi[1..N]. В компоненте Vi[i] этого вектора хранятся показания логических локальных часов процесса Pi,

76

измеряющих ход его собственного выполнения. Логические глобальные часы, используемые для записи информации о ходе выполнения других процессов, представлены остальными компонентами вектора Vi, а именно, компонент Vi[j] содержит последние сведения, полученные процессом Pi о локальном времени процесса Pj. Другими словами, если Vi[j] = x, то процесс Pi "знает" о том, что локальное время процесса Pj достигло значения x. Стоит отметить, что к настоящему моменту локальные часы процесса Pj могли уйти вперед, т.е. текущее локальное время процесса Pj может превышать значение x, однако, процесс Pi не получал об этом никакой информации через направляемые ему сообщения. Весь вектор Vi можно рассматривать как локальное представление процесса Pi о глобальном векторном времени, отражающем ход выполнения всех процессов в распределенной системе.

Таким образом, областью значений часовой функции Θ является множество N-мерных векторов неотрицательных целых чисел, где N – количество процессов в распределенной системе. Поэтому такие часы называют векторными часами. Отметка времени события ei, происходящего в процессе Pi, определяется всеми компонентами вектора Vi на момент наступления ei. Такую отметку часто называют векторной отметкой времени события ei и обозначают через V(ei).

Для сравнения двух векторных отметок времени V(ei) и V(ej') событий ei и ej' введем следующие отношения:

V(ei) = V(ej') k: V(ei)[k] = V(ej')[k]; V(ei) ≤ V(ej') k: V(ei)[k] ≤ V(ej')[k];

V(ei) < V(ej') V(ei) ≤ V(ej') и k: V(ei)[k] < V(ej')[k].

Очевидно, что введенное выше отношение < определяет частичный порядок на множестве векторных отметок времени для N ≥ 2. Например, вектора V(ei) = [2, 3, 0] и V(ej') = [0, 4, 1] являются несравнимыми. Для обозначения этого факта будем использовать запись V(ei) || V(ej'):

V(ei) || V(ej') ¬(V(ei) < V(ej')) ˄ ¬(V(ej') < V(ei)).

Для выполнения условия непротиворечивости логических часов каждый процесс Pi использует следующие правила продвижения своего векторного времени.

Правило 1: перед выполнением любого события процесс Pi увеличивает показания своих локальных часов Vi[i]:

Vi[i] = Vi[i] + d, где d > 0.

Как и для случая скалярного времени, каждый раз d может принимать любые значения. Однако обычно d всегда полагают равным единице.

77

Перед выполнением события получения сообщения процесс вынужден произвести немного другие действия согласно следующему правилу.

Правило 2: в каждое передаваемое сообщение добавляется значение векторного времени Vi процесса-отправителя Pi на момент отправки этого сообщения. Когда процесс Pj получает сообщение с отметкой времени Vmsg, он выполняет следующие шаги:

1.обновляет свое логическое глобальное время по правилу:

Vj[k] = max(Vj[k], Vmsg[k]), 1 ≤ k N;

2.исполняет Правило 1;

3.доставляет сообщение и приступает к его обработке.

Компоненты векторного времени Vi[k] инициализируется нулем, 1 ≤ k N. Нетрудно видеть, что представленные Правила 1 и 2 вместе с

введенным отношением строгого порядка < на множестве векторных отметок времени удовлетворяют Условиям 1 и 2 непротиворечивости логических часов, т.е. такие векторные часы являются непротиворечивыми:

ei, ej' : ei ej' V(ei) < V(ej').

Пример работы алгоритма векторных часов для d = 1 приведен на рис. 3.6. Рядом с каждым событием представлена его отметка времени. На стрелках указаны отметки времени, передаваемые с сообщениями.

Рис. 3.6. Пример работы алгоритма векторных часов.

78

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