LTCT KOREA세계 논리학의 지도
미국 국기미국편 · 연재 50

THE WORLD OF LOGIC · UNITED STATES / 50

서로 다른 컴퓨터의 기록에서, 무엇이 먼저였는지 어떻게 알까요?

학교 체험 수업의 마지막 자리를 두 서버가 함께 관리합니다. 한 서버에는 요청을 보낸 시각이 10시 00분 05초, 다른 서버에는 받은 시각이 10시 00분 03초로 적혀 있습니다. 벽시계 숫자가 어긋난 기록에서 무엇을 근거로 먼저와 나중을 판단할까요? 여섯 사건을 정하고, 메시지를 따라가고, 각 사건의 숫자까지 직접 계산해 보겠습니다.

원문 기반 가상 대담15개의 질문생각그림 15개 · 실험 3개
이 대담의 성격

레슬리 램포트(Leslie Lamport)의 1978년 논문을 함께 읽습니다. 원전은 연구 소속을 Massachusetts Computer Associates, 저자 주소를 미국 캘리포니아의 SRI International로 표시합니다. 미국편 분류는 이 연구 활동 장소에 근거합니다. 이 대담은 원논문을 바탕으로 구성한 학습용 가상 대화입니다. 학교 예약 서버의 이름·사건·수치와 아래 실험은 설명을 위해 새로 만든 사례이며, 연구자의 실제 인터뷰나 실제 서비스의 운영 기록을 뜻하지 않습니다.

사회자 · 독자의 질문

구체적인 상황에서 출발해, 추론의 단계를 하나씩 묻습니다.

레슬리 램포트

원논문을 바탕으로 재구성한 학습용 답변입니다.

이번 글의 흐름 살펴보기

사례를 읽고, 계산을 따라가며, 결론에 필요한 조건을 확인합니다.

PART I · 01—5

사례에서 출발하기

사회자 · 독자의 질문

컴퓨터에 시계가 있는데, 먼저 일어난 일을 왜 따로 따지나요? 학교 체험 수업을 두 컴퓨터에서 접수한다고 해 볼게요. 기록에 시각까지 남으면 어느 요청이 먼저였는지 바로 알 수 있지 않나요?

레슬리 램포트 · 원전 기반 재구성

먼저 아주 작은 기록을 놓고 보겠습니다. 접수 서버 A에는 ‘10시 00분 05초, 예약 요청 전송’이 적혀 있습니다. 좌석 서버 B에는 그 요청을 ‘10시 00분 03초에 수신’했다고 적혀 있습니다. 이 두 시계가 서로 맞지 않는다면 숫자만 정렬했을 때 수신이 전송보다 앞에 놓입니다. 같은 메시지는 전송된 뒤에 수신되므로, 우리는 이미 그 두 사건의 순서를 알고 있습니다.

이번 글에서는 초 단위를 잠시 내려놓고, 컴퓨터가 실제로 기록한 행동을 따라가겠습니다. 메시지를 만든 사건, 보낸 사건, 받은 사건을 각각 표시하고 그 사이에서 확실하게 말할 수 있는 선후 관계를 찾습니다. 램포트의 1978년 논문은 분산된 과정들의 사건을 이런 관계로 다루는 출발점을 제공합니다.

두 서버의 모든 행동을 처음부터 한 줄로 늘어놓을 필요는 없습니다. 어떤 사건 사이에는 명확한 연결이 있고, 다른 사건 사이에는 그런 연결이 기록되지 않을 수 있습니다. 연결이 있는 곳부터 정확하게 판단하면, 뒤에서 붙일 숫자도 지켜야 할 규칙이 분명해집니다.

생각그림 01 · 같은 메시지의 전송과 수신관계와 추론 읽기
기록 위치행동각 서버의 시각
접수 서버 A요청 m₁ 전송10:00:05
좌석 서버 B같은 요청 m₁ 수신10:00:03
학습용 예시. 시계가 어긋나 있어도 m₁의 전송이 수신에 앞선다는 관계는 유지됩니다.
원전 558–559쪽의 도입과 사건 모델. 두 서버의 시각과 학교 예약 사례는 편집부가 만든 교육용 예시입니다.
사회자 · 독자의 질문

이 글에서 ‘사건’과 ‘과정’은 무엇을 가리키나요? 메시지 하나를 보내는 일도 사건이고, 받는 일도 사건인가요? 계산할 때 무엇을 하나로 셀지 먼저 정해야겠네요.

레슬리 램포트 · 원전 기반 재구성

맞습니다. 여기서는 한 서버가 기록하는 행동 하나를 사건으로 정합니다. A는 신청 내용 작성 a₁, 요청 전송 a₂, 응답 수신 a₃를 차례대로 처리합니다. B는 좌석 목록 확인 b₁, 요청 수신 b₂, 응답 전송 b₃를 차례대로 처리합니다. A와 B를 각각 하나의 과정, 영어로 프로세스(process, 순서대로 진행되는 계산 과정)라고 부르겠습니다.

한 서버 내부에서는 우리가 정한 사건 순서가 명확합니다. A에서는 a₁이 a₂에 앞서고 a₂가 a₃에 앞섭니다. B에서는 b₁, b₂, b₃ 순서입니다. 실제 큰 서버에 여러 작업이 동시에 돌아간다면 작업 흐름을 더 잘게 나누어 모델을 만들 수 있습니다. 이번 사례는 서버별 작업 한 줄씩을 관찰하는 단순한 모형입니다.

서버 사이에는 메시지 두 개만 오갑니다. m₁은 a₂에서 보내 b₂에서 받는 예약 요청이며, m₂는 b₃에서 보내 a₃에서 받는 응답입니다. 아래 여섯 사건을 끝까지 같은 뜻으로 사용하겠습니다. 도식의 줄 간격이나 화면에서의 높이는 실제 몇 초가 흘렀는지를 나타내지 않습니다.

생각그림 02 · 끝까지 사용할 여섯 사건관계와 추론 읽기
접수 서버 A의 작업 순서
a₁ · 신청 내용 작성

예약 내용을 준비합니다.

a₂ · 요청 전송

m₁을 B로 보냅니다.

a₃ · 응답 수신

B의 m₂를 받습니다.

좌석 서버 B의 작업 순서
b₁ · 좌석 목록 확인

이번에 사용할 목록을 확인합니다.

b₂ · 요청 수신

A의 m₁을 받습니다.

b₃ · 응답 전송

m₂를 A로 보냅니다.

서버 사이의 연결은 a₂ → b₂ (요청 m₁), b₃ → a₃ (응답 m₂)입니다. 나란히 놓인 높이는 같은 실제 시각을 뜻하지 않습니다.
A 내부는 a₁→a₂→a₃, B 내부는 b₁→b₂→b₃입니다. 메시지는 a₂→b₂와 b₃→a₃를 잇습니다.
원전 558–559쪽의 과정·사건·메시지 모델. A·B와 여섯 사건, 메시지 이름은 이 글의 교육용 설정입니다.
사회자 · 독자의 질문

사건 사이의 화살표는 어떤 근거가 있을 때 그리나요? 그림에서 a₁을 위에 그렸다는 이유만으로 다른 모든 사건보다 먼저라고 읽으면 곤란하겠어요. 화살표를 그리는 규칙을 정해 주세요.

레슬리 램포트 · 원전 기반 재구성

a→b는 이 모형의 기록을 따라 a가 b에 앞선다는 뜻입니다. 램포트가 정의한 해픈드 비포(happened-before, 사건의 선행 관계)는 세 가지로 정해집니다. 같은 과정에서 먼저 기록된 사건에서 나중 사건으로 이어집니다. 같은 메시지의 전송에서 수신으로 이어집니다. 이미 a→b와 b→c가 있으면 a→c도 이어집니다.

마지막 규칙을 추이성이라고 합니다. a에서 b로 갔고 b에서 c로 갈 수 있다면 a에서 c까지 연결된 길이 있다는 뜻입니다. 다만 반대 방향을 새로 만들지는 않습니다. a₂에서 b₂로 요청이 갔다는 사실만으로 b₂에서 a₂로 되돌아가는 선을 그리면, 요청을 받기 전에 보냈다는 기록과 충돌합니다.

따라서 직접 주어진 선은 A 내부 두 개, B 내부 두 개, 메시지 두 개입니다. 그 여섯 선을 따라 앞으로 갈 수 있는 모든 쌍을 찾아 선행 관계를 완성합니다. 아무 근거 없이 선을 덧붙이지 않는다는 점이 중요합니다. 자신에서 출발해 자신으로 돌아오는 선행 경로가 생긴다면 이 사건 모형부터 다시 확인해야 합니다.

생각그림 03 · 선 하나를 그리는 근거관계와 추론 읽기
① 한 과정의 기록을 따라갑니다.
a₁ → a₂

A가 작성한 다음 전송했다는 내부 기록이 근거입니다.

② 같은 메시지의 양 끝을 잇습니다.
a₂ → b₂

m₁을 보낸 사건에서 같은 m₁을 받은 사건으로 잇습니다.

③ 이어진 경로를 요약합니다.
a₁ → a₂ → b₂
따라서 a₁ → b₂

추이성으로 얻은 관계입니다.

→는 이 글에서 사건 선행 관계를 나타냅니다. 명제논리의 조건문 기호와 구별해 읽습니다.
원전 559쪽 The Partial Ordering의 정의. 여섯 직접 선에서 출발하는 유한 그래프는 편집부 구성입니다.
사회자 · 독자의 질문

A에서 시작된 요청이 A의 응답 수신까지 어떻게 이어지나요? a₂와 a₃는 같은 서버에 있으니 순서를 알겠어요. 메시지를 실제로 따라가서도 그 관계를 확인할 수 있나요?

레슬리 램포트 · 원전 기반 재구성

예약 요청 m₁을 따라 a₂에서 b₂로 갑니다. B는 요청을 받은 다음 응답을 보내므로 b₂에서 b₃로 갑니다. 응답 m₂를 따라 b₃에서 a₃로 갑니다. 세 번 이동한 경로는 a₂→b₂→b₃→a₃입니다. 각 구간에 메시지 전송·수신 또는 같은 과정의 순서라는 근거가 붙어 있습니다.

추이성을 한 번 적용하면 a₂→b₃를 얻습니다. 여기에 b₃→a₃를 이어 붙이면 a₂→a₃를 얻습니다. 신청 내용을 작성한 a₁도 a₂에 앞서므로 a₁→a₃까지 따라옵니다. 중간 사건을 지웠다는 뜻은 아닙니다. 긴 경로를 짧게 요약한 관계를 추가한 것입니다.

이 과정을 실제 장애 기록에 대입한다면, 메시지 식별자를 통해 어느 전송과 어느 수신이 한 쌍인지 확인해야 합니다. 서로 다른 요청을 같은 m₁로 묶으면 없던 경로가 생깁니다. 이번 모형은 두 메시지의 짝이 정확히 확인되어 있다는 전제에서 계산합니다.

생각그림 04 · 한 요청의 왕복 경로관계와 추론 읽기
① A에서 요청 전송
a₂ → b₂ · 메시지 m₁
② B에서 처리 순서 확인
b₂ → b₃ · 같은 과정의 순서
③ B의 응답을 A에서 수신
b₃ → a₃ · 메시지 m₂
④ 추이성 적용
a₂ → b₂ → b₃ → a₃, 따라서 a₂ → a₃
각 화살표의 근거를 확인한 뒤 경로 전체를 연결합니다.
원전 559쪽의 추이성. 왕복 경로와 메시지 식별자 설명은 이 글의 예시를 풀이한 것입니다.
사회자 · 독자의 질문

연결된 길이 없는 두 사건은 동시에 일어난 건가요? B가 좌석 목록을 확인한 b₁과 A가 요청을 보낸 a₂는 어느 쪽이 먼저인가요?

레슬리 램포트 · 원전 기반 재구성

우리가 적은 기록에서는 b₁에서 a₂로 가는 길이 없고 a₂에서 b₁로 가는 길도 없습니다. 이런 두 사건을 이 관계에 대해 동시적이라고 부릅니다. 이 말은 벽시계의 같은 초에 일어났다는 뜻으로 사용하지 않습니다. 현재 모형에 포함된 과정과 메시지로 두 사건의 선후를 정할 수 없다는 뜻입니다.

b₁은 b₂보다 앞서고 a₂도 b₂보다 앞섭니다. 그렇다고 b₁과 a₂ 사이의 순서까지 정해지지는 않습니다. 두 길이 나중에 b₂에서 만난다는 사실은 각각의 출발점이 어떤 순서였는지 알려 주지 않습니다. ‘같은 결과보다 먼저’라는 두 조건을 ‘둘 사이에도 먼저와 나중이 있다’로 바꾸면 추론이 한 단계 더 나가 버립니다.

만약 B가 b₁ 뒤에 별도 메시지를 보내고 A가 그 메시지를 받은 뒤 a₂를 수행했다는 기록이 추가되면, 새 모형에서는 b₁→a₂를 얻을 수 있습니다. 우리는 실제로 포함된 기록의 범위에서 판단합니다. 지금 모형의 동시성만으로 세상의 모든 전달 경로까지 부정할 수는 없습니다.

생각그림 05 · 같은 사건 앞에서 만나는 두 경로관계와 추론 읽기
B 내부에서 확인한 길
b₁ → b₂

목록 확인 뒤에 요청을 받습니다.

메시지로 확인한 길
a₂ → b₂

A의 요청 전송 뒤에 B가 받습니다.

공통 도착점에서 얻을 수 있는 정보
b₁ ∥ a₂

두 사건이 b₂에 앞선다는 것은 확인했습니다. b₁과 a₂를 서로 잇는 경로는 없으므로 그 둘의 선후는 이 모형에서 정해지지 않습니다.

∥는 현재 모형에서 두 사건이 서로 선행하지 않는다는 표시입니다.
원전 559쪽의 동시성 정의. 공통 후속 사건이 있어도 두 출발점의 비교 가능성이 따라오지 않는 예시는 편집부 구성입니다.
직접 실험 1 · 두 사건을 잇는 길 찾기조건을 바꾸어 계산하기

여섯 사건 가운데 두 개를 고르면 직접 선을 따라 양방향 경로를 계산합니다. 같은 사건, 선행, 후행, 동시성을 구별합니다.

직접 선: a₁→a₂, a₂→a₃, b₁→b₂, b₂→b₃, a₂→b₂, b₃→a₃. 두 방향을 각각 탐색합니다.

기본값으로 따라 읽기

기본값 a₂와 a₃: a₂→a₃이므로 a₂가 선행합니다. b₁과 a₂는 양방향 경로가 없어 현재 모형에서 동시적입니다.

이 실험은 본문에 명시한 유한한 사례를 계산합니다. 조작 결과와 그 이유를 함께 확인하세요.

PART II · 06—10

조건과 추론 따라가기

사회자 · 독자의 질문

논리시계에는 초 대신 무엇을 적나요? 선후 관계를 찾았으니 이제 숫자를 붙이는 건가요? 숫자 4는 네 초가 지났다는 뜻인가요?

레슬리 램포트 · 원전 기반 재구성

여기서는 사건의 순서를 지키기 위한 정수를 적습니다. 각 서버에 숫자를 담는 칸을 하나씩 두고 처음 값을 0으로 정하겠습니다. 서버가 일반 내부 사건이나 전송 사건을 처리할 때 값을 1 올린 뒤 그 사건에 붙입니다. A의 첫 사건 a₁에는 1, 다음 전송 사건 a₂에는 2를 붙입니다. B의 첫 사건 b₁에도 1을 붙입니다.

이렇게 사건에 숫자를 대응시키는 장치를 논리시계(logical clock, 사건의 선후를 보존하도록 붙이는 시각값)라고 합니다. C(a₂)=2는 사건 a₂의 논리시계 값이 2라는 뜻입니다. 숫자가 같다는 사실만으로 두 컴퓨터의 실제 동작 시간이 같았다고 읽을 수는 없습니다. 실제 경과 시간을 재는 단위가 붙어 있지 않기 때문입니다.

이번 계산에서는 항상 1씩 올리는 구체적인 구현을 사용합니다. 원전의 조건은 한 과정의 뒤 사건이 앞 사건보다 큰 값을 갖도록 하는 것입니다. 따라서 어떤 구현이 1에서 3으로 더 크게 올라가더라도 필요한 순서를 지킬 수 있습니다. 실험에서는 계산 과정을 비교하기 쉽도록 증가 폭을 1로 고정합니다.

생각그림 06 · 처음 세 사건에 값 붙이기관계와 추론 읽기
사건직전 값계산사건 값
a₁ · 작성A=00+11
a₂ · 요청 전송A=11+12
b₁ · 목록 확인B=00+11
A의 1과 B의 1은 각 과정에서 계산한 값입니다. 실제 시각이나 경과 초를 뜻하지 않습니다.
원전 559–560쪽 Logical Clocks. 처음 값 0과 내부·전송 사건의 증가 폭 1은 이 글이 고른 구체적인 정수 구현입니다.
사회자 · 독자의 질문

숫자 2를 붙인 메시지를 받으면, 받는 쪽은 얼마를 적나요? B의 값은 지금 1입니다. A가 값 2를 붙여 보낸 요청을 B가 받으면, B도 그냥 1을 더해 2라고 적으면 되나요?

레슬리 램포트 · 원전 기반 재구성

수신 사건에는 전송 사건보다 큰 값이 필요합니다. B가 2라고 적으면 전송 a₂와 수신 b₂의 값이 같아져, 우리가 지키려는 a₂→b₂의 엄격한 선후를 숫자로 표현하지 못합니다. 이번 구현에서는 자기 직전 값과 받은 메시지의 값을 비교해 큰 값을 고른 뒤 1을 더합니다.

식으로 쓰면 ‘수신 값 = max(자기 직전 값, 메시지 값)+1’입니다. max는 괄호 안 값 가운데 가장 큰 것을 고른다는 뜻입니다. 지금은 max(1,2)+1=3이므로 b₂에는 3을 붙입니다. B의 직전 값 1에도, 메시지의 값 2에도 뒤따르는 숫자가 됩니다.

반대로 B가 이미 8까지 진행한 상태에서 값 2인 오래된 메시지를 받는 경우도 생각해 보세요. 계산은 max(8,2)+1=9입니다. 메시지가 오래됐다는 이유로 B의 값을 3으로 되돌리면 B가 이미 처리한 사건들의 순서가 깨집니다. 두 값을 함께 확인하는 이유를 여기서 볼 수 있습니다.

생각그림 07 · 수신 사건의 값 계산관계와 추론 읽기
자기 직전 값과 메시지 값
B가 가지고 있던 값
L = 1
m₁에 적힌 전송 값
T = 2
큰 값을 골라 1을 더합니다.
max(1, 2) + 1 = 3
두 선의 숫자 방향을 확인합니다.
1 < 3, 2 < 3

B의 직전 사건에도, A의 전송 사건에도 뒤따르는 값입니다.

이 글의 정수 구현은 수신마다 두 값의 최댓값에 1을 더합니다.
원전 560쪽 IR1·IR2. max(L,T)+1은 두 순서 조건을 만족시키기 위한 이 글의 정수 구현이며 원전의 일반 조건을 그대로 인용한 공식은 아닙니다.
사회자 · 독자의 질문

예약 요청이 왕복하는 여섯 사건의 값을 끝까지 구해 볼까요? b₂가 3이라는 것까지 이해했어요. 그 뒤 B가 답장을 보내고 A가 받는 과정도 같은 규칙으로 계산되나요?

레슬리 램포트 · 원전 기반 재구성

B가 응답을 보내는 b₃는 전송 사건이므로 자기 값 3에 1을 더합니다. b₃의 값은 4이고, 응답 메시지 m₂에도 4를 적습니다. A는 요청을 보낸 a₂ 이후 다음 사건을 아직 처리하지 않았으므로 직전 값이 2입니다. m₂를 받는 a₃에서는 max(2,4)+1=5를 계산합니다.

따라서 A의 세 값은 1, 2, 5이고 B의 세 값은 1, 3, 4입니다. A에서 3과 4가 빠졌다고 오류가 생기지는 않습니다. A는 메시지에 적힌 값 4를 확인했으므로 자기 다음 사건에 더 큰 값 5를 붙였습니다. 같은 서버의 연속 사건마다 값이 꼭 이어지는 정수일 필요는 없습니다.

이제 요청의 왕복 경로만 골라 읽어 보겠습니다. a₂의 2, b₂의 3, b₃의 4, a₃의 5가 차례로 증가합니다. 앞에서 직접 확인했던 a₂→b₂→b₃→a₃와 숫자의 증가 방향이 일치합니다. 아래 실험에서도 바로 이 규칙으로 값을 다시 계산합니다.

생각그림 08 · 여섯 사건의 계산 기록관계와 추론 읽기
사건사용한 값계산 결과
a₁ · 작성A: 0+11
a₂ · m₁ 전송A: 1+12
b₁ · 목록 확인B: 0+11
b₂ · m₁ 수신B: max(1,2)+13
b₃ · m₂ 전송B: 3+14
a₃ · m₂ 수신A: max(2,4)+15
표는 각 사건에 사용한 값과 계산 결과를 보여 줍니다. 행의 배치를 모든 사건의 실제 전후 순서로 읽지 않습니다.
원전 560쪽 시계 구현 조건을 여섯 사건에 적용한 자체 계산입니다. 표의 행 배치를 전체 실제 시간 순서로 사용하지 않습니다.
직접 실험 2 · 수신 사건의 논리시계 계산조건을 바꾸어 계산하기

자기 직전 값 L과 메시지 값 T를 입력하면 큰 값을 고르고 1을 더합니다. 두 선행 사건보다 모두 커지는지 계산 과정과 함께 확인합니다.

기본값으로 따라 읽기

기본값 L=1,T=2에서 max(1,2)+1=3입니다. L=8,T=2이면 9, L=4,T=4이면 5입니다.

이 실험은 본문에 명시한 유한한 사례를 계산합니다. 조작 결과와 그 이유를 함께 확인하세요.
사회자 · 독자의 질문

이 규칙이 긴 경로의 순서도 지킨다는 것을 어떻게 보이나요? 여섯 사건에서 맞는 것은 확인했어요. 메시지가 여러 서버를 거쳐 길게 이어져도 이 방식이 통한다는 이유는 무엇인가요?

레슬리 램포트 · 원전 기반 재구성

확인할 대상은 직접 연결된 두 종류의 선입니다. 같은 서버의 다음 사건에서는 값을 올리므로 앞 값이 뒤 값보다 작습니다. 메시지의 수신에서는 메시지 값보다 큰 수를 적으므로 전송 값도 수신 값보다 작습니다. 따라서 직접 그은 모든 선 u→v에 대해 C(u)<C(v)가 성립합니다.

이제 길이가 두 구간인 경로 u→v→w를 생각합시다. 앞의 확인으로 C(u)<C(v), C(v)<C(w)를 얻습니다. 수의 크기 관계도 추이적이므로 C(u)<C(w)입니다. 경로에 구간 하나가 더 붙을 때마다 같은 방법을 반복할 수 있습니다. 유한한 선행 경로 전체에서 값이 증가하는 이유가 여기 있습니다.

이것이 시계 조건 ‘a→b이면 C(a)<C(b)’를 읽는 방법입니다. 여섯 사건의 숫자를 나열한 것은 예시 검산이고, 임의의 길이에 적용되는 이유는 직접 선 두 종류와 경로 연결에 관한 논증입니다. 표본 계산과 일반적인 이유를 함께 두면 어디까지 확인했는지 명확해집니다.

생각그림 09 · 직접 선에서 경로 전체로관계와 추론 읽기
같은 과정의 선
다음 사건에서 증가: C(u)<C(v)
메시지의 선
수신 값이 메시지 값보다 큼: C(v)<C(w)
수의 추이성
C(u)<C(v)<C(w), 따라서 C(u)<C(w)
긴 경로
구간 하나를 붙일 때마다 같은 추론을 반복
사건 선행 관계를 만드는 모든 유한 경로에 적용되는 이유입니다.
원전 559–560쪽 Clock Condition과 C1·C2. 유한 경로에 대한 추이성 논증과 예시 검산의 범위를 나누어 설명했습니다.
사회자 · 독자의 질문

그럼 숫자가 작은 사건이 언제나 먼저라고 말해도 되나요? C(a)<C(b)가 보이면 a→b라고 거꾸로 읽고 싶어집니다. 이미 앞뒤에 맞게 숫자를 붙였으니까요.

레슬리 램포트 · 원전 기반 재구성

그 역방향은 별도로 확인해야 합니다. b₁의 값은 1이고 a₂의 값은 2입니다. 1<2는 참입니다. 그러나 5번 질문에서 확인했듯 b₁에서 a₂로 가는 경로도, a₂에서 b₁로 가는 경로도 없습니다. 바로 우리 여섯 사건 안에 ‘숫자는 더 작지만 선행 관계는 없는’ 반례가 있습니다.

같은 사례로 조건문의 방향을 살펴볼 수 있습니다. ‘선행하면 값이 작다’는 규칙은 선행 관계가 발견됐을 때 숫자를 점검하게 해 줍니다. 숫자가 작다는 이유만으로 빠져 있는 선행 관계를 새로 만들 수는 없습니다. 이런 잘못은 p이면 q라는 전제에서 q만 보고 p를 단정하는 추론과 같은 구조를 가집니다.

유효한 시계라는 전제를 유지하면 다른 판단은 가능합니다. C(a)≥C(b)라면 a→b는 성립할 수 없습니다. 성립한다면 시계 조건이 요구하는 C(a)<C(b)와 충돌하기 때문입니다. 특히 서로 다른 두 사건의 값이 같으면 양방향 선행이 모두 배제됩니다. 반대로 값이 다르더라도 두 사건이 동시적일 수 있습니다.

생각그림 10 · 조건을 어느 방향으로 읽었나요?관계와 추론 읽기
확인한 정보가능한 판단이 사례
a→bC(a)<C(b)a₂→b₂, 2<3
C(a)<C(b)선행 여부는 추가 확인C(b₁)=1<C(a₂)=2, 경로 없음
C(a)=C(b), a≠b현재 모형에서 동시적C(a₁)=C(b₁)=1
모든 판단은 같은 사건 모형과 시계 조건을 만족하는 값들을 전제로 합니다.
원전 559–560쪽 시계 조건의 한쪽 방향. b₁·a₂ 반례, 대우와 같은 값의 귀결은 조건을 이 글의 모델에서 직접 풀어 설명했습니다.

PART III · 11—15

결론의 범위 확인하기

사회자 · 독자의 질문

업무 처리를 위해 모든 사건을 한 줄로 세우려면 어떻게 하나요? 서로 선후를 정할 수 없는 사건이 있어도, 예약 대기표는 한 줄이어야 하잖아요. 이런 순서를 정하는 것은 가능한가요?

레슬리 램포트 · 원전 기반 재구성

논리시계 값이 작은 사건부터 놓고, 값이 같을 때 사용할 서버 순서를 미리 약속하면 됩니다. 여기서는 A를 B보다 앞에 놓는다고 정하겠습니다. 사건마다 ‘시계 값, 서버 이름’이라는 두 정보를 붙이고 앞의 숫자를 먼저 비교합니다. 숫자가 같을 때만 서버 이름의 약속을 사용합니다.

a₁의 표지는 (1,A), b₁의 표지는 (1,B)이므로 a₁을 먼저 놓습니다. 그다음 (2,A), (3,B), (4,B), (5,A)를 놓으면 a₁, b₁, a₂, b₂, b₃, a₃라는 한 줄을 얻습니다. 이미 존재하는 선행 관계는 시계 값의 엄격한 증가 때문에 그대로 보존됩니다. 같은 과정 안에서는 값이 증가하므로 같은 숫자와 같은 서버 이름의 사건 둘이 생기지도 않습니다.

이 한 줄은 처리 순서를 결정하는 약속입니다. a₁이 b₁보다 실제로 먼저 일어났다는 새로운 관찰을 얻은 것은 아닙니다. 동률일 때 B를 먼저 놓기로 바꾸면 b₁, a₁부터 시작하는 줄도 가능합니다. 어느 약속을 쓰든 확실한 선행 관계를 뒤집지 않는지 확인하는 것이 이번 계산의 기준입니다.

생각그림 11 · 두 정보를 비교해 한 줄로 정렬관계와 추론 읽기
순번사건비교할 표지
1a₁(1,A)
2b₁(1,B)
3a₂(2,A)
4b₂(3,B)
5b₃(4,B)
6a₃(5,A)
A<B라는 동률 처리 약속을 사용했습니다. 이 표 자체가 실제 벽시계 순서를 입증하지는 않습니다.
원전 560–561쪽 Ordering the Events Totally. A<B 동률 약속과 여섯 사건의 정렬은 이 글의 구체적인 선택입니다.
사회자 · 독자의 질문

메시지가 먼저 도착한 순서대로 예약을 처리하면 어떤 문제가 생기나요? 각 서버에서 보낸 예약을 중앙 접수처 S가 받는다고 해 볼게요. S에 먼저 도착한 것을 먼저 처리하면 훨씬 간단하지 않을까요?

레슬리 램포트 · 원전 기반 재구성

이번 질문만 세 과정 A, B, S를 둔 새 사례를 사용하겠습니다. A가 요청 Rₐ를 S로 보낸 뒤, B에게 ‘요청을 보냈다’는 알림 H를 보냅니다. B는 H를 받은 다음 요청 Rᵦ를 S로 보냅니다. 이 기록에는 Rₐ 전송→H 전송→H 수신→Rᵦ 전송이라는 선행 경로가 있습니다.

전송 구간마다 지연이 다르면 Rₐ가 S로 가는 동안 H가 B에 도착하고, 이어 Rᵦ가 S에 먼저 도착할 수 있습니다. A에서 S로 가는 길과 B에서 S로 가는 길이 다르므로, 보내는 순서와 중앙 접수처의 도착 순서가 달라질 수 있는 것입니다. 이것은 같은 발신자·수신자 사이의 메시지 순서를 보존한다는 조건과도 양립합니다.

요청에 붙은 논리시계 값을 예로 Rₐ=1, H 전송=2, H 수신=3, Rᵦ=4로 정하면 원래 선행 관계가 숫자에 남습니다. S가 Rᵦ를 먼저 받았다고 해서 Rₐ보다 먼저 발행된 요청이라고 판단하면 이 경로를 놓칩니다. 어떤 순서의 공정성을 지킬 것인지 먼저 정하고, 그 순서를 판단할 기록을 보관해야 합니다.

생각그림 12 · 전송 관계와 접수처 도착을 따로 읽기관계와 추론 읽기
발행의 선행 관계
A의 요청 Rₐ
전송 값 1
알림 H
A 전송 2 → B 수신 3
B의 요청 Rᵦ
전송 값 4
접수처 S에서 받은 순서
먼저 도착
Rᵦ · 붙어 온 값 4
나중 도착
Rₐ · 붙어 온 값 1
서로 다른 통신 경로의 지연 때문에 접수 순서가 바뀔 수 있습니다. 발행 사이에 확인한 Rₐ → Rᵦ 관계는 그대로입니다.
H를 매개로 Rₐ 전송이 Rᵦ 전송에 선행합니다. 두 요청의 네트워크 지연을 다르게 둔 교육용 예시입니다.
원전 560–561쪽 요청 순서 논의. A·B·S의 세 과정, 알림 H, 수치 1·2·3·4와 도착 순서는 새 교육용 예시입니다.
사회자 · 독자의 질문

내 요청이 대기표의 맨 앞이면 곧바로 처리해도 되나요? 논리시계 순으로 줄을 세웠으니, 이제 각 서버가 자기 대기표의 맨 앞 요청을 처리하면 되겠네요?

레슬리 램포트 · 원전 기반 재구성

마지막 한 자리를 두 서버가 함께 내주지 않으려면, 한 번에 한 과정만 그 자원을 다루도록 정할 수 있습니다. 이를 상호배제라고 합니다. 자기 대기표만 보고 시작하면 아직 전달되지 않은 더 앞선 요청을 놓칠 수 있습니다. 원전의 절차는 자기 요청이 자기 대기열에서 가장 앞선다는 조건에, 다른 모든 과정으로부터 자기 요청 시각보다 나중인 메시지를 받았다는 조건을 함께 둡니다.

이 설명에서는 고정된 참여자들이 서로 직접 통신하고, 같은 두 과정 사이에서 메시지가 전송 순서대로 도착하며, 전송한 메시지는 결국 도착한다고 가정합니다. 요청·응답·해제 메시지를 주고받아 각자의 대기열을 갱신하는 원전 절차의 일부를 살펴보는 것입니다. 이 글의 점검은 그중 진입 조건 두 개에 초점을 맞춥니다.

교육용 점검 사례를 하나 보겠습니다. 참여자는 A, B, C이며 동률 약속은 A<B<C입니다. A의 요청은 (5,A)이고, A가 확인한 대기열에는 (5,A), (5,B)가 있습니다. A의 요청은 맨 앞입니다. B에서 마지막으로 받은 메시지의 값은 6이지만, C에서 받은 값은 아직 4입니다. C가 값 5보다 앞선 요청을 보냈는데 A가 아직 받지 못했을 가능성을 이 기록만으로 닫을 수 없으므로 기다립니다.

C에서 값 6인 메시지를 받았고 그 앞 메시지도 순서대로 모두 받았다면, 이 점검의 두 조건을 만족합니다. 반대로 C의 값이 6이어도 대기열 앞에 (4,B)가 남아 있으면 기다립니다. 아래 세 번째 실험은 이 두 조건을 계산하는 도구입니다. 실제 네트워크의 전체 상호배제 절차를 구현하거나 장애 복구까지 검증하는 도구로 표시하지 않습니다.

생각그림 13 · 처리 가능 조건 두 개를 함께 확인관계와 추론 읽기
상황 1 · A가 앞이지만 C의 이후 메시지가 없음
대기열: (5,A) → (5,B)

B에서 받은 마지막 값 6, C에서 받은 마지막 값 4.

대기 · C의 4는 요청 값 5보다 작습니다.
상황 2 · C의 값 6까지 받음
대기열: (5,A) → (5,B)

B와 C에서 받은 마지막 값이 모두 6입니다.

명시한 두 조건 충족 · A가 맨 앞, 6 > 5.
상황 3 · 더 앞선 B의 요청이 남음
대기열: (4,B) → (5,A)

B와 C의 마지막 값이 6이어도 (4,B)가 앞에 남습니다.

대기 · A가 대기열 맨 앞이 아닙니다.
A5는 (5,A)를 줄여 쓴 표기입니다. 조건 충족 판정은 본문에 명시한 통신·참여자 가정을 전제로 합니다.
원전 561쪽의 상호배제 절차와 진입 조건. A의 요청 값 5, 대기열과 마지막 메시지 값은 교육용 상태 점검이며 전체 통신 절차 구현은 아닙니다.
직접 실험 3 · 대기열과 이후 메시지 함께 확인조건을 바꾸어 계산하기

A의 요청 값 5를 기준으로 맨 앞 조건과 모든 상대의 이후 메시지 조건을 함께 계산합니다. 고정 참여자와 순서 보존 통신을 전제로 합니다.

A의 요청은 (5,A), 동률 약속은 A<B<C입니다. 기본 대기열은 (5,A) → (5,B)입니다.

체크하면 대기열을 (4,B) → (5,A)로 바꿉니다. 이 실험은 본문에 명시한 통신 가정 아래 진입 조건만 계산합니다.

기본값으로 따라 읽기

기본 상태는 A가 대기열 맨 앞이고 B의 마지막 값은 6, C의 마지막 값은 4입니다. C의 값이 5보다 크지 않아 A는 기다립니다. C도 6이면 두 조건을 만족합니다.

이 실험은 본문에 명시한 유한한 사례를 계산합니다. 조작 결과와 그 이유를 함께 확인하세요.
사회자 · 독자의 질문

어떤 기록이 빠지면 판단의 범위가 달라지나요? 사람들은 먼저 한 일을 알고 있는데 컴퓨터 기록에는 나타나지 않는 경우도 있겠어요. 컴퓨터가 멈춰서 메시지를 보내지 않는 경우도 있고요.

레슬리 램포트 · 원전 기반 재구성

서버 A에서 접수한 사람이 접수증을 들고 B의 담당자에게 가서 다음 신청을 부탁했다고 해 봅시다. 서버 사이의 메시지만 모은 기록에는 사람이 종이를 전달한 사건이 빠져 있을 수 있습니다. 그 좁은 모형에서 두 신청 사이의 길을 찾지 못했다고 해서, 현실에서도 아무 전달이 없었다고 결론내리면 안 됩니다. 모형에 어떤 사건과 전달을 포함했는지가 판단의 범위를 결정합니다.

그 선행 관계를 서비스가 지켜야 한다면 접수증의 식별자나 앞선 요청의 값을 다음 신청에 함께 전달하는 방법을 생각할 수 있습니다. 새 기록이 들어오면 후속 사건이 앞선 값 뒤에 놓이도록 계산해야 합니다. 관찰하지 않은 경로를 추측으로 채우는 대신, 필요한 정보를 실제로 기록하는 설계입니다.

또한 13번의 기다리기 조건은 모든 참여자의 응답을 필요로 합니다. 한 과정이 계속 응답하지 않으면 다음 처리가 멈출 수 있습니다. 안전한 순서를 지킨다는 성질과, 어떤 장애가 생겨도 계속 진행한다는 성질은 각각의 조건을 확인해야 합니다. 이번 실험은 메시지 값과 대기열 조건을 다루며, 임의의 고장 속에서도 진행을 보장하지 않습니다.

생각그림 14 · 판정 전에 확인할 모형의 범위관계와 추론 읽기
상황확인할 정보추가 과제
사람이 접수증을 전달함서버 밖 전달 경로선행 요청 정보를 후속 신청에 기록
한 과정의 메시지가 오지 않음전달 지연·과정 응답장애와 지연을 다루는 별도 절차
벽시계 순서가 필요함시계 오차·전달 시간 조건물리시계 동기화의 조건 확인
원전은 외부 사건과 물리시계도 따로 논의합니다. 이번 계산의 범위는 명시한 사건 모형과 정수 논리시계입니다.
원전 561–562쪽 고장에 따른 정지와 Anomalous Behavior, 562–565쪽 Physical Clocks 및 부록의 적용 범위. 접수증 사례는 편집부 구성입니다.
사회자 · 독자의 질문

처음의 여섯 사건으로 돌아가면, 무엇을 정확히 말할 수 있나요? 처음에는 시각 숫자만 보면 순서가 모두 정해질 거라고 생각했어요. 지금 사례를 세 가지 질문으로 다시 확인해 보고 싶습니다.

레슬리 램포트 · 원전 기반 재구성

첫째, a₂가 a₃에 선행하는가? 그렇습니다. 같은 과정의 기록으로도 알 수 있고, a₂→b₂→b₃→a₃라는 왕복 메시지 경로로도 확인합니다. 그 길에 붙은 값은 2<3<4<5입니다. 사건 경로와 숫자 계산이 같은 방향을 지킵니다.

둘째, 값 1인 b₁이 값 2인 a₂에 선행하는가? 현재 모형에서는 양방향 경로가 모두 없습니다. 수의 크기 관계 1<2를 선행 관계로 바꿀 근거가 없습니다. 셋째, a₁과 b₁을 한 줄로 정렬할 수 있는가? A<B라는 동률 약속을 쓰면 a₁을 앞에 놓을 수 있습니다. 그 결과는 우리가 정한 처리 순서이며 두 사건의 벽시계 순서를 새로 알아낸 결과로 해석하지 않습니다.

이렇게 읽으면 기록에서 얻은 관계, 관계를 보존하는 숫자, 업무 처리를 위해 덧붙인 약속이 각각 어떤 일을 하는지 드러납니다. 원전의 정의를 실제 여섯 사건에 적용하고, 가능한 추론과 성립하지 않는 역추론을 하나씩 확인한 것입니다. 세 실험에서 사건 쌍과 수신 값을 바꾸어 같은 이유가 계속 성립하는지 확인할 수 있습니다.

생각그림 15 · 세 질문의 답과 근거관계와 추론 읽기
질문답근거
a₂→a₃인가요?예메시지 경로 a₂→b₂→b₃→a₃
b₁→a₂인가요?현재 모형에서 성립하지 않음값은 1<2지만 연결 경로 없음
a₁을 b₁ 앞에 처리할 수 있나요?A<B 약속에서 가능같은 값 1을 서버 순서로 구별
경로의 증거, 숫자의 조건, 처리 약속을 각각 확인합니다.
원전의 선행 관계·시계 조건·전체순서를 여섯 사건에 다시 적용한 종합 풀이입니다. 새로운 일반 정리를 제시하지 않습니다.

함께 읽은 원전

원전의 주장, 현대적인 표기와 교육용 사례를 각 문답의 출처 메모에서 구분했습니다.

  1. Leslie Lamport (1978), Time, Clocks, and the Ordering of Events in a Distributed System [분산 시스템의 시간, 시계, 사건의 순서], Communications of the ACM 21(7), 558–565 ↗

    저자가 공개한 8쪽 원전. 559쪽 사건 선행 관계, 560쪽 시계 조건·IR1/IR2, 561–562쪽 전체순서·상호배제·외부 사건, 563–565쪽 물리시계와 부록을 구별해 읽었습니다. 원전의 그림과 긴 본문은 복제하지 않았습니다.

  2. 레슬리 램포트, The Writings of Leslie Lamport [레슬리 램포트의 저술 목록], 제27번 논문 ↗

    논문 목록과 저자의 연구 경력 확인. 이 글의 대담을 실제 발언으로 보증하는 자료가 아닙니다.

  3. Microsoft Research, Time, Clocks and the Ordering of Events in a Distributed System ↗

    발행연도, 학술지 권·호와 558–565쪽의 서지 사항 확인.

국가 분류의 근거: 원전 첫 쪽은 Massachusetts Computer Associates를 소속으로 표시하며, 저자 주소를 SRI International, Menlo Park, California로 기록한다. 미국편 분류는 이 연구 활동 장소에 근거한다.

편집 · LTCT KOREA. 문헌 기반의 학습용 대담이며 실제 인터뷰를 기록한 글이 아닙니다.