CLOCK_REALTIME과 CLOCK_MONOTONIC의 차이점은 무엇입니까?


206

리눅스에서 반환되는 클럭 CLOCK_REALTIME과 의 차이점을 설명해 주 시겠습니까?CLOCK_MONOTONICclock_gettime()

외부 소스에서 생성 된 타임 스탬프와 현재 시간 사이의 경과 시간을 계산해야하는 경우 더 나은 선택은 무엇입니까?

마지막으로, 시스템 시간을 정기적으로 조정하는 NTP 데몬이있는 경우 이러한 조정은 각각 CLOCK_REALTIMECLOCK_MONOTONIC?

답변:


238

CLOCK_REALTIME는 현재 벽시계, 시간과 관련하여 기계의 최고의 추측을 나타냅니다. 으로 이그나시오MarkR는 말,이 수단 CLOCK_REALTIME시스템 시간 시계로 앞뒤로 이동할 수는 NTP가 포함 변경됩니다.

CLOCK_MONOTONIC는 과거의 임의의 고정 지점 이후의 절대 경과 벽시계 시간을 나타냅니다. 시스템 시간 시계의 변경에 영향을받지 않습니다.

시스템을 재부팅하지 않고 한 시스템에서 관찰 된 두 이벤트 사이의 경과 시간을 계산 CLOCK_MONOTONIC하려면 가장 좋은 옵션입니다.

Linux에서는 CLOCK_MONOTONICPOSIX 정의에 따라 일시 중단에 소요 된 시간을 측정하지 않습니다. CLOCK_BOOTTIME일시 중지 중에 계속 실행되는 단조로운 시계에 Linux 관련 을 사용할 수 있습니다 .


11
최신 커널에서는 CLOCK_MONOTONIC_RAW를 사용할 수 있으며 NTP 조정이없는 것이 더 좋습니다.
Joseph Garvin

14
아마도 "더 나은"가치에 대한 @JosephGarvin — CLOCK_MONOTONIC_RAW는 백만 분의 일 (수백)에 의해 실시간으로 빠르게 또는 느리게 실행될 수 있으며 온도 또는 전압과 같은 환경 조건에 따라 속도가 달라질 수 있습니다. 가상 머신). 제대로 작동하는 컴퓨터에서 NTP는 이러한 모든 요소를 ​​완화하기 위해 최선을 다하므로 CLOCK_MONOTONIC는 실제 경과 시간을 더 가깝게 반영 합니다 .
hobbs December

23
물론 NTP의 주파수 오류 수정 노력에 영향을 받았지만 위상 오류 수정 노력에는 영향을받지 않는 CLOCK_MONOTONIC_PARBOILED를 갖는 것이 흥미로울 수 있지만, 의심스러운 이득에는 많은 복잡성이 있습니다.)
hobbs December

1
@hobbs가 제시하는 점이 마음에 듭니다. 클럭 드리프트의 영향을받을 수있는 프로그램이 걱정된다면 어떻게해야합니까? 시겠습니까 CLOCK_MONOTONIC이 시나리오에서 최선의 선택? 예 : 패트리어트 미사일 시스템
sjagr

3
CLOCK_REALTIME은 윤초의 영향을 받는다는 점도 언급해야합니다. 이것은 윤초가 삽입 될 때마다 두 번 타임 스탬프 생성 한다는 것을 의미합니다 . 지난 2012 년 6 월 30 일에 이런 일이 발생했으며 많은 소프트웨어 가 문제를 일으켰습니다 .
user1202136

38

Robert Love의 책 LINUX System Programming 2nd Edition 은 특히 ​​11 장 pg 363의 시작 부분에있는 질문을 다룹니다.

단조로운 시간 소스의 중요한 측면은 현재 값이 아니지만, 시간 소스가 엄격하게 선형으로 증가한다는 보장은 두 샘플링 간의 시간 차이 계산에 유용합니다

즉, 프로세스가 동일한 OS 인스턴스에서 실행되고 있다고 가정하므로 드리프트를 추정 할 수 있도록 주기적 보정을 실행하고 싶을 수도 있습니다.


25

CLOCK_REALTIMENTP의 영향을받으며 앞뒤로 이동할 수 있습니다. CLOCK_MONOTONIC틱당 1 틱씩 진행되지 않습니다.


15
CLOCK_MONOTONIC는 NTP의 시간 조정 (시간 선회)의 영향을받습니다. 그러나 점프하지 않습니다.
derobert

3
그러나 최신 커널에는 CLOCK_MONOTONIC_RAW가 있으며 NTP의 영향을받지 않습니다.
Joseph Garvin

1
"tick"-Linux / amd64에서 CPU 명령어가 얼마나 큰지 / 긴지 / 길고 있는가? 아니면 어디서 문서를 구할 수 있습니까?
kevinarpe

@kevinarpe 확실하지는 않지만 틱은 CPU 사이클이 아닌 몇 분의 1의 시간으로 정의되는 것 같습니다. 종종 1/100 초입니다.
Stéphane

@ 스테판 : 반드시 10ms보다 타이트해야합니다. Java를 System.nanoTime()사용 CLOCK_MONOTONIC하고 1000ns 이하의 지속 시간 을 측정 할 수 있다고 생각 합니다. 밀리 초로 제한되는 시스템 시간에 대해 생각하고 계십니까?
kevinarpe

20

뿐만 아니라 이그나시오의 대답은 , CLOCK_REALTIME가끔 뒤쪽으로 도약 앞으로 가서, 할 수 있습니다. CLOCK_MONOTONIC어느 것도하지 않습니다. 재부팅 할 때 재설정되지만 여전히 계속 진행합니다.

강력한 앱 CLOCK_REALTIME은 때때로 앞뒤로의 도약 을 견딜 수 있어야합니다 .

당신이 당신의 노트북을 중단 때 발생하는 상상 - CLOCK_REALTIME앞으로 이력서를 다음 점프, CLOCK_MONOTONIC하지 않습니다. VM에서 사용해보십시오.


3
프로그램이 시작되면 CLOCK_MONOTONIC는 0에서 시작합니다. 프로세스 간 사용이 아닙니다.
Benubird

18
@Benubird : 프로그램이 시작될 때 0에서 시작하지 않습니다. 그렇습니다 CLOCK_PROCESS_CPUTIME_ID. 빠른 테스트 : $ perl -w -MTime::HiRes=clock_gettime,CLOCK_MONOTONIC -E 'say clock_gettime(CLOCK_MONOTONIC)'-> 706724.117565279. 이 숫자는 Linux의 시스템 가동 시간과 일치하지만 표준은 임의적입니다.
derobert

4
제쳐두고, 나는 CLOCK_MONOTONIC일시 중지 / 재개를 중지 하는 Linux 동작 이 POSIX를 준수 한다고 믿지 않습니다 . 과거에는 고정 소수점 이후 시간 이었지만, 일시 중지 / 재개를 통해 클럭을 중지하면 문제가 해결됩니다.
caf

15

POSIX 7 인용문

POSIX 7은 http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html 에서 두 가지를 모두 지정합니다 .

CLOCK_REALTIME:

이 시계는 시스템의 실시간 측정 시계를 나타냅니다. 이 시계의 경우 clock_gettime ()에 의해 반환되고 clock_settime ()에 의해 지정된 값은 Epoch 이후의 시간 (초 및 나노초)을 나타냅니다.

CLOCK_MONOTONIC (옵션 기능) :

이 시계의 경우 clock_gettime ()에 의해 반환 된 값은 과거의 지정되지 않은 지점 이후의 시간 (초 및 나노초)을 나타냅니다 (예 : 시스템 시작 시간 또는 Epoch). 이 시점은 시스템 시작 시간 후에 변경되지 않습니다. CLOCK_MONOTONIC 클럭 값은 clock_settime ()을 통해 설정할 수 없습니다.

clock_settime()중요한 힌트를 제공합니다. POSIX 시스템은 임의로 변경할 수 CLOCK_REALITME있으므로 계속해서 또는 앞으로도 흐르는 시스템에 의존하지 마십시오. NTP는를 사용하여 구현할 수 있으며 clock_settime()영향을 줄 수 CLOCK_REALITME있습니다.

리눅스 커널 구현은 에포크처럼 부팅 시간 이 걸린 것CLOCK_MONOTONIC 같습니다 : CLOCK_MONOTONIC의 시작점


0

죄송합니다, 이것을 의견으로 추가해도 평판이 없습니다. 따라서 보완적인 답변으로갑니다.

당신이 호출 빈도에 따라 clock_gettime(), 만 있다는 사실을 숙지 일부 리눅스가 추가 된 경우에만 악화됐다 - VDSO 리눅스에서 제공하는 "시계"(의 즉 모든 하나의 오버 헤드를 시스템 콜을 필요로하지 않습니다 Spectre와 유사한 공격으로부터 보호하기위한 방어 기능).

하지만 clock_gettime(CLOCK_MONOTONIC,...), clock_gettime(CLOCK_REALTIME,...), 그리고 gettimeofday()항상 (VDSO에 의해 가속) 매우 빠른 될 예정이입니다 하지 , 예를 들어 CLOCK_MONOTONIC_RAW 또는 다른 POSIX 시계의 마찬가지.

이것은 커널 버전과 아키텍처에 따라 변경 될 수 있습니다.

대부분의 프로그램은이 점에주의를 기울일 필요는 없지만 VDSO에 의해 가속화 된 클럭의 지연 시간이 급증 할 수 있습니다. 커널이 클럭 카운터를 사용하여 공유 메모리 영역을 업데이트 할 때 바로 히트하면 커널을 완료합니다.

다음은 "증거"(GitHub, 봇을 kernel.org에서 멀리 유지)입니다 : https://github.com/torvalds/linux/commit/2aae950b21e4bc789d1fc6668faf67e8748300b7

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.