Уяви, що є кілька комп’ютерів — наприклад, три:
- p₁
- p₂
- p₃
Кожен із них виконує свої завдання (події): щось обчислює, надсилає повідомлення іншому, або отримує повідомлення від нього.
Але в нас немає спільного годинника, тому треба придумати, як визначити, яка подія була раніше, а яка пізніше.
Кожен комп’ютер має свій «лічильник подій» — просто число (це й є логічний годинник).
- Спочатку в усіх — 0
- Кожного разу, коли відбувається подія, цей лічильник збільшується
- Якщо комп’ютери обмінюються повідомленнями, вони передають і свій поточний час
Уяви, що кожен комп’ютер каже собі:
«Коли я роблю щось (виконую дію, відправляю чи отримую повідомлення) — я додаю +3 до свого часу (бо в нас d=3). А якщо я отримав повідомлення, я спочатку дивлюсь, який час був у того, хто мені його надіслав.»
1️⃣ Коли я роблю щось сам (внутрішня подія або відправляю повідомлення): → просто додаю 3.
Було 0 → стало 3. Було 3 → стало 6.
2️⃣ Коли я отримую повідомлення: → дивлюсь, який час був у відправника, → беру більший час із двох (мій і його), → і теж додаю 3.
Це гарантує, що отримувач події завжди має більший час, ніж відправник.
Є два комп’ютери: p₁ і p₂ і d = 3.
| Крок | Хто діє | Що робить | Як змінюється час |
|---|---|---|---|
| 1 | p₁ | виконує подію | 0 → 3 |
| 2 | p₁ | надсилає повідомлення p₂ | 3 → 6 (повідомлення несе час 6) |
| 3 | p₂ | отримує повідомлення | спочатку дивиться: його час 0, у повідомленні 6 → бере 6, потім +3 → стає 9 |
✅ Отже:
- У p₁ подія відбулася в момент “6”
- У p₂ вона відбулася в момент “9”
- І ми бачимо, що 6 < 9, тобто відправлення було раніше, ніж отримання.
Так ми можемо визначити, яка подія логічно відбулася раніше, навіть якщо комп’ютери не мають спільного годинника.
У підсумку:
- Події всередині одного комп’ютера впорядковуються просто додаванням +3.
- Події між різними комп’ютерами узгоджуються через передавання "часу" в повідомленнях.
🧠 p₁ каже: “Я зробив подію о 6-й годині й відправив тобі повідомлення.” 💻 p₂ відповідає: “Окей, у мене зараз 0, але бачу, що в тебе було 6 — я поставлю собі 6 і ще додам 3. Тепер у мене 9.”
От і все! Тепер вони узгодили, що подія p₁ сталася раніше, ніж p₂. А це і є мета алгоритму — впорядкувати події логічно.
-
Внутрішня подія / Send:
(
$C_i = C_i + d$ ) -
Receive:
(
$C_i = \max(C_i, C_{msg}) + d$ )
Давайте розберемо кожен процес (
-
Початковий стан: Усі процеси (
$p_1, p_2, p_3$ ) починають з годинником$C = 0$ . -
Приріст (
$d$ ): Згідно з текстом, для цього малюнка встановлено:$\mathbf{d = 1}$ . -
Правило R1 (Локальна подія або Надсилання): Перед виконанням події (внутрішньої або надсилання повідомлення), процес
$p_i$ збільшує свій годинник на$d$ :$$C_i := C_i + d$$ -
Правило R2 (Отримання повідомлення): Коли процес
$p_i$ отримує повідомлення з часовою міткою$C_{msg}$ :-
Синхронізація:
$C_i := \max(C_i, C_{msg})$ -
Виконання R1:
$C_i := C_i + d$ (тобто$C_i := C_i + 1$ ) - Доставити повідомлення.
-
Синхронізація:
Розглянемо кожну подію (нумеровану крапку) на діаграмі, пояснюючи, яке правило застосовується.
| Подія (Час) | Процес | Тип події | Застосоване Правило | Обчислення | Пояснення |
|---|---|---|---|---|---|
| 1 | Локальна | R1 | Початкова локальна подія. | ||
| 2 | Надсилання |
R1 | Надсилає повідомлення. |
||
| 3 | Локальна | R1 | Початкова локальна подія. | ||
| 4 | Локальна | R1 | Початкова локальна подія. | ||
| 3 | Отримання |
R2 (Отримує від |
1. Max: |
Повідомлення прийшло, коли локальний час |
|
| R2-2 (R1) | 2. Приріст: |
Після синхронізації годинник збільшується на |
|||
| 4 | Надсилання |
R1 | Надсилає повідомлення. Годинник збільшується. | ||
| 5 | Отримання |
R2 (Отримує від |
1. Max: |
Повідомлення прийшло, коли локальний час |
|
| R2-2 (R1) | 2. Приріст: |
Після синхронізації годинник збільшується на |
|||
| 6 | Надсилання |
R1 | Надсилає повідомлення. | ||
| 7 | Локальна | R1 | Локальна подія. | ||
| 8 | Локальна | R1 | Між подіями 2 і 8 є локальна подія з годинником 3. Але на малюнку 3.1 події 8 і 9 ідуть одразу після 2, і мають час 8 і 9, що вказує на дещо інший сценарій (ймовірно, пропущені внутрішні події або використання іншого |
||
| 9 | Надсилання |
R1 | Годинник збільшується перед надсиланням. | ||
| 10 | Отримання |
R2 (Отримує від |
1. Max: |
Синхронізація з годинником 9. | |
| R2-2 (R1) | 2. Приріст: |
Приріст після синхронізації. | |||
| 11 | Локальна | R1 | Локальна подія. |
Основна причина, чому годинник Лемпорта має саме такі значення:
-
Локально час завжди йде вперед: Навіть якщо процес нічого не надсилає і не отримує, його годинник збільшується (
$C_i := C_i + d$ ). Це видно на$p_1$ (події 1, 8, 9). -
Синхронізація: Коли повідомлення пересилається (наприклад, від
$p_1$ з часом 2 до$p_2$ ), годинник процесу-одержувача ($p_2$ ) ніколи не може відставати від часу відправника.$p_2$ приймає значення$\max(C_2, C_{msg})$ і лише після цього робить локальний приріст. Це гарантує, що час події надсилання$a$ завжди менший за час події отримання$b$ (тобто $C(a) < C(b)$), що є головною умовою для Логічного Часу Лемпорта.
Саме цей механізм
Цей механізм