時計メモ2

時計

  • 世界標準時1970年1月1日0時からの経過時間をxtime変数に記録することで時計を実現しています
  • Linuxカーネル起動時にハードウェアカレンダの値で初期化された後は、一定周期に動 作するグローバルタイマー割り込みハンドラ(do_timer関数)で時刻が進められます。
  • 1970年1月1日0時からの経過時刻(秒数)で表現している。
  • 時間の経過はタイマー割り込みで通知。タイマー割り込みごとに少しずつ進めている。
  • dateコマンドを実行すると(timeシステムコール、gettimeofdayシステムコールを呼び出すと)、 Linux内部時計の時刻を得ることができます。

役割

時間の管理と時限処理

ハードウェアのカレンダ

  • 本質的にLinuxとは無関係の世界で独自に時刻を刻んでいます。Linuxカーネルは、起動時にハードウェアのカレンダをLinux内部時計(xtime変数)に反映させます。そのあとは、原則Linux内部 時計とハードウェアのカレンダの同期は行いません。 シャットダウン時などにシステムクロックとハードウェアクロックを同期させているみたい。

xtime変数

世界標準時1970年1月1日0時からの経過時間をxtime変数に記録

jiffies

  • Linuxカーネル起動時を0とする時刻です。これはLinuxカーネル起動後に発生したタイマー割り込みの回数を数えることにより実現しています
  • Linux内部の時限処理のベースとしてのみ利用されています
  • 通常時にはこの値は変更できません。jiffiesの値はタイマー割り込みハンドラ(dojimer関数)のみが変更可 能で、唯一、マシン再起動によってリセットされます。

3つの時計

  • グローバルな時計処理割り込み(グローバルタイマー割り込み) ハードウェア割り込み

    • システムの時刻を進めることが目的
    • システム上のいずれかのCPUに対して割り込みが発生する
    • グローバルタイマー割り込み → do_timer()
  • CPUローカルな時計処理(ローカルタイマー割り込み) 八一ドウェア割り込み

    • smp_locaLtimer_interrupt()がハンドラ → run_timer_softirq() ソフト割り込みハンドラ
    • タイマーリストを監視するみたい

do_timer() ハードウェア割り込みのハンドラ

  • システム起動後に発生したタイマー割り込みの回数を記録するjiffies変数にl
  • clac_load(ticks)ロードアベレージ(システム負荷)を計算

グローバルタイマー割り込みの遅延

高負荷時に、グローバルタイマー割り込みハンドラが期待どおりに動作せず、複数のタイマー割り込みに対し、1回だけグローバルタイマー割り込みハンドラが動作する可能性があります。そのまま普通にタイマー割り込みハンドラ(do-timer関数を実行すると、時刻が遅れることになります。アーキテクチャ依存ですが、この遅れを検出し、正常な時刻に設定し直す機能が実装されています。

タイマーリスト

  • Linuxも伝統的なUNIXと同様に、登録した一定時間後にコールバックされるハンドラを登録するための、汎用の仕組みを備えています。
  • とくにネットワークプロトコル 処理やデバイスドライバ処理におけるタイムアウト処理、再実行処理に数多く利用
  • Linuxカーネルでは、実行してほしい時刻を指定して、ハンドラを登録します。ここでは説明のために、実 行してほしい時刻のことを起動時刻と呼ぶことにします。起動時刻を指定してタイマーリストにハンドラを登 録しておくと、ローカルタイマーソフト割り込みハンドラがこの起動時刻を監視し、指定した時刻が来たとき に登録したハンドラを呼び出してくれます

まとめ

グローバルもローカルもタイマー割り込みはハードウェア割り込み