Linuxでのタイマーの実装の仕組み
Linuxは、タイマーを以下の原理で実装しています。
- カーネル内のタイマーは「タイマー」データ構造で表現されています。このデータ構造にはタイマーの満了時間、コールバック関数、コールバック関数のパラメーターなどの情報が含まれています。
- すべてのタイマーを格納するために、カーネルにグローバルなタイマーリストが用意されており、有効期限の順に並んだリストになっています。タイマーの有効期限が一番早いものがリストの最初になります。
- カーネルにタイマーが追加されると、カーネルはタイマーの期限に基づいて、タイマーをタイマーリンクリストの適切な場所に挿入します。
- カーネルは一定間隔ごとに発生するクロック割り込みによって、タイマーリストの先頭のタイマーが期限切れになっているかどうかをチェックする。期限切れの場合はそのタイマーのコールバック関数を呼び出し、コールバック関数にコールバック関数引数を渡す。
- タイマーのコールバック関数内では、プロセスをウェイクアップさせたり特定のデータ構造を更新したりなどの定期処理を実行できます。
- タイマーコールバック関数が実行されると、カーネルはタイマーの繰り返しプロパティ(単発または定期)に応じて、タイマーをリンクリストから削除するか、再挿入するかを決定します。
上記の仕組みによって、Linuxタイマーはさまざまな精度でタイマー操作を実行し、カーネル内の時間関連処理機能を提供します。