2011-02-09 17 views
6

Se ottengo il tempo utilizzando clock_gettime (CLOCK_MONOTONIC, x), quindi chiama yield (ad esempio sched_yield()), quindi ottieni di nuovo il tempo CLOCK_MONOTONIC, la differenza nei tempi includerà il tempo in cui il programma non è stato in esecuzione (dopo aver ceduto) oppure CLOCK_MONOTONIC tiene traccia solo del tempo durante il quale il programma è in esecuzione? I miei test sembrano implicare quest'ultimo, ma mi piacerebbe sapere per certo.Il processo CLOCK_MONOTONIC (o thread) è specifico?

Inoltre, se CLOCK_MONOTONIC non include il tempo erogato, c'è un altro timer monotonico (cioè uno non soggetto ai salti causati da ntp) che lo fa?

risposta

8

La risposta Maxim e i commenti a quella risposta alla seconda parte della tua domanda, credo. Ad ampliare la risposta per la prima parte, POSIX 2008 afferma

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.

In particolare, nota "l'orologio monotona per il sistema". Cioè, per sistema e non per processo, continua a ticchettare anche se il tuo processo non è in esecuzione. Inoltre, "Questo punto non cambia dopo il tempo di avvio del sistema.", Che implica di nuovo che continua a spuntare indipendentemente dal fatto che un determinato processo sia in esecuzione o inattivo.

Quindi, o avete trovato un bug nell'implementazione di Linux, o più probabilmente, nel vostro programma di test.

4

L'unica differenza tra CLOCK_REALTIME e CLOCK_MONOTONIC è che quest'ultimo non può essere impostato. Questi orologi spuntano anche quando il tuo processo non è in esecuzione.

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

noti che il valore assoluto del clock monotona è insignificante (perché la sua origine è arbitraria), e quindi non v'è alcuna necessità di impostare. Inoltre, le applicazioni in tempo reale possono fare affidamento sul fatto che il valore di questo orologio non è mai impostato e, pertanto, gli intervalli di tempo misurati con questo orologio non saranno influenzati dalle chiamate a clock_settime().

In Linux, sorprendentemente, CLOCK_MONOTONIC sembra essere ancora influenzato dalle regolazioni NTP, in modo che possa andare indietro. Quindi hanno aggiunto un altro CLOCK_MONOTONIC_RAW orologio:

uomo clock_gettime

CLOCK_MONOTONIC_RAW (a partire da Linux 2.6.28; Linux-specifico) Simile a CLOCK_MONOTONIC, ma fornisce l'accesso a un tempo grezzo basata su hardware che non è soggetto a Aggiustamenti NTP.

+3

Credo che quelle regolazioni NTP menzionate si riferiscono alla * velocità * dell'ora che avanza, non ai salti ('CLOCK_MONOTONIC' non salterà all'indietro). Nota però che 'CLOCK_MONOTONIC' si ferma mentre la macchina è sospesa, se questo è importante. – caf

+3

No, CLOCK_MONOTONIC non va indietro su Linux. L'NTP regola il tempo di un cambio di passo solo se è spento per più di 1/2 secondi, l'orologio monotono non è influenzato da questo. Per regolazioni minori, NTP regola l'orologio nel tempo modificando leggermente la frequenza di clock, e CLOCK_MONOTONIC è influenzato da questo. Ma il tasso di battito non sarà mai negativo. – janneb

+0

Questo non risponde alla mia domanda - so che si ferma mentre la macchina è sospesa, ma si ferma quando il processo è sospeso? – Benubird

Problemi correlati