¿Diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC?
¿ Podría explicar la diferencia entre CLOCK_REALTIME
los CLOCK_MONOTONIC
relojes devueltos clock_gettime()
en Linux?
¿Cuál es una mejor opción si necesito calcular el tiempo transcurrido entre las marcas de tiempo producidas por una fuente externa y la hora actual?
Por último, si tengo un demonio NTP que ajusta periódicamente la hora del sistema, ¿cómo interactúan estos ajustes con cada uno de CLOCK_REALTIME
y CLOCK_MONOTONIC
?
CLOCK_REALTIME
representa la mejor estimación de la máquina en cuanto a la hora actual del reloj de pared. Como dicen Ignacio y MarkR , esto significa que CLOCK_REALTIME
puede saltar hacia adelante y hacia atrás a medida que cambia la hora del sistema, incluso por NTP.
CLOCK_MONOTONIC
representa el tiempo absoluto transcurrido en el reloj de pared desde algún punto fijo y arbitrario en el pasado. No se ve afectado por los cambios en la hora del día del sistema.
Si desea calcular el tiempo transcurrido entre dos eventos observados en una máquina sin un reinicio intermedio, CLOCK_MONOTONIC
es la mejor opción.
Tenga en cuenta que en Linux, CLOCK_MONOTONIC
no mide el tiempo transcurrido en suspensión, aunque según la definición de POSIX debería hacerlo. Puede utilizar el reloj específico de Linux CLOCK_BOOTTIME
para un reloj monótono que sigue funcionando durante la suspensión.
El libro de Robert Love Programación del sistema LINUX, segunda edición , aborda específicamente su pregunta al comienzo del Capítulo 11, página 363:
El aspecto importante de una fuente de tiempo monótona NO es el valor actual, sino la garantía de que la fuente de tiempo aumenta estrictamente linealmente y, por lo tanto, es útil para calcular la diferencia de tiempo entre dos muestreos.
Dicho esto, creo que está asumiendo que los procesos se ejecutan en la misma instancia de un sistema operativo, por lo que es posible que desee ejecutar una calibración periódica para poder estimar la deriva.
CLOCK_REALTIME
se ve afectado por NTP y puede moverse hacia adelante y hacia atrás. CLOCK_MONOTONIC
no lo es, y avanza a un tic por tic.