time
Section: Environments, Tables, and Troff Macros (7)
Updated: 2026-02-08
Index
JM Home Page
roff page
名前
time - 時間とタイマーの概要
説明
実時間 (real time) とプロセス時間
実時間は、特定の時点から計った時間と定義されます。 特定の時点とは、過去の標準的な時点 (下記の紀元 (Epoch) とカレンダ時刻の説明を参照)
や、 プロセスの一生における何らかの時点 (例えば、開始時) です (経過時間)。
プロセス時間は、プロセスによって使われた総 CPU 時間と定義されます。 多くの場合、ユーザー時間とシステム時間に分けられます。
ユーザー CPU 時間は、コードをユーザーモードで実行するのに使った時間です。 システム CPU 時間は、そのプロセスのために
カーネルがシステムモードで実行するのに使った時間です (たとえば、システムコールを実行するのに使った時間)。 time(1)
コマンドはプログラムの実行に費された総 CPU 時間を計るのに使用されます。 プログラムは、自身が費した総 CPU 時間を times(2),
getrusage(2), clock(3) を使って計ることができます。
ハードウェアクロック
多くのコンピュータが (電池で駆動される) ハードウェアクロックを持っています。 カーネルは起動時にソフトウェアクロックを初期化するために
ハードウェアクロックを読み込みます。より詳しい情報は、 rtc(4) と hwclock(8) を参照してください。
ソフトウェアクロック, HZ と jiffies
タイムアウトを設定したり (たとえば select(2), sigtimedwait(2))、 CPU 時間を計測したり (たとえば
getrusage(2))する様々なシステムコールの精度は ソフトウェアクロック の分解能 (resolution) に制限されます。
ソフトウェアクロックとは、カーネルが管理する jiffy 単位で時間を計測するクロックのことです。 jiffy の大きさはカーネル定数 HZ
の値で決定されます。
HZ の値はカーネルのバージョンとハードウェアプラットフォームで異なります。i386 の場合は以下の通りです: 2.4.x
とそれ以前のカーネルでは、HZ は 100 で、 jiffy の値は 0.01 秒でした。 2.6.0 以降では、HZ は 1000
に増やされましたので、jiffy の値は 0.001 秒です。 カーネル 2.6.13 以降では、HZ の値はカーネル設定パラメーターになり、 100,
250 (既定値), 1000 という値にできます。 それぞれ jiffy の値は 0.01, 0.004, 0.001 秒になります。 カーネル
2.6.20 以降では、300 も利用できるようになっています。 300 は一般的な映像フレームレートの公倍数です (PAL, 25HZ; NTSC,
30HZ)。
times(2) システムコールは特殊なケースです。このシステムコールはカーネル定数 USER_HZ
で定義された粒度で時間を報告します。ユーザー空間のアプリケーションは sysconf(_SC_CLK_TCK)
を使ってこの定数の値を知ることができます。
システムとプロセスのクロック: time 名前空間
カーネルは、様々な種類の経過時間および仮想(つまり、消費された CPU)時間を測定する一連のクロックをサポートしています。これらのクロックは
clock_gettime(2) で説明されています。いくつかのクロックは clock_settime(2)
を使用して設定できます。特定のクロックの値は時間名前空間によって仮想化されます。time_namespaces(7) を参照してください。
高精度タイマー
Linux 2.6.21 より前では、タイマーやスリープ関連のシステムコールの精度も jiffy のサイズにより制限されていました。
Linux 2.6.21 以降では、Linux は高精度タイマー (high-resolution timers; HRTs) をサポートしており、
CONFIG_HIGH_RES_TIMERS
で制御できます。高精度タイマーをサポートしているシステムでは、タイマーとスリープ関連のシステムコールの精度はもはや jiffy に制約されることはなく、
ハードウェアが許す限りの精度となります (最近のハードウェアではマイクロ秒単位の精度が一般的です)。高精度タイマーがサポートされているかは、
clock_getres(2) を呼び出して分解能を確認するか、 /proc/timer_list 内の "resolution"
エントリーを参照するかで判断できます。
高精度タイマー (HRT) はすべてのハードウェアアーキテクチャーでサポートされている訳ではありません (対応しているアーキテクチャーは x86,
ARM, powerpc やその他です)。
紀元
UNIX システムは時刻を 紀元 (1970-01-01 00:00:00 +0000 (UTC)) からの秒数で表現します。
プログラムは カレンダ時刻 を gettimeofday(2) CLOCK_REALTIME
クロックを使って決めることができます。この関数は紀元からの経過時間を (秒とマイクロ秒で) 返します。 time(2)
は同様の情報を提供しますが、最も近い秒の精度しかありません。システム時刻は settimeofday(2) で変更できます。
要素別の時刻
ライブラリ関数の中には tm 型の構造体を使うものがあります。この構造体は要素別の時刻を表し、 時刻の値を別々の要素
(年・月・日・時・分・秒など) に分けて格納します。この構造体は tm(3type)
に記述されており、カレンダ時刻を要素別の時刻に変換する機能についても記述されています。要素別の時刻を表示可能な文字列に変換する機能については、
ctime(3), strftime(3), strptime(3) に記載されています。
タイマーのスリープと設定
様々なシステムコールと関数により、指定された一定の時間、 プログラムはスリープ (実行を停止) することが可能です。 nanosleep(2),
clock_nanosleep(2), sleep(3) を参照してください。
様々なシステムコールにより、プロセスは将来のある時点で
有効期間が終了するタイマーを設定できます。またオプションとして繰り返し間隔が指定できるものもあります。 alarm(2),
getitimer(2), timerfd_create(2), timer_create(2) を参照してください。
Timer slack
Linux 2.6.28 以降では、スレッドの "timer slack" 値を制御することができます "timer slack" は、
停止中のシステムコールがタイムアウト以外で wake-up される (起こされる)
際に、カーネルに許容される遅延時間です。この遅延を認めることで、カーネルは wake-up イベントをまとめて行うことができ、その結果、システム全体の
wake-up 数を減らし、電力を節約することができます。詳細は prctl(2) の PR_SET_TIMERSLACK
の説明を参照してください。
関連項目
date(1), time(1), timeout(1), adjtimex(2), alarm(2),
clock_gettime(2), clock_nanosleep(2), getitimer(2),
getrlimit(2), getrusage(2), gettimeofday(2), nanosleep(2),
stat(2), time(2), timer_create(2), timerfd_create(2),
times(2), utime(2), adjtime(3), clock(3),
clock_getcpuclockid(3), ctime(3), ntp_adjtime(3),
ntp_gettime(3), pthread_getcpuclockid(3), sleep(3), strftime(3),
strptime(3), timeradd(3), usleep(3), rtc(4),
time_namespaces(7), hwclock(8)
Index
- 名前
-
- 説明
-
- 実時間 (real time) とプロセス時間
-
- ハードウェアクロック
-
- ソフトウェアクロック, HZ と jiffies
-
- システムとプロセスのクロック: time 名前空間
-
- 高精度タイマー
-
- 紀元
-
- 要素別の時刻
-
- タイマーのスリープと設定
-
- Timer slack
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.