컴퓨터 시스템의 __시간 계산(Timekeeping)__은 하드웨어와 OS 커널이 협력하여 이루어지는 매우 정교한 과정이다. NTP나 PTP 같은 네트워크 동기화 프로토콜이 없더라도, PC는 스스로 시간을 흐르게 할 수 있다.
현대 x86_64 시스템이 시간을 관리하는 핵심 원리를 하드웨어 클럭 소스와 커널의 보정 메커니즘 관점에서 설명한다.
컴퓨터 메인보드에는 일정한 주파수로 진동(Oscillation)하며 "심장 박동"을 만들어내는 장치들이 존재한다.
TSC (Time Stamp Counter): 가장 빠르고 정밀하다. CPU 내부의 레지스터로, CPU 클럭 사이클마다 1씩 증가한다. 과거에는 CPU 속도 가변(SpeedStep 등)이나 멀티코어 간 오차 문제로 불안정했으나, 현대 CPU(Nehalem 이후)는 Constant TSC와 Invariant TSC 기능을 통해 CPU 속도가 변해도 일정한 속도로 증가하도록 보장한다.
HPET (High Precision Event Timer): 가장 신뢰성이 높다. 메인보드 칩셋에 별도로 존재하는 고정밀 타이머이다. 약 14.3MHz 이상의 주파수로 동작하며, CPU 상태와 무관하게 안정적인 시간을 제공한다. 하지만 TSC보다 읽는 속도가 느리다(I/O 오버헤드).
RTC (Real Time Clock): 전원이 꺼져도 유지된다. 메인보드의 동전 배터리(CMOS 배터리)로 유지되는 시계이다. 정밀도는 매우 낮지만(초 단위), 컴퓨터가 꺼졌다가 켜질 때 "지금이 몇 년 몇 월 며칠인지" 알려주는 초기값 역할을 한다.
리눅스 커널은 부팅 시 RTC에서 초기 시각을 읽어온 뒤, 이후부터는 __TSC(또는 HPET)__의 틱(Tick)을 세어서 시간을 더해 나간다.
2026-01-04 14:00:00을 읽어온다.__"보정을 하더라도 일정 간격으로 균일하게 흐름을 만들어내는 방법"__은 바로 adjtimex 시스템 콜과 __클럭 주파수 미세 조정(Slewing)__에 있다.
하드웨어 오실레이터(수정 진동자)는 온도나 전압에 따라 미세하게 빨라지거나 느려진다. 하루에 몇 초씩 오차가 생기는 이유이다.
NTP나 PTP가 외부 서버와 시간을 비교했을 때, "내 시계가 5ms 느리다"고 판단했다고 가정한다.
커널은 __mult (Multiplier)__와 __shift__라는 변수를 사용해 TSC 틱을 나노초로 변환한다.
NTP/PTP 데몬은 커널에게 __"지금부터 시계를 조금 빨리 가게 하라"__고 명령(adjtimex)한다. 그러면 커널은 이 mult 값을 아주 미세하게 조정한다. 결과적으로 물리적인 1초 동안 논리적인 시간은 1.0005초가 흐르게 되어, 자연스럽게 오차를 따라잡는다.
이것이 현대 컴퓨터가 끊김 없이 매끄러운 시간 흐름을 유지하면서도 정확한 시간을 맞추는 비결이다.
NTP (Network Time Protocol) v4를 사용하는 일반적인 환경(LAN/WAN)에서 기대할 수 있는 오차 범위는 다음과 같다.
NTP의 동작 원리와 알고리즘은 __RFC 5905 (NTPv4 Specification)__에 정의되어 있지만, "이 정도 오차여야 한다"는 __법적/강제적 임계값(Threshold)__을 RFC가 규정하지는 않는다. 오차는 네트워크 환경에 종속적이기 때문이다.
하지만 금융권이나 산업 표준에서는 별도의 요구사항을 정의하기도 한다.
유럽 금융 규제인 MiFID II는 고빈도 매매(HFT) 시스템에 대해 매우 엄격한 기준을 제시한다.
만약 1ms 미만, 특히 마이크로초(µs) 단위의 정밀도가 필요하다면 NTP 대신 __PTP (IEEE 1588)__를 사용해야 한다.