時計メモ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カーネルでは、実行してほしい時刻を指定して、ハンドラを登録します。ここでは説明のために、実 行してほしい時刻のことを起動時刻と呼ぶことにします。起動時刻を指定してタイマーリストにハンドラを登 録しておくと、ローカルタイマーソフト割り込みハンドラがこの起動時刻を監視し、指定した時刻が来たとき に登録したハンドラを呼び出してくれます
まとめ
グローバルもローカルもタイマー割り込みはハードウェア割り込み