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

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

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

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



답변

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

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

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

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


답변

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

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

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


답변

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


답변

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

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

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


답변

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의 시작점


답변

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

당신이 호출 빈도에 따라 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


답변