5. Lokale Uhren
Um eine präzise und genaue lokale Uhr zu implementieren, muss der Host mit einer Hardwareuhr ausgestattet sein, die aus einem Oszillator und einer Schnittstelle besteht und die erforderliche Präzision und Stabilität erreichen kann. Eine logische Uhr wird dann unter Verwendung dieser Komponenten plus Softwarekomponenten konstruiert, die die scheinbare Zeit und Frequenz als Reaktion auf periodische Aktualisierungen anpassen, die von NTP oder einem anderen Zeitsynchronisationsprotokoll wie Hellospeak [MIL83b] oder dem Unix 4.3bsd TSP [GUS85a] berechnet werden. Dieser Abschnitt beschreibt das Fuzzball-Lokaluhrenmodell und die Implementierung, die Bestimmungen für präzise Zeit- und Frequenzanpassung enthält und die Zeit innerhalb von 15 ns und die Frequenz innerhalb von 0,3 ms pro Tag aufrechterhalten kann. Das Modell ist für die Verwendung mit kompensierten und unkompensierten Quarzoszillatoren geeignet und kann an Netzfrequenzoszillatoren angepasst werden. Eine Zusammenfassung der Eigenschaften dieser und anderer Oszillatortypen findet sich in Anhang E, während eine umfassende mathematische Analyse des NTP-Lokaluhrenmodells in Anhang G zu finden ist.
Es ist wichtig zu beachten, dass die beschriebene spezifische Implementierung nur eine von möglicherweise vielen Implementierungen ist, die äquivalente Funktionalität bieten. Es ist jedoch gleichermaßen wichtig zu beachten, dass das in Anhang G beschriebene Uhrenmodell, das die Grundlage der Implementierung bildet, eine bestimmte Art von Steuerungs-Rückkopplungsschleife beinhaltet, die potenziell instabil ist, wenn die Designregeln verletzt werden. Das in Anhang G beschriebene Modell und die Parameter sind so konzipiert, dass sie unter typischen Betriebsbedingungen unter Verwendung herkömmlicher Hardware und angesichts von Störungen der Hardware- oder Netzwerkverbindung genaue und stabile Zeit liefern. Die Parameter wurden für zuverlässigen Betrieb in einem mehrstufigen hierarchischen Subnetz entwickelt, wo instabiler Betrieb auf einer Ebene möglicherweise viele andere Ebenen stören kann.
5.1. Fuzzball-Implementierung
Die Fuzzball-Lokaluhr besteht aus einer Sammlung von Hardware- und Softwareregistern sowie einem Satz von Algorithmen, die eine logische Uhr implementieren, die als disziplinierter Oszillator fungiert und sich mit einer externen Quelle synchronisiert. Im Folgenden wird eine Beschreibung ihrer Komponenten und ihrer Funktionsweise gegeben. Beachten Sie, dass alle Arithmetik Zweier-Komplement-Ganzzahl ist und alle Verschiebungen "<<" und ">>" arithmetisch sind (Vorzeichenfüllung für Rechtsverschiebungen und Nullfüllung für Linksverschiebungen). Beachten Sie auch, dass x << n äquivalent zu x >> -n ist.
Die Hauptkomponenten der lokalen Uhr sind das 48-Bit-Uhrenregister und der 32-Bit-Prescaler, die als disziplinierter Oszillator fungieren und in Millisekunden relativ zu Mitternacht am Bruchpunkt inkrementieren. Das 32-Bit-Uhrenanpassungsregister wird verwendet, um die Oszillatorphase in graduellen Schritten anzupassen, um Diskontinuitäten in der angezeigten Zeitskala zu vermeiden. Sein Inhalt wird im Folgenden als x bezeichnet. Das 32-Bit-Schiefe-Kompensationsregister wird verwendet, um die Oszillatorfrequenz durch Hinzufügen kleiner Phaseninkremente in periodischen Anpassungsintervallen zu trimmen und kann Frequenzfehler von bis zu 0,01% oder ±100 ppm kompensieren. Sein Inhalt wird im Folgenden als y bezeichnet. Der 16-Bit-Watchdog-Zähler und das 32-Bit-Compliance-Register werden verwendet, um die Gültigkeit zu bestimmen sowie die PLL-Bandbreite und das Abfrageintervall festzulegen (siehe Anhang G). Der Inhalt des Compliance-Registers wird im Folgenden als z bezeichnet. Das 32-Bit-PPS-Anpassungsregister wird nur verwendet, wenn ein Puls-pro-Sekunde (PPS) Signal verfügbar ist, und wird zur Anpassung der Uhr verwendet.
5.2. Graduelle Phasenanpassungen
Das Uhrenanpassungsregister wird verwendet, um die Phase der lokalen Uhr in graduellen Schritten anzupassen. Bei jedem Uhreninterrupt wird der Inhalt x des Uhrenanpassungsregisters zum Prescaler-Register hinzugefügt:
Prescaler <- Prescaler + TICK + x
Da x eine positive oder negative Ganzzahl sein kann, variiert die obige Operation die Frequenz der lokalen Uhr. Bei jedem Sekundenwechsel wird das Uhrenanpassungsregister um CLOCK.ADJUST (typischerweise 8) erhöht oder verringert, was den Effekt hat, die Uhrenfrequenz zu erhöhen oder zu verringern und entsprechend die Zeit zum Anpassen der Uhr zu verringern oder zu erhöhen. Falls der verbleibende Versatz kleiner als CLOCK.MAX (typischerweise 128 ms) ist, wird die Uhrenfrequenz um einen kleineren Betrag angepasst und die Uhrenepoche um einen Betrag angepasst, der proportional zum verbleibenden Versatz ist.
5.3. Schrittweise Phasenanpassungen
Wenn die Größe der Korrektur CLOCK.MAX (typischerweise 128 ms) übersteigt, wird eine Schrittanpassung durchgeführt. Die Schrittanpassung wird verwendet, wenn die Lokaluhrenzeit erheblich von der Referenzzeit abweicht, z. B. nach einem Neustart oder wenn aufgrund einer Zeitzonenänderung eine Korrektur erforderlich ist. Bei einer Schrittanpassung wird die Uhr direkt auf die neue Zeit eingestellt, und alle laufenden Schätzungen von Frequenz und Compliance werden neu initialisiert.
Der Watchdog-Zähler wird jedes Mal, wenn das Uhrenanpassungsregister aktualisiert wird, auf Null zurückgesetzt. Wenn der Zähler den Wert CLOCK.HOLDTC (typischerweise 2048 s oder etwa 34 Minuten) erreicht, wird das Uhrenanpassungsregister auf Null zurückgesetzt. Dies bietet Hysterese und verhindert die Verwendung veralteter Versatzdaten.
5.4. Implementierungsprobleme
Das hier und in Anhang G beschriebene spezifische Lokaluhrenmodell basiert auf einer Rückkopplungsschleife zweiter Ordnung. Die Schleifen-Zeitkonstante ist relativ lang, in der Größenordnung mehrerer Stunden, um die Auswirkungen vorübergehender Netzwerkverzögerungen zu minimieren und die Stabilität zu maximieren. Infolgedessen können Änderungen der Frequenzkorrektur erhebliche Zeit in Anspruch nehmen, insbesondere nach einem Neustart oder einer Schrittphasenanpassung. Um die Schleifenantwort zu beschleunigen, kann das Uhrenanpassungsregister mit dem letzten vor einem Herunterfahren berechneten Wert vorgeladen werden.
In der Fuzzball-Implementierung wird eine umfassende Überwachungs- und Steuerungseinrichtung bereitgestellt, um alle Lokaluhrenvariablen zu untersuchen und den Betrieb der Uhr zu steuern. Darüber hinaus bietet eine spezielle Funktion eine Tageszeit-Anzeige, die nicht nur die Uhrenablesung anzeigt, sondern auch die Compliance und ob eine gültige Synchronisationsquelle verfügbar ist. Zusätzliche Informationen über Design und Implementierung der Fuzzball-Lokaluhr finden sich in [MIL88b].
Das hier beschriebene Lokaluhrenmodell ist speziell für die Arbeit mit NTP und in der Internetumgebung konzipiert. Es gibt jedoch viele andere Möglichkeiten, die unter anderen Umständen möglicherweise besser geeignet sind. Beispielsweise können einige Systeme Zugriff auf einen Präzisionsoszillator haben, der über lange Intervalle hochgradig stabil ist, wie z. B. einen Cäsiumoszillator oder GPS-Empfänger. In solchen Fällen können die Frequenzkorrekturmechanismen unnötig oder unangemessen sein. Wenn außerdem eine hohe Präzision über Intervalle von etwa einer Sekunde erforderlich ist, wie z. B. für Sprach- oder Videoanwendungen, liefern die hier beschriebenen graduellen Phasenkorrekturmechanismen möglicherweise keine ausreichende Präzision. In solchen Fällen kann eine Art Prädiktor-Korrektor oder Phasenregelkreis erforderlich sein, um zwischen seltenen Aktualisierungen von NTP zu interpolieren.
Wie bereits erwähnt, kann in einigen Konfigurationen ein Präzisions-Timing-Puls mit Intervallen von einer Sekunde verfügbar sein. In solchen Fällen kann es angemessen sein, das PPS-Signal zu verwenden, um die Lokaluhrenfrequenz zu disziplinieren, während NTP verwendet wird, um die Nummerierung der Sekunden, Minuten, Stunden und Tage zu disziplinieren. Dies kann Präzisionen in der Größenordnung von Mikrosekunden bieten und gleichzeitig authentische UTC-Zeit bereitstellen. In solchen Fällen muss darauf geachtet werden, dass die Nummerierungsquelle nicht ausfällt, ohne geeignete Maßnahmen zu ergreifen, um weitere Aktualisierungen vom PPS-Signal zu unterdrücken.