Wie funktioniert Clock_getime tatsächlich im Kernel?Linux

Linux verstehen
Anonymous
 Wie funktioniert Clock_getime tatsächlich im Kernel?

Post by Anonymous »

Code: Select all

uint64_t getTimeLatencyNs() {
struct timespec ts1;
struct timespec ts2;
clock_gettime(CLOCK_MONOTONIC_RAW, &ts1);
clock_gettime(CLOCK_MONOTONIC_RAW, &ts2);
return ((ts2.tv_sec - ts1.tv_sec) * NSEC + ts2.tv_nsec - ts1.tv_nsec);
}
Der obige Code und vorhandene Fragen zeigen, dass wir clock_gettime () alle paar Nanosekunden aufrufen können und es gibt einen anderen Wert zurück. Nach meinem Verständnis eliminiert der VDSO nur den (signifikanten) Overhead, der aus der Ansgesetzung stammt. Im Hintergrund gibt es jedoch noch mehr. Angenommen, ich verstehe bereits benachbarte Konzepte wie Zeitsynchronisation (PTP, NTP), RTC oder verschiedene Uhren (z. B. clock_monotonische ). 2006. Zusammenfassend wird ein Wert im Speicher gespeichert, der alle 1/config_hz Sekunden inkrementiert wird. Anrufe bei GetTimeofday () /

Code: Select all

clock_gettime()
Lesen Sie einfach die Speicheradresse. Bei typischen Systemen erfolgt das Update alle 1 oder 4 Millisekunden (d. H. Die Taktauflösung war einige Milli Sekunden). Siehe Man time . 2.x)
Da Linux 2.6.21 ist, ermöglicht die Konfiguration_High_res_timers HRTIMERER, eine höhere Auflösung zu erreichen, so die MAN TIME . Auf meinem System wird die Konfiguration auf Ja gesetzt. Also habe ich mich über hrtimer gelesen. Aber Hrtimer -Dokumente sagen, dass sie nicht für Uhren verwendet werden. Sie sagen jedoch, sie planen, es umzusetzen. Derzeit suche ich immer noch nach einem Hrtimer, der die clock_getime () Kernelquelle überholt. /> baeldung (Erläuterung von 2024)
Suchen Sie mehr, der Baeldung -Artikel "Zeitmessung und Takten in Linux" aus 2024 erklärt VDSO als Aktivieren von Clock_getTime () ohne das syscall overhead, indem Sie die Funktion von Kern -Raum in den Benutzerraum in den User Raum machten. Es hat auch ein interessantes Zitat: < /p>

Der VDSO kann Latenzspikes einführen, wenn die Kernel gemeinsam genutzten Speicherbereiche mit Taktzähnen aktualisieren. Diese Situation tritt eher auf, wenn Uhren vom VDSO beschleunigt werden. In ähnlicher Weise behauptet diese Antwort, clock_gettime () Ausreißer, die durch Aktualisierungen des gemeinsamen Speichers verursacht werden sollen, und ein bestimmtes DO -Treffer aufzunehmen ... während (unwahrscheinlich ...) Fall. Ich bin mir nicht sicher, ob die Erklärung, da der durchschnittliche Aufruf in dieser Frage einige nano Sekunden dauert, während die Ausreißer im zweiten Bereich micro liegen. Ein weiterer Lauf dieser Schleife sollte nur Nano Sekunden dauern. Ich habe eine Antwort erhalten, die besagt, dass AMDN auf den neuesten Hardware clock_getTime () aus dem ständig wachsenden TSC -Register erklärt wird, warum es ständig zunimmt. Ich gehe davon aus, dass dies auf meiner Maschine am Ende verwendet wird, um die hohe Auflösung zu erreichen, da es sich um eine relativ jüngste X86 -Maschine handelt.
Es gibt ähnliche Register auf anderen Plattformen, z. ARM's CCNT, aber wahrscheinlich der gemeinsame Code ist sowieso um den Registerzugriff gewickelt. Ist diese Erklärung der Kernelquellen clock_getTime ab 2013? Abhängig von der Kernel -Konfiguration wird der freigegebene Speicher entweder regelmäßig über Jiffies aktualisiert (

Code: Select all

CONFIG_HZ
) oder über einen Timer -Interrupt (Timer -Interrupt (

Code: Select all

CONFIG_NO_HZ
). Dann wird vGetSns () aufgerufen, um die Granularität zu erhöhen, was ich davongte, dass es das oben genannte TSC Register liest. Auf meinem System ist no_hz festgelegt, aber auch Hz = 1000 , sodass ich es derzeit nicht vollständig verstehe.

Code: Select all

$ cat /boot/config | grep _HZ
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
# CONFIG_NO_HZ_IDLE is not set
CONFIG_NO_HZ_FULL=y
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
Zusammenfassung
Soweit ich verstehe, dauert ein Aufruf an clock_getTime () aufgrund des VDSO -Mechanismus normalerweise nur wenige Nanosekunden. Trotzdem gibt es Ausreißer, die einige Fragen zum Verhalten von clock_getTime () < /code> und seines Timings ausgelöst haben. Bevor ich mich in die Kernelquelle und /oder in Ftrace eingraben, fand ich es fair, die Community zu fragen. Bei Bedarf kann ich ein Bild meines Verständnisses zeichnen.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post