Jak uzyskuje się mikrosekundowy czas linux gettimeofday () i jaka jest jego dokładność?

Czas zegara ściennego jest zwykle dostarczany przez systemy RTC. Zapewnia to głównie czasy do milisekundy i zazwyczaj ma ziarnistość 10-20 milisekund. Jednak rozdzielczość / ziarnistośćgettimeofday () jest częstezgłoszonebyć w zakresie kilku mikrosekund. Zakładam, że ziarnistość mikrosekund musi być pobierana z innego źródła.

W jaki sposób osiągnięto rozdzielczość / granularność mikrosekund gettimeofday ()?

Gdy część do milisekundy jest pobierana z zegara czasu rzeczywistego i fale mirrowe są pobierane z innego sprzętu, powstaje problem z fazowaniem dwóch źródeł. Te dwa źródła muszą byćsynchronized jakoś.

Jak odbywa się synchronizacja / fazowanie między tymi dwoma źródłami?

Edytować: Z tego, co przeczytałem w linkach dostarczonych przez amdn, szczególnie następującychIntel link, dodam tutaj pytanie:

Robigettimeofday() zapewnić rozdzielczość / ziarnistość w reżimie mikrosekundowym?

Edytuj 2: Podsumowując amdyodpowiedź z kilkoma wynikami czytania:

Linux używa zegara czasu rzeczywistego (RTC) tylko w czasie rozruchu do synchronizacji z licznikiem o wyższej rozdzielczości, i.g. licznik czasu (TSC). Po bagażnikugettimeofday() zwraca czas, który jest całkowicie oparty na wartości TSC i częstotliwości tego licznika. Wartość początkowa TSCfrequency jest korygowany / kalibrowany poprzez porównanie czasu systemowego z zewnętrznym źródłem czasu. Regulacja jest wykonywana / konfigurowana przezadjtimex () funkcjonować. Jądro obsługuje pętlę synchronizacji fazowej, aby zapewnić, że wyniki czasu są monotoniczne i spójne.

W ten sposób można to stwierdzićgettimeofday() ma rozdzielczość mikrosekundową. Biorąc pod uwagę, że bardziej nowoczesny licznik czasu działa w trybie GHz, możliwą do uzyskania rozdzielczość może stanowić reżim nanosekundowy. Dlatego ten znaczący komentarz

/**
407  * do_gettimeofday - Returns the time of day in a timeval
408  * @tv:         pointer to the timeval to be set
409  *
410  * NOTE: Users should be converted to using getnstimeofday()
411  */

może być znaleziony wLinux / kernel / time / timekeeping.c. Sugeruje to, że w późniejszym czasie prawdopodobnie będzie dostępna jeszcze wyższa rozdzielczość. Terazgetnstimeofday() jest dostępny tylko w przestrzeni jądra.

Jednak przeglądając cały zaangażowany kod, aby uzyskać prawidłowy, pokazuje sporo komentarzy na temat niepewności. Możliwe jest uzyskanie rozdzielczości mikrosekundowej. Funkcjagettimeofday() może nawet wykazywać ziarnistość w reżimie mikrosekundowym.Ale: Istnieją poważne błędy dotyczące jego dokładności, ponieważdrift częstotliwości TSC nie można dokładnie skorygować. Również złożoność kodu zajmującego się tą kwestią w Linuksie jest wskazówką, aby sądzić, że w rzeczywistości jest to zbyt trudne do uzyskania. Jest to szczególnie spowodowane, ale nie wyłącznie, ogromną liczbą platform sprzętowych, na których Linux ma działać.

Wynik: gettimeofday() zwraca czas monotoniczny z mikrosekundową ziarnistością, ale czas, który zapewnia, prawie nigdy nie jest faząone microsecond z dowolnym innym źródłem czasu.

questionAnswers(2)

yourAnswerToTheQuestion