도구스개발

벡터 시계·램포트 시계 계산기

분산 시스템의 이벤트와 메시지를 적으면 램포트 논리 시계와 벡터 시계를 매기고, 두 이벤트에 앞뒤가 있는지 아니면 서로 영향을 줄 수 없었던 «동시»인지 판정합니다. 램포트 값만 보면 순서가 있어 보이는 쌍을 따로 모아 보여 줍니다.

한 줄이 프로세스 하나입니다. 「!m1」은 메시지 m1을 보내는 것, 「?m1」은 받는 것입니다(send·recv도 됩니다). 프로세스 8개·이벤트 60개까지.

이벤트 7개 · 프로세스 3개

앞뒤가 있는 쌍 17 · 동시인 쌍 4

이 가운데 3쌍은 램포트 시계 값만 보면 앞뒤가 있어 보이지만 실제로는 서로 영향을 줄 수 없었던 «동시» 쌍입니다.

이벤트7개
이벤트 쌍21쌍
앞뒤가 있는 쌍17쌍
동시인 쌍4쌍
램포트가 헷갈리게 하는 쌍3쌍

이벤트마다의 시계

이벤트하는 일램포트벡터 [p1, p2, p3]
p1.1자기 일 · a1[1, 0, 0]
p1.2보냄 · m12[2, 0, 0]
p1.3자기 일 · b3[3, 0, 0]
p2.1받음 · m13[2, 1, 0]
p2.2자기 일 · c4[2, 2, 0]
p2.3보냄 · m25[2, 3, 0]
p3.1받음 · m26[2, 3, 1]

벡터의 각 칸은 그 프로세스에서 일어난 일을 몇 개까지 알고 있는가입니다. 메시지를 받으면 칸마다 큰 쪽을 취하므로, 보낸 쪽이 알고 있던 것이 그대로 넘어옵니다.

p1.3이 p2.2보다앞뒤가 없습니다 (동시)
벡터 비교[3, 0, 0] vs [2, 2, 0]
램포트 비교3 vs 4 — 값은 갈리지만 앞뒤는 없습니다

램포트 값에 속기 쉬운 쌍

램포트 값은 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].

「동시」는 같은 시각이라는 뜻이 아닙니다. 서로 영향을 줄 수 없었다는 뜻입니다. 실제 시계로는 몇 시간 차이가 나더라도, 그 사이에 메시지가 한 번도 오가지 않았다면 두 이벤트는 동시입니다. 분산 시스템에서 「무엇이 먼저인가」를 벽시계로 정할 수 없는 이유가 여기 있습니다.
램포트 시계는 한쪽 방향만 보장합니다. a가 b보다 앞서면 L(a) < L(b)인 것은 언제나 참이지만, 그 역은 참이 아닙니다. 위 「램포트 값에 속기 쉬운 쌍」이 바로 그 반례이고, 그래서 램포트 값만으로 순서를 매기면 있지도 않은 인과관계를 만들어 냅니다. 벡터 시계는 양쪽을 모두 보장합니다.
벡터 시계의 값이 프로세스 수만큼 커집니다. 프로세스가 수천 개면 이벤트 하나마다 수천 칸을 들고 다녀야 해서 그대로는 쓰기 어렵고, 실무에서는 칸을 줄이거나 (버전 벡터·점 있는 버전 벡터) 다른 방식으로 바꿔 씁니다. 이 도구는 프로세스 8개까지 다룹니다.
이 도구의 판정은 시계로 낸 것이 관계를 직접 구한 것과 같은지 확인한 결과입니다. 프로그램 순서와 메시지만 간선으로 놓고 그래프에서 갈 수 있는지를 따진 것이 happens-before의 정의 그 자체이고, 벡터 비교가 그것과 양방향으로 일치하는지를 무작위 실행에서 대조했습니다.

사용 방법

  1. 1한 줄에 프로세스 하나씩, 그 프로세스의 이벤트를 쉼표로 이어 적습니다.
  2. 2메시지를 보내는 이벤트는 「!m1」, 받는 이벤트는 「?m1」로 적습니다.
  3. 3표에서 이벤트마다의 램포트 값과 벡터 값을 확인합니다.
  4. 4두 이벤트를 골라 앞뒤가 있는지 동시인지 판정합니다.
  5. 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일 · 결과는 참고용 추정치입니다.