Skip to content

IhorLihvan/share

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔹 1. Що взагалі відбувається

Уяви, що є кілька комп’ютерів — наприклад, три:

  • p₁
  • p₂
  • p₃

Кожен із них виконує свої завдання (події): щось обчислює, надсилає повідомлення іншому, або отримує повідомлення від нього.

Але в нас немає спільного годинника, тому треба придумати, як визначити, яка подія була раніше, а яка пізніше.


🔹 2. Ідея Лампорта (Lamport Clocks)

Кожен комп’ютер має свій «лічильник подій» — просто число (це й є логічний годинник).

  • Спочатку в усіх — 0
  • Кожного разу, коли відбувається подія, цей лічильник збільшується
  • Якщо комп’ютери обмінюються повідомленнями, вони передають і свій поточний час

🔹 3. Просте правило (як діє алгоритм)

Уяви, що кожен комп’ютер каже собі:

«Коли я роблю щось (виконую дію, відправляю чи отримую повідомлення) — я додаю +3 до свого часу (бо в нас d=3). А якщо я отримав повідомлення, я спочатку дивлюсь, який час був у того, хто мені його надіслав.»


Отже, є два випадки:

1️⃣ Коли я роблю щось сам (внутрішня подія або відправляю повідомлення): → просто додаю 3.

Було 0 → стало 3. Було 3 → стало 6.

2️⃣ Коли я отримую повідомлення: → дивлюсь, який час був у відправника, → беру більший час із двох (мій і його), → і теж додаю 3.

Це гарантує, що отримувач події завжди має більший час, ніж відправник.


🔹 4. Приклад "історії"

Є два комп’ютери: 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, тобто відправлення було раніше, ніж отримання.

🔹 5. Для чого це треба

Так ми можемо визначити, яка подія логічно відбулася раніше, навіть якщо комп’ютери не мають спільного годинника.

У підсумку:

  • Події всередині одного комп’ютера впорядковуються просто додаванням +3.
  • Події між різними комп’ютерами узгоджуються через передавання "часу" в повідомленнях.

🔹 6. Уяви це як історію

🧠 p₁ каже: “Я зробив подію о 6-й годині й відправив тобі повідомлення.” 💻 p₂ відповідає: “Окей, у мене зараз 0, але бачу, що в тебе було 6 — я поставлю собі 6 і ще додам 3. Тепер у мене 9.”

От і все! Тепер вони узгодили, що подія p₁ сталася раніше, ніж p₂. А це і є мета алгоритму — впорядкувати події логічно.


🔹 7. Коротко формулами (для контрольної)

  • Внутрішня подія / Send: ( $C_i = C_i + d$ )
  • Receive: ( $C_i = \max(C_i, C_{msg}) + d$ )

2 Пояснення

Давайте розберемо кожен процес ($p_1, p_2, p_3$) та кожну подію на малюнку, дотримуючись двох правил $\text{R1}$ і $\text{R2}$.

⚙️ Вихідні дані та Правила

  1. Початковий стан: Усі процеси ($p_1, p_2, p_3$) починають з годинником $C = 0$.
  2. Приріст ($d$): Згідно з текстом, для цього малюнка встановлено: $\mathbf{d = 1}$.
  3. Правило R1 (Локальна подія або Надсилання): Перед виконанням події (внутрішньої або надсилання повідомлення), процес $p_i$ збільшує свій годинник на $d$: $$C_i := C_i + d$$
  4. Правило R2 (Отримання повідомлення): Коли процес $p_i$ отримує повідомлення з часовою міткою $C_{msg}$:
    1. Синхронізація: $C_i := \max(C_i, C_{msg})$
    2. Виконання R1: $C_i := C_i + d$ (тобто $C_i := C_i + 1$)
    3. Доставити повідомлення.

🔍 Покроковий Розбір Діаграми (Малюнок 3.1)

Розглянемо кожну подію (нумеровану крапку) на діаграмі, пояснюючи, яке правило застосовується.

Подія (Час) Процес Тип події Застосоване Правило Обчислення Пояснення
1 $p_1$ Локальна R1 $C_1 := 0 + 1 = \mathbf{1}$ Початкова локальна подія.
2 $p_1$ Надсилання $M_{2 \to 3}$ R1 $C_1 := 1 + 1 = \mathbf{2}$ Надсилає повідомлення. $\text{R1}$ застосовується перед надсиланням.
3 $p_2$ Локальна R1 $C_2 := 0 + 1 = \mathbf{1}$ Початкова локальна подія.
4 $p_3$ Локальна R1 $C_3 := 0 + 1 = \mathbf{1}$ Початкова локальна подія.
3 $p_2$ Отримання $M_{2 \to 3}$ R2 (Отримує від $p_1$ з $C_{msg}=2$) 1. Max: $C_2 := \max(\text{поточний } C_2=1, C_{msg}=2) = 2$ Повідомлення прийшло, коли локальний час $p_2$ був 1. $p_2$ синхронізується.
R2-2 (R1) 2. Приріст: $C_2 := 2 + 1 = \mathbf{3}$ Після синхронізації годинник збільшується на $d=1$.
4 $p_2$ Надсилання $M_{4 \to 5}$ R1 $C_2 := 3 + 1 = \mathbf{4}$ Надсилає повідомлення. Годинник збільшується.
5 $p_3$ Отримання $M_{4 \to 5}$ R2 (Отримує від $p_2$ з $C_{msg}=4$) 1. Max: $C_3 := \max(\text{поточний } C_3=1, C_{msg}=4) = 4$ Повідомлення прийшло, коли локальний час $p_3$ був 1. $p_3$ синхронізується.
R2-2 (R1) 2. Приріст: $C_3 := 4 + 1 = \mathbf{5}$ Після синхронізації годинник збільшується на $d=1$.
6 $p_3$ Надсилання $M_{6 \to 7}$ R1 $C_3 := 5 + 1 = \mathbf{6}$ Надсилає повідомлення.
7 $p_3$ Локальна R1 $C_3 := 6 + 1 = \mathbf{7}$ Локальна подія.
8 $p_1$ Локальна R1 $C_1 := 2 + 1 = \mathbf{3}$ Між подіями 2 і 8 є локальна подія з годинником 3. Але на малюнку 3.1 події 8 і 9 ідуть одразу після 2, і мають час 8 і 9, що вказує на дещо інший сценарій (ймовірно, пропущені внутрішні події або використання іншого $d$ для певних подій). УВАГА: Діаграма на малюнку 3.1 (в оригіналі Lamport) часто використовує спрощений вигляд.
9 $p_1$ Надсилання $M_{9 \to 10}$ R1 $C_1 := 8 + 1 = \mathbf{9}$ Годинник збільшується перед надсиланням.
10 $p_2$ Отримання $M_{9 \to 10}$ R2 (Отримує від $p_1$ з $C_{msg}=9$) 1. Max: $C_2 := \max(\text{поточний } C_2=4, C_{msg}=9) = 9$ Синхронізація з годинником 9.
R2-2 (R1) 2. Приріст: $C_2 := 9 + 1 = \mathbf{10}$ Приріст після синхронізації.
11 $p_2$ Локальна R1 $C_2 := 10 + 1 = \mathbf{11}$ Локальна подія.

🔑 Головний висновок

Основна причина, чому годинник Лемпорта має саме такі значення:

  1. Локально час завжди йде вперед: Навіть якщо процес нічого не надсилає і не отримує, його годинник збільшується ($C_i := C_i + d$). Це видно на $p_1$ (події 1, 8, 9).
  2. Синхронізація: Коли повідомлення пересилається (наприклад, від $p_1$ з часом 2 до $p_2$), годинник процесу-одержувача ($p_2$) ніколи не може відставати від часу відправника. $p_2$ приймає значення $\max(C_2, C_{msg})$ і лише після цього робить локальний приріст. Це гарантує, що час події надсилання $a$ завжди менший за час події отримання $b$ (тобто $C(a) < C(b)$), що є головною умовою для Логічного Часу Лемпорта.

Саме цей механізм $\max(\dots) + d$ створює ланцюгову реакцію, змушуючи годинники в різних частинах розподіленої системи "наздоганяти" одне одного під час обміну повідомленнями.


Цей механізм $\max(\dots) + d$ є базою для розуміння всіх розподілених систем. Чи хотіли б ви розглянути приклад, де $C_{msg}$ менший за поточний $C_i$ (щоб побачити, як працює функція $\max$), або перейти до складнішого Векторного Часу?

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors