2011-02-09 10 views
6

Si obtengo el tiempo usando clock_gettime (CLOCK_MONOTONIC, x), luego call yield (p. Ej. Sched_yield()), luego obtengo el tiempo CLOCK_MONOTONIC nuevamente, la diferencia en veces incluirá el tiempo que el programa no estuvo en ejecución (habiendo cedido) , o CLOCK_MONOTONIC solo rastrea el tiempo durante el cual el programa se está ejecutando? Mis pruebas parecen implicar lo último, pero me gustaría saberlo con certeza.¿El proceso CLOCK_MONOTONIC (o hilo) es específico?

Además, si CLOCK_MONOTONIC no incluye el tiempo cedido, ¿hay otro temporizador monotónico (es decir, uno no sujeto a saltos causados ​​por ntp) que lo haga?

Respuesta

8

La respuesta Maxim y los comentarios respondieron a la segunda parte de su pregunta, creo. Para ampliar la respuesta a la primera parte, afirma POSIX 2008

If the Monotonic Clock option is supported, all implementations shall support a clock_id of CLOCK_MONOTONIC defined in <time.h>. This clock represents the monotonic clock for the system. For this clock, the value returned by clock_gettime() represents the amount of time (in seconds and nanoseconds) since an unspecified point in the past (for example, system start-up time, or the Epoch). This point does not change after system start-up time.

En particular, tenga en cuenta "el reloj monótona para el sistema". Es decir, por sistema y no por proceso, sigue funcionando aunque su proceso no se esté ejecutando. Además, "Este punto no cambia después de la hora de inicio del sistema", lo que nuevamente implica que sigue funcionando independientemente de si un proceso en particular se está ejecutando o está durmiendo.

Por lo tanto, o ha encontrado un error en la implementación de Linux, o más probablemente, en su programa de prueba.

4

La única diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC es que no se puede establecer esta última. Estos relojes siguen funcionando incluso cuando el proceso no se está ejecutando.

http://www.opengroup.org/onlinepubs/009604599/functions/clock_getres.html

Nota que el valor absoluto del reloj monotónica no tiene sentido (porque su origen es arbitraria), y por lo tanto no hay necesidad para configurarlo. Además, las aplicaciones en tiempo real pueden confiar en el hecho de que el valor de este reloj nunca se establece y, por lo tanto, los intervalos de tiempo medidos con este reloj no se verán afectados por las llamadas a clock_settime().

En Linux, sorprendentemente, CLOCK_MONOTONIC parece verse afectado por los ajustes de NTP, por lo que podría ir hacia atrás. Por lo tanto, agregaron otro reloj CLOCK_MONOTONIC_RAW:

hombre clock_gettime

CLOCK_MONOTONIC_RAW (desde la versión 2.6.28; específica de Linux) Al igual que en CLOCK_MONOTONIC, sino que proporciona acceso a una época basada en hardware prima que no está sujeta a Ajustes NTP.

+3

Creo que los ajustes de NTP que se mencionan se refieren a la * tasa * del reloj que avanza, no a los saltos ('CLOCK_MONOTONIC' no saltará hacia atrás). Sin embargo, tenga en cuenta que 'CLOCK_MONOTONIC' se detiene mientras la máquina está suspendida, si eso es importante. – caf

+3

No, CLOCK_MONOTONIC no retrocede en Linux. NTP ajusta el tiempo mediante un cambio de paso solo si está desactivado en más de 1/2 segundo, el reloj monótono no se ve afectado por esto. Para ajustes más pequeños, NTP ajusta el reloj a lo largo del tiempo cambiando ligeramente la frecuencia de tic del reloj, y CLOCK_MONOTONIC se ve afectado por esto. Pero la tasa de tics nunca será negativa. – janneb

+0

Esto no responde completamente a mi pregunta: sé que se detiene mientras la máquina está suspendida, pero ¿se detiene cuando se suspende el _proceso_? – Benubird

Cuestiones relacionadas