CLOCK_REALTIME
je ovlivněna NTP a může se pohybovat vpřed a vzad. CLOCK_MONOTONIC
není a postupuje jedním tikem na tik.
Kniha Roberta Lovea LINUX System Programming 2nd Edition , konkrétně se zabývá vaší otázkou na začátku kapitoly 11, str. 363:
Důležitým aspektem monotónního zdroje času NENÍ aktuální hodnota, ale záruka, že zdroj času se striktně lineárně zvyšuje, a je tedy užitečný pro výpočet rozdílu v čase mezi dvěma odběry
To znamená, že se domnívám, že předpokládá, že procesy běží na stejné instanci operačního systému, takže možná budete chtít mít spuštěnou pravidelnou kalibraci, abyste mohli odhadnout drift.
CLOCK_REALTIME
představuje nejlepší odhad stroje, pokud jde o aktuální nástěnné hodiny, denní čas. Jak říkají Ignacio a MarkR, znamená to, že CLOCK_REALTIME
může přeskakovat vpřed a vzad podle toho, jak se mění systémová denní doba, včetně NTP.
CLOCK_MONOTONIC
představuje absolutní uplynulý čas nástěnných hodin od nějakého libovolného pevného bodu v minulosti. Není ovlivněn změnami systémových denních hodin.
Pokud chcete vypočítat čas, který uplynul mezi dvěma událostmi pozorovanými na jednom počítači, aniž byste museli restartovat, CLOCK_MONOTONIC
je nejlepší možnost.
Všimněte si, že v systému Linux CLOCK_MONOTONIC
neměří čas strávený v režimu spánku, ačkoli podle definice POSIX by měl. Můžete použít pro Linux specifický CLOCK_BOOTTIME
pro monotónní hodiny, které běží během pozastavení.
Uvozovky POSIX 7
POSIX 7 specifikuje obojí na http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html:
CLOCK_REALTIME
:
Tyto hodiny představují hodiny měřící reálný čas systému. Pro tyto hodiny představují hodnoty vrácené funkcí clock_gettime() a určené funkcí clock_settime() množství času (v sekundách a nanosekundách) od Epochy.
CLOCK_MONOTONIC
(volitelná funkce):
Hodnota vrácená funkcí clock_gettime() pro tyto hodiny představuje množství času (v sekundách a nanosekundách) od nespecifikovaného bodu v minulosti (například čas spuštění systému nebo Epocha). Tento bod se po době spuštění systému nezmění. Hodnotu hodin CLOCK_MONOTONIC nelze nastavit pomocí clock_settime().
clock_settime()
dává důležitou nápovědu:systémy POSIX jsou schopny libovolně měnit CLOCK_REALITME
s ním, takže se nespoléhejte na to, že proudí ani nepřetržitě, ani dopředu. NTP lze implementovat pomocí clock_settime()
a může ovlivnit pouze CLOCK_REALTIME
.
Zdá se, že implementace linuxového jádra bere zaváděcí čas jako epochu pro CLOCK_MONOTONIC
:Výchozí bod pro CLOCK_MONOTONIC