CLOCK_REALTIME
representa la mejor estimación de la máquina en cuanto al reloj de pared actual, la 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 cambia el reloj de la hora del día del sistema, incluido el NTP.
CLOCK_MONOTONIC
representa el tiempo absoluto transcurrido del reloj de pared desde un punto fijo arbitrario en el pasado. No se ve afectado por los cambios en el reloj de 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 dedicado a la suspensión, aunque según la definición POSIX debería hacerlo. Puede usar el específico CLOCK_BOOTTIME
de Linux para un reloj monótono que se sigue ejecutando durante la suspensión.
CLOCK_MONOTONIC
Sería la mejor opción en ese escenario? por ejemplo, sistema de misiles PatriotEl libro de Robert Love, LINUX System Programming 2nd Edition , aborda específicamente su pregunta al comienzo del Capítulo 11, página 363:
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 realizar una calibración periódica para poder estimar la deriva.
fuente
CLOCK_REALTIME
se ve afectado por NTP y puede moverse hacia adelante y hacia atrás.CLOCK_MONOTONIC
no lo es, y avanza a una marca por marca.fuente
System.nanoTime()
usaCLOCK_MONOTONIC
y puede medir duraciones de 1000ns o menos. ¿Quizás está pensando en la hora del sistema, que a veces se limita a milisegundos?Además de la respuesta de Ignacio ,
CLOCK_REALTIME
puede avanzar hacia adelante a pasos agigantados y, ocasionalmente, hacia atrás.CLOCK_MONOTONIC
tampoco lo hace; simplemente sigue avanzando (aunque probablemente se restablece al reiniciar).Una aplicación robusta debe ser capaz de tolerar
CLOCK_REALTIME
saltos hacia adelante 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 adelante después del currículum,CLOCK_MONOTONIC
no lo hace. Pruébalo en una máquina virtual.fuente
CLOCK_PROCESS_CPUTIME_ID
. Prueba rápida:$ perl -w -MTime::HiRes=clock_gettime,CLOCK_MONOTONIC -E 'say clock_gettime(CLOCK_MONOTONIC)'
-> 706724.117565279. Ese número coincide con el tiempo de actividad del sistema en Linux, pero el estándar dice que es arbitrario.CLOCK_MONOTONIC
detiene durante una suspensión / reanudación sea conforme con POSIX. Se supone que es el tiempo desde un punto fijo en el pasado, pero detener el reloj por suspender / reanudar rompe eso.POSIX 7 citas
POSIX 7 especifica ambos en http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html :
CLOCK_REALTIME
:CLOCK_MONOTONIC
(característica opcional):clock_settime()
da una pista importante: los sistemas POSIX pueden cambiar arbitrariamenteCLOCK_REALITME
con él, así que no confíes en que fluya de manera continua ni hacia adelante. NTP podría implementarse usandoclock_settime()
, y solo podría afectarCLOCK_REALITME
.La implementación del kernel de Linux parece tomar tiempo de arranque como la época para
CLOCK_MONOTONIC
: Punto de partida para CLOCK_MONOTONICfuente
Lo sentimos, no hay reputación para agregar esto como un comentario. Entonces va como una respuesta complementaria.
Dependiendo de la frecuencia con la que llame
clock_gettime()
, debe tener en cuenta que solo algunos de los "relojes" son proporcionados por Linux en el VDSO (es decir, no requieren una llamada al sistema con todos los gastos generales de uno), que solo empeoró cuando se agregó Linux las defensas para proteger contra ataques similares a Spectre).Si bien
clock_gettime(CLOCK_MONOTONIC,...)
,clock_gettime(CLOCK_REALTIME,...)
ygettimeofday()
siempre serán extremadamente rápidos (acelerados por el VDSO), esto no es cierto para, por ejemplo, CLOCK_MONOTONIC_RAW o cualquiera de los otros relojes POSIX.Esto puede cambiar con la versión del kernel y la arquitectura.
Aunque la mayoría de los programas no necesitan prestar atención a esto, puede haber picos de latencia en los relojes acelerados por el VDSO: si los golpea justo cuando el núcleo está actualizando el área de memoria compartida con los contadores de reloj, tiene que esperar a que grano para terminar.
Aquí está la "prueba" (GitHub, para mantener a los bots alejados de kernel.org): https://github.com/torvalds/linux/commit/2aae950b21e4bc789d1fc6668faf67e8748300b7
fuente
CLOCK_REALTIME
: Tiempo absoluto (p. Ej. 01/07/2020)CLOCK_MONOTONIC
: Tiempo relativo (p. Ej., 5 segundos a partir de ahora o hace 10 minutos)fuente