versiones pagina oficial núcleo historia linux

pagina - linux versiones



¿Diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC? (5)

Además de la respuesta de Ignacio , CLOCK_REALTIME puede avanzar en saltos, y ocasionalmente al revés. CLOCK_MONOTONIC no hace ninguno; simplemente sigue adelante (aunque probablemente se restablezca al reiniciar).

Una aplicación robusta debe ser capaz de tolerar CLOCK_REALTIME saltando hacia delante ocasionalmente (y quizás hacia atrás muy levemente muy ocasionalmente, aunque eso es más un caso marginal).

Imagine lo que sucede cuando suspende su computadora portátil: CLOCK_REALTIME salta hacia delante siguiendo el currículum, CLOCK_MONOTONIC no lo hace. Pruébalo en una VM.

¿Podría explicar la diferencia entre los relojes CLOCK_REALTIME y CLOCK_MONOTONIC devueltos por 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 daemon NTP que ajusta periódicamente el tiempo del sistema, ¿cómo interactúan estos ajustes con cada uno de CLOCK_REALTIME y CLOCK_MONOTONIC ?


El libro de Robert Love, Programación de Sistemas 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 monotónica NO es el valor actual, sino la garantía de que la fuente de tiempo es estrictamente lineal 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 están ejecutando 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 representa la mejor estimación de la máquina en cuanto al reloj de pared actual, hora del día. Como dicen Ignacio y MarkR , esto significa que CLOCK_REALTIME puede saltar hacia adelante y hacia atrás a medida que se cambia el reloj de la hora del sistema, incluido el NTP.

CLOCK_MONOTONIC representa el tiempo absoluto de reloj de pared transcurrido desde algún punto arbitrario y fijo en el pasado. No se ve afectado por los cambios en el reloj del sistema de hora del día.

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.


CLOCK_REALTIME se ve afectado por NTP, y puede moverse hacia adelante y hacia atrás. CLOCK_MONOTONIC no lo es, y avanza con un tic por tick.


POSIX 7 especifica ambos en http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html :

CLOCK_REALTIME :

Este reloj representa el reloj que mide el tiempo real del sistema. Para este reloj, los valores devueltos por clock_gettime () y especificados por clock_settime () representan la cantidad de tiempo (en segundos y nanosegundos) desde la Época.

CLOCK_MONOTONIC (función opcional):

Para este reloj, el valor devuelto por clock_gettime () representa la cantidad de tiempo (en segundos y nanosegundos) desde un punto no especificado en el pasado (por ejemplo, el tiempo de inicio del sistema o la Época). Este punto no cambia después del tiempo de inicio del sistema. El valor del reloj CLOCK_MONOTONIC no puede establecerse a través de clock_settime ().

clock_settime() da una pista importante: los sistemas POSIX pueden cambiar arbitrariamente CLOCK_REALITME con él, así que no confíe en que no fluya ni continuamente ni hacia adelante. NTP podría implementarse utilizando clock_settime() y solo podría afectar a CLOCK_REALITME .

La implementación del kernel de Linux parece tomar el tiempo de arranque como la época de CLOCK_MONOTONIC : punto de inicio para CLOCK_MONOTONIC