
286 Глава 5. Синхронизация
В своей классической статье (см. [249]) Лампорт (Lamport) показал, что хотя
синхронизация часов возможна, она не обязательно должна быть абсолютной.
Если два процесса не взаимодействуют, нет необходимости в том, чтобы их часы
были синхронизированы, поскольку отсутствие синхронизации останется незаме-
ченным и не создаст проблем. Кроме того, он указал, что обычно имеет значение
не точное время выполнения процессов, а его порядок. В примере с программой
make, который мы приводили в предыдущем разделе, нас интересовало, чтобы
файл input.c был более старым или более новым, чем input.o, а не абсолютное вре-
мя их создания.
В этом пункте мы обсудим алгоритм Лампорта, предназначенный для син-
хронизации логических часов. Кроме того, мы рассмотрим расширение метода
Лампорта, векторные отметки времени. Лампорт сделал дополнения к своей ра-
боте в
[251].
5.2.1.
Отметки времени Лампорта
Для синхронизации логических часов Лампорт определил отношение под названи-
ем «происходит раньше». Выражение а-^Ь читается как
«а
происходит раньше
Ь»
и означает, что все процессы согласны с тем, что первым происходит событие а,
а позже
—
событие
Ь,
Отношение «происходит раньше» непосредственно испол-
няется в двух случаях.
4-
Если а и й
—
события, происходящие в одном и том же процессе, и а про-
исходит раньше, чем й, то отношение а-^Ь истинно.
"¥ Если а
—
это событие отсылки сообщения одним процессом, а
й —
событие
получения того же сообщения другим процессом, то отношение а-^Ь так-
же истинно. Сообщение не может быть получено до отсылки или даже
в тот же самый момент, когда оно было послано, поскольку для пересылки
необходимо конечное ненулевое время.
Отношение «происходит раньше» — это транзитивное отношение, то есть
в случае, если
а->Ь
и Ь-^с, выполняется условие а-^с. Если два события, х и г/,
происходят в разных процессах, которые не обмениваются сообщениями (ни не-
посредственно, ни через третий процесс), то отношение х-^у не истинно, впро-
чем, как и у-^х. Такие события называются параллельпыми
{concurrent).
В дан-
ном случае это означает только то, что никто не может (или не хочет) знать о
том, где и какое из этих событий произошло.
Нам нужен способ измерения времени каждого события, который позволил
бы поставить в соответствие каждому событию а отметку времени С(<2), которая
подошла бы всем процессам. Эти отметки времени должны быть такими, чтобы
при <2->6 соблюдалось соотношение С(а)<С(Ь). Перефразируя условие, которое
мы ранее установили, если аи b
—
два события одного процесса и а происходит
раньше, чем 6, то С(а)<С(Ь). Например, если а
—
это посылка сообщения одним
процессом,
Sib —
прием этого сообщения другим процессом, то С(а) и
С(Ь)
долж-
ны быть назначены так, чтобы значения С(а) и
С(Ь)
соответствовали отношению
С(а)<С(Ь).
Кроме того, время по часам. С, всегда идет вперед (увеличивается).