ハードウェアクロックとシステムクロックの関係

目次

ハードウェアクロックとは

ハードウェアクロックは、コンピュータシステムにおける時刻を維持するための物理的な装置です。

これは通常、マザーボード上に搭載された水晶振動子(クリスタルオシレーター)を中心に構成されており、一定の周波数で電気的な振動を生成することで時間を計測します。

このクロックは、コンピュータの電源が切れている間も、マザーボード上の小さなバッテリー(CMOS電池と呼ばれることが多い)によって動作し続けるため、「リアルタイムクロック(RTC)」「CMOS時計」とも呼ばれます。

ハードウェアクロックの役目
しかし、これらのハードウェアクロックは完璧な精度を持っているわけではなく、温度変化や製造上のばらつき、経年劣化などの要因により、日々数秒から数分のずれが生じることがあります。

このずれは「ドリフト」と呼ばれ、時間の経過とともに蓄積されていきます。

オペレーティングシステムは起動時にハードウェアクロックから時刻を読み取り、以降はソフトウェア的にカウントを継続します。

高精度が要求されるシステムでは、単純なクリスタルオシレーターではなく、温度補償型水晶発振器(TCXO)や恒温槽付き水晶発振器(OCXO)などの、より安定した時計源が使用されることもあります。

さらに高精度を求める場合は、ルビジウム原子時計やセシウム原子時計などの原子標準が採用されることもありますが、これらは一般的なコンピュータではなく、通信インフラや科学実験施設などの特殊な環境で用いられます。

近代的なコンピュータシステムでは、このハードウェアクロックの不正確さを補うため、NTPやPTPなどのプロトコルを使用してネットワーク経由で外部の正確な時刻源と同期することが一般的になっています。

システムクロックとは

システムクロックは、コンピュータのオペレーティングシステムが管理する論理的な時計機構であり、システムの動作中に時刻を維持する役割を担っています。

コンピュータが起動すると、オペレーティングシステムはまずハードウェアクロック(RTC)から初期時刻を読み取り、その値をシステムクロックに設定します。

起動時(ハードウェアクロック→システムクロック)
その後、システムクロックはCPUのタイマー割り込みや高精度イベントタイマーなどのハードウェア機構を利用して時間を進めていきます。

システムクロックはオペレーティングシステムの核心部分として機能し、プロセススケジューリング、ファイルのタイムスタンプ、ネットワーク通信のタイミング、セキュリティ認証の有効期限確認など、多くのシステム機能に不可欠な時間基準を提供します。

Linuxなどのシステムでは「カーネル時間」とも呼ばれ、ユーザースペースのプログラムは特定のシステムコール(例:gettimeofday, clock_gettime)を通じてこの時刻にアクセスします。

システムクロックはソフトウェア的に調整可能であり、NTPなどの時刻同期プロトコルによって外部の正確な時刻源と同期させることができます。

同期の際には、クロックの速度を微調整する「スルー(slew)」モードと、時刻を即座に変更する「ステップ(step)」モードという二つの主要な調整方法があります。

NTPによる時刻同期の仕組みは、「時刻同期の仕組み」「時刻同期モードの種類」を参照してみてください。

システムクロックの正確さはシステムの安定性や性能、特に分散システムでの調整にとって極めて重要であり、多くの重要なアプリケーションにおいて正確なシステムクロックの維持は基本的な要件となっています。

ハードウェアクロックとシステムクロックの同期

ハードウェアクロックとシステムクロックの同期は、コンピュータシステムにおける時刻管理の重要な側面です。

通常、システムはブート時にハードウェアクロック(RTC)からシステムクロックを初期化しますが、その後は両者が独立して時を刻むため、時間の経過とともに差異が生じていきます。

ハードウェアクロックとシステムクロックの時刻差分
ただし、システムクロック側にはNTPという正確な時刻を取得する方法が提供されているので、できればハードウェアクロックもシステムクロックの時間に修正してあげたいですね。
多くのオペレーティングシステムでは、この二つのクロックを定期的に同期させるメカニズムを提供しています。

Linuxシステムでは「hwclock」コマンドを使用して手動で同期を行うことができ、「--hctosys」オプションでハードウェアクロックからシステムクロックへ、「--systohc」オプションでシステムクロックからハードウェアクロックへと時刻を反映させます。

WindowsやmacOSなどでも同様の機能が実装されています。

多くの場合、システムがシャットダウンする際にシステムクロックの時刻がハードウェアクロックに書き戻されるため、次回起動時にその時刻が引き継がれます。

しかし、システムクロックは通常NTPなどの外部時刻源と同期されるため、より正確な時刻を持っているのに対し、ハードウェアクロックは温度変化や電圧変動の影響を受けやすく、時間とともにドリフト(ずれ)が蓄積されがちです。

この問題に対処するため、多くのシステムでは定期的にシステムクロックからハードウェアクロックへ時刻を同期させるサービスが動作しています。

LinuxではChronydやntpd、WindowsではTime Serviceがこの役割を担当することができます。

時刻同期(システムクロック→ハードウェアクロック)
より高度なシステムでは、ハードウェアクロックのドリフト率を計算し、その値を記録しておくことで補正を行うこともあります。

ハードウェアクロックとシステムクロックの関係性

解説したハードウェアクロックとシステムクロックの関係性を表で整理しました。

是非、頭の中を整理するのに使用してください。

比較観点 ハードウェアクロック システムクロック
物理的実体 実際の物理装置(水晶振動子など) OSが維持するソフトウェア的な時計機構
別名 RTC (リアルタイムクロック)、CMOS時計 カーネル時間、ソフトウェアクロック
電源依存性 独立した電池(CMOS電池)で電源オフでも動作継続 システム稼働中のみ維持され、シャットダウンで消失
精度と品質 一般的に低精度(温度変化や経年劣化の影響を受けやすい) ハードウェアクロックより高精度(外部時刻源と同期可能)
時刻の流れ 継続的にカウント(通常は秒単位) 高精度タイマーによる割り込みで更新(マイクロ秒以上の精度)
相互作用 システム起動時に初期時刻をシステムクロックに提供 シャットダウン時または定期的にハードウェアクロックを更新
調整方法 BIOSまたはUEFI設定、OSコマンド(hwclockなど) システムコール、NTP同期、手動調整コマンド(dateなど)
主な用途 システム起動時の初期時刻提供、長期シャットダウン後の時刻維持 実行中のシステムのタイムスタンプ、プロセススケジューリング
同期の方向 起動時:ハードウェアクロック → システムクロック
稼働中/シャットダウン時:システムクロック → ハードウェアクロック
外部同期との関係 直接外部時刻源と同期しない NTPなどのプロトコルで外部時刻源と同期可能
関連コマンド
(Linux)
hwclock, /sbin/clock date, ntpd, timedatectl
アクセス方法 /dev/rtcデバイスを介してアクセス システムコール(gettimeofday, clock_gettimeなど)

まとめ

ハードウェアクロックとシステムクロックに解説しました。

OS上の時刻はNTPにより時刻同期できますが、シャットダウン中はどうしても時間を刻むことができませんので、代わりの方法が必要になります。

その方法がハードウェアで管理するという方式でした。

よく考えられた方式ですが、やはり物理機器の時計はどうしても時間がズレていきますし、外部との同期手段を持たないのでそこはシステムクロックから同期しなおすことで補完しているんですね。

ハードウェアクロックとシステムクロックはお互いにできない箇所を補いあって、時刻を記録しています。

どちらも大事な仕組みになりますので、しっかり学習していきましょう。