5. ローカルクロック
正確で精密なローカルクロックを実装するためには、ホストは発振器とインターフェースからなるハードウェアクロックを備え、必要な精度と安定性を達成できる必要があります。次に、これらのコンポーネントに加えて、NTPまたはHellospeak [MIL83b]やUnix 4.3bsd TSP [GUS85a]などの他の時間同期プロトコルによって計算された定期的な更新に応じて見かけの時刻と周波数を調整するソフトウェアコンポーネントを使用して論理クロックが構築されます。このセクションでは、精密な時刻と周波数の調整の規定を含むFuzzballローカルクロックモデルと実装について説明します。これは、時刻を15ナノ秒以内、周波数を1日あたり0.3ミリ秒以内に維持できます。このモデルは、補償および非補償の水晶発振器での使用に適しており、電源周波数発振器に適応できます。これらおよび他のタイプの発振器の特性の要約は付録Eにあり、NTPローカルクロックモデルの包括的な数学的分析は付録Gにあります。
説明されている特定の実装は、同等の機能を提供する可能性のある多くの実装の1つにすぎないことに注意することが重要です。ただし、実装の基礎である付録Gで説明されているクロックモデルは、設計ルールが破られると潜在的に不安定になる可能性がある特定の種類の制御フィードバックループを含むことに注意することも同様に重要です。付録Gで説明されているモデルとパラメータは、従来のハードウェアを使用した典型的な動作条件下で、およびハードウェアまたはネットワーク接続の中断に直面して、正確で安定した時刻を提供するように設計されています。パラメータは、あるレベルでの不安定な動作が他の多くのレベルを混乱させる可能性がある多レベル階層サブネットでの信頼性の高い動作のために設計されています。
5.1. Fuzzball実装
Fuzzballローカルクロックは、ハードウェアおよびソフトウェアレジスタのコレクションと、規律発振器として機能し外部ソースに同期する論理クロックを実装する一連のアルゴリズムで構成されます。以下は、そのコンポーネントと動作方法の説明です。すべての演算は2の補数整数であり、すべてのシフト"<<"および">>"は算術シフト(右シフトの符号埋めと左シフトのゼロ埋め)であることに注意してください。また、x << nはx >> -nと同等であることに注意してください。
ローカルクロックの主要コンポーネントは、48ビットクロックレジスタと32ビットプリスケーラーであり、これらは規律発振器として機能し、小数点で午夜に対してミリ秒単位で増分します。32ビットクロック調整レジスタは、示されるタイムスケールの不連続性を回避するために、段階的なステップで発振器位相を調整するために使用されます。その内容は以下でxと指定されます。32ビットスキュー補償レジスタは、定期的な調整間隔で小さな位相増分を追加することによって発振器周波数をトリミングするために使用され、最大0.01%または±100 ppmの周波数エラーを補償できます。その内容は以下でyと指定されます。16ビットウォッチドッグカウンタと32ビット適合性レジスタは、有効性を判定するため、およびPLL帯域幅とポーリング間隔を確立するために使用されます(付録Gを参照)。適合性レジスタの内容は以下でzと指定されます。32ビットPPS調整レジスタは、パルス毎秒(PPS)信号が利用可能な場合にのみ使用され、クロックを調整するために使用されます。
5.2. 段階的位相調整
クロック調整レジスタは、ローカルクロックの位相を段階的なステップで調整するために使用されます。各クロック割り込みで、クロック調整レジスタの内容xがプリスケーラーレジスタに追加されます:
Prescaler <- Prescaler + TICK + x
xは正または負の整数になる可能性があるため、上記の操作はローカルクロックの周波数を変化させます。各秒変化時に、クロック調整レジスタはCLOCK.ADJUST(通常は8)だけ増加または減少します。これにより、クロック周波数が増加または減少し、それに応じてクロックを調整する時間が減少または増加する効果があります。残留オフセットがCLOCK.MAX(通常は128ミリ秒)未満の場合、クロック周波数はより小さい量で調整され、クロックエポックは残留オフセットに比例する量で調整されます。
5.3. ステップ位相調整
補正の大きさがCLOCK.MAX(通常は128ミリ秒)を超える場合、ステップ調整が実行されます。ステップ調整は、再起動後やタイムゾーン変更による補正が必要な場合など、ローカルクロック時刻が基準時刻と大幅に異なる場合に使用されます。ステップ調整では、クロックは新しい時刻に直接設定され、進行中のすべての周波数と適合性の推定が再初期化されます。
ウォッチドッグカウンタは、クロック調整レジスタが更新されるたびにゼロにリセットされます。カウンタがCLOCK.HOLDTC値(通常は2048秒または約34分)に達すると、クロック調整レジスタはゼロにリセットされます。これにより、ヒステリシスが提供され、古いオフセットデータの使用が防止されます。
5.4. 実装の問題
ここおよび付録Gで説明されている特定のローカルクロックモデルは、二次フィードバックループに基づいています。ループ時定数は、一時的なネットワーク遅延の影響を最小限に抑え、安定性を最大化するために、数時間のオーダーで比較的長くなっています。その結果、周波数補正の変更は、特に再起動またはステップ位相調整後に完了するのにかなりの時間がかかる場合があります。ループ応答を高速化するために、クロック調整レジスタをシャットダウン前に計算された最後の値でプリロードできます。
Fuzzball実装では、すべてのローカルクロック変数を検査しクロックの動作を制御するための包括的な監視および制御機能が提供されています。さらに、特別な機能により、クロック読み取りだけでなく、適合性と有効な同期ソースが利用可能かどうかを示す時刻表示が提供されます。Fuzzballローカルクロックの設計と実装に関する追加情報は[MIL88b]にあります。
ここで説明されているローカルクロックモデルは、NTPおよびインターネット環境で動作するように特別に設計されています。ただし、異なる状況でより適切な他の多くの可能性があります。たとえば、一部のシステムは、セシウム発振器やGPS受信機などの長い間隔で高度に安定している精密発振器にアクセスできる場合があります。そのような場合、周波数補正メカニズムは不要または不適切な場合があります。さらに、音声やビデオアプリケーションなど、約1秒の間隔で高精度が必要な場合、ここで説明されている段階的位相補正メカニズムでは十分な精度を提供できない場合があります。そのような場合、NTPからの頻度の低い更新間を補間するために、何らかの形の予測補正器または位相同期ループが必要になる場合があります。
前述のように、一部の構成では、1秒間隔で間隔が設定された精密タイミングパルスが利用可能な場合があります。そのような場合、PPS信号を使用してローカルクロック周波数を規律し、NTPを使用して秒、分、時間、および日の番号付けを規律することが適切な場合があります。これにより、本物のUTC時刻を提供しながらマイクロ秒のオーダーの精度を提供できます。そのような場合、PPS信号からのさらなる更新を抑制するための適切なアクションを取らずに番号付けソースが失敗しないように注意する必要があります。