벡터 시계·램포트 시계 계산기
분산 시스템의 이벤트와 메시지를 적으면 램포트 논리 시계와 벡터 시계를 매기고, 두 이벤트에 앞뒤가 있는지 아니면 서로 영향을 줄 수 없었던 «동시»인지 판정합니다. 램포트 값만 보면 순서가 있어 보이는 쌍을 따로 모아 보여 줍니다.
한 줄이 프로세스 하나입니다. 「!m1」은 메시지 m1을 보내는 것, 「?m1」은 받는 것입니다(send·recv도 됩니다). 프로세스 8개·이벤트 60개까지.
이벤트 7개 · 프로세스 3개
앞뒤가 있는 쌍 17 · 동시인 쌍 4
이 가운데 3쌍은 램포트 시계 값만 보면 앞뒤가 있어 보이지만 실제로는 서로 영향을 줄 수 없었던 «동시» 쌍입니다.
이벤트마다의 시계
| 이벤트 | 하는 일 | 램포트 | 벡터 [p1, p2, p3] |
|---|---|---|---|
| p1.1 | 자기 일 · a | 1 | [1, 0, 0] |
| p1.2 | 보냄 · m1 | 2 | [2, 0, 0] |
| p1.3 | 자기 일 · b | 3 | [3, 0, 0] |
| p2.1 | 받음 · m1 | 3 | [2, 1, 0] |
| p2.2 | 자기 일 · c | 4 | [2, 2, 0] |
| p2.3 | 보냄 · m2 | 5 | [2, 3, 0] |
| p3.1 | 받음 · m2 | 6 | [2, 3, 1] |
벡터의 각 칸은 그 프로세스에서 일어난 일을 몇 개까지 알고 있는가입니다. 메시지를 받으면 칸마다 큰 쪽을 취하므로, 보낸 쪽이 알고 있던 것이 그대로 넘어옵니다.
램포트 값에 속기 쉬운 쌍
램포트 값은 p1.3이 3, p2.2가 4로 갈리지만, 벡터로 보면 어느 쪽도 앞서지 않습니다 — [3, 0, 0] 대 [2, 2, 0].
램포트 값은 p1.3이 3, p2.3이 5로 갈리지만, 벡터로 보면 어느 쪽도 앞서지 않습니다 — [3, 0, 0] 대 [2, 3, 0].
램포트 값은 p1.3이 3, p3.1이 6로 갈리지만, 벡터로 보면 어느 쪽도 앞서지 않습니다 — [3, 0, 0] 대 [2, 3, 1].
사용 방법
- 1한 줄에 프로세스 하나씩, 그 프로세스의 이벤트를 쉼표로 이어 적습니다.
- 2메시지를 보내는 이벤트는 「!m1」, 받는 이벤트는 「?m1」로 적습니다.
- 3표에서 이벤트마다의 램포트 값과 벡터 값을 확인합니다.
- 4두 이벤트를 골라 앞뒤가 있는지 동시인지 판정합니다.
- 5「램포트 값에 속기 쉬운 쌍」에서 논리 시계 하나로는 왜 부족한지 확인합니다.
자주 묻는 질문
한 이벤트가 다른 이벤트에 영향을 줄 수 있었는지를 나타내는 관계입니다. 같은 프로세스 안에서 앞선 이벤트는 뒤선 이벤트보다 먼저이고, 메시지를 보낸 이벤트는 그것을 받은 이벤트보다 먼저이며, 이 관계는 이어집니다(a→b이고 b→c면 a→c). 어느 쪽도 아니면 두 이벤트는 «동시»입니다.
아닙니다. 서로 영향을 줄 수 없었다는 뜻입니다. 실제 시계로 몇 시간이 차이 나더라도 그 사이에 메시지가 한 번도 오가지 않았다면 두 이벤트는 동시입니다. 반대로 벽시계 시각이 비슷해도 메시지로 이어져 있으면 앞뒤가 분명합니다.
한쪽 방향만 보장하기 때문입니다. a가 b보다 앞서면 L(a) < L(b)인 것은 언제나 참이지만, L(a) < L(b)라고 해서 a가 앞선 것은 아닙니다. 이 도구는 그런 쌍을 따로 모아 보여 줍니다 — 램포트 값만으로 순서를 매기면 있지도 않은 인과관계를 만들어 내게 됩니다.
프로세스 수만큼의 칸을 두고, 자기 이벤트마다 자기 칸을 1 올리고, 메시지를 받으면 받은 벡터와 칸마다 큰 쪽을 취합니다. 각 칸은 「그 프로세스에서 일어난 일을 몇 개까지 알고 있는가」를 뜻하며, 모든 칸이 ≤이고 적어도 한 칸이 <이면 앞선 것입니다.
인과관계 판정은 정확하지만 값이 프로세스 수만큼 커집니다. 프로세스가 수천 개면 이벤트마다 수천 칸을 들고 다녀야 해 그대로는 쓰기 어렵고, 실무에서는 버전 벡터처럼 칸을 줄인 방식으로 바꿔 씁니다. 이 도구는 프로세스 8개·이벤트 60개까지 다룹니다.
거부합니다. 그런 실행은 인과관계가 고리를 이뤄 어느 쪽이 먼저인지 정할 수 없기 때문입니다. 실제 시스템에서 일어날 수 없는 실행이므로 시계를 매기지 않고 그 사실을 알려 줍니다.
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 정답지는 시계를 전혀 쓰지 않고 구한 happens-before 관계입니다. 프로그램 순서와 메시지만 간선으로 놓고 그래프에서 갈 수 있는지(도달가능성)를 따진 것이 이 관계의 정의 그 자체이고, 벡터 비교가 그것과 양방향으로 일치하는지를 무작위 실행 300개의 모든 이벤트 쌍(1만 쌍 이상)에서 대조했습니다.
- 램포트 시계가 한쪽 방향만 보장한다는 것도 검사로 고정했습니다. 앞선 이벤트는 언제나 램포트 값이 작다는 것을 무작위 실행에서 확인했고, 그 역이 깨지는 쌍(값은 갈리지만 동시인 쌍)이 실제로 100쌍 넘게 나오는 것도 함께 확인했습니다.
- 벡터의 각 칸이 「그 프로세스에서 인과적으로 앞선 이벤트의 개수」와 정확히 같은지, 자기 칸이 자기 프로세스에서 몇 번째인가와 같은지도 검사합니다.
- 메시지를 보내기 전에 받는 실행은 순환이라 위상 정렬이 실패하며, 시계를 매기지 않고 거부합니다. 한 메시지를 두 번 보내거나 받는 입력, 짝이 없는 메시지, 같은 프로세스가 스스로 보내고 받는 입력도 거부합니다.
- 벡터 시계는 인과관계 판정에는 정확하지만 크기가 프로세스 수에 비례해 커집니다. 실제 시스템이 그대로 쓰지 않는 이유이며, 이 도구는 개념을 눈으로 보는 용도입니다.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.