CLOCK_REALTIMErepresenta 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_REALTIMEpuede 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_MONOTONICrepresenta 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_MONOTONICes la mejor opción.
Tenga en cuenta que en Linux, CLOCK_MONOTONICno mide el tiempo dedicado a la suspensión, aunque según la definición POSIX debería hacerlo. Puede usar el específico CLOCK_BOOTTIMEde Linux para un reloj monótono que se sigue ejecutando durante la suspensión.
CLOCK_MONOTONICSerí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_REALTIMEse ve afectado por NTP y puede moverse hacia adelante y hacia atrás.CLOCK_MONOTONICno lo es, y avanza a una marca por marca.fuente
System.nanoTime()usaCLOCK_MONOTONICy 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_REALTIMEpuede avanzar hacia adelante a pasos agigantados y, ocasionalmente, hacia atrás.CLOCK_MONOTONICtampoco lo hace; simplemente sigue avanzando (aunque probablemente se restablece al reiniciar).Una aplicación robusta debe ser capaz de tolerar
CLOCK_REALTIMEsaltos 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_REALTIMEsalta hacia adelante después del currículum,CLOCK_MONOTONICno 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_MONOTONICdetiene 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_REALITMEcon é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