説明
実時間 (real time) とプロセス時間
実時間は、特定の時点から計った時間と定義される。特定の時点とは、過去の標準的な時点 (下記の紀元 (Epoch) とカレンダ時刻の説明を参照) や、プロセスの一生における何らかの時点 (例えば、開始時) である (
経過時間)。
プロセス時間は、プロセスによって使われた総 CPU 時間と定義される。多くの場合、
ユーザ時間と
システム時間に分けられる。ユーザ CPU 時間は、コードをユーザモードで実行するのに使った時間である。システム CPU 時間は、そのプロセスのためにカーネルがシステムモードで実行するのに使った時間である (例えば、システムコールを実行するのに使った時間)。
time(1) コマンドはプログラムの実行に費された総 CPU 時間を計るのに使用される。プログラムは、自身が費した総 CPU 時間を
times(2),
getrusage(2),
clock(3) を使って計ることができる。
ハードウェアクロック
多くのコンピュータが (電池で駆動される) ハードウェアクロックを持っている。カーネルは起動時にソフトウェアクロックを初期化するためにハードウェアクロックを読み込む。より詳しい情報は、
rtc(4) と
hwclock(8) を参照すること。
ソフトウェアクロック, HZ, Jiffy
タイムアウトを設定したり (例えば
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) を使ってこの定数の値を知ることができる。
高精度タイマ
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"エントリを参照するかで判断できる。
高精度タイマはすべてのハードウェアアーキテクチャでサポートされている訳ではない (対応しているアーキテクチャは x86, arm, powerpc である)。
紀元
UNIX システムは時刻を紀元 (1970-01-01 00:00:00 +0000 (UTC)) からの秒数で表現する。
プログラムは
カレンダ時刻 を
gettimeofday(2) を使って計ることができる。この関数は紀元からの経過時間を (秒とマイクロ秒で) 返す。
time(2) は同様の情報を提供するが、最も近い秒の精度しかない。システム時刻は
settimeofday(2) で変更できる。
要素別の時刻
ライブラリ関数の中には
tm 型の構造体を使うものがある。この構造体は
要素別の時刻を表し、時刻の値を別々の要素 (年・月・日・時・分・秒など) に分けて格納する。この構造体は
ctime(3) に記述されており、カレンダ時刻を要素別の時刻に変換する関数についても記述されている。要素別の時刻を表示可能な文字列に変換する関数については、
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
Since Linux 2.6.28, it is possible to control the "timer slack" value for a thread. The timer slack is the length of time by which the kernel may delay the wake-up of certain system calls that block with a timeout. Permitting this delay allows the kernel to coalesce wake-up events, thus possibly reducing the number of system wake-ups and saving power. For more details, see the description of
PR_SET_TIMERSLACK in
prctl(2).