15.2. POSIX クロック
POSIX は、タイムソースを実装して表すための標準です。カーネルによって選択され、システム全体に実装されているハードウェアクロックとは異なり、POSIX クロックは、システムの他のアプリケーションに影響を与えずに各アプリケーションで選択できます。
CLOCK_REALTIME
: これは、実際の時間を表します。つまり「wall time」とも呼ばれます。これは、壁の時計からわかる時間を意味します。このクロックは、タイムスタンプイベントとユーザーと対話する場合に使用されます。これは、適切な権限を持つユーザーが変更できます。ただし、クロックの値が 2 つの読み取り間で変更された場合に、誤ったデータが作成される可能性があるため、ユーザーの変更は注意して使用してください。CLOCK_MONOTONIC
: システム起動以降に増加する時間を表します。このクロックはプロセスでは設定できず、イベント間の時間差を計算するのに推奨されるクロックです。このセクションの以下の例は、POSIX クロックとしてCLOCK_MONOTONIC
を使用します。
注記
POSIX クロックの詳細は、以下の man ページおよびガイドを参照してください。
- clock_gettime()
- 『Linux System Programming』 by Robert Love
所定の POSIX クロックの読み取りに使用される関数は
clock_gettime()
で、<time.h>
出て異議されます。この clock_gettime()
コマンドは、POSIX クロック ID と timespec 構造の 2 つのパラメーターを取ります。これは、クロックの読み取りに使用する期間が埋められます。以下の例は、クロックの読み取りコストを測定する関数を示しています。
例15.2 clock_gettime()
を使用した読み取り用 POSIX クロックのコストの測定
#include <time.h> main() { int rc; long i; struct timespec ts; for(i=0; i<10000000; i++) { rc = clock_gettime(CLOCK_MONOTONIC, &ts); } }
上記の例は、その他のコードを追加して、
clock_gettime()
の戻りコードの確認、rc
変数の値の確認、または ts
構造の内容が信頼されるようにすることで改善できます。clock_gettime()
man ページは、より信頼できるアプリケーションを作成するのに役立つより多くの情報を提供します。
重要
この
clock_gettime()
関数を使用するプログラムは、gcc
コマンドライン '-lrt'
に追加して rt
ライブラリーにリンクする必要があります。
~]$ gcc clock_timing.c -o clock_timing -lrt
15.2.1. CLOCK_MONOTONIC_COARSE
および CLOCK_REALTIME_COARSE
clock_gettime()
やなどの関数 gettimeofday()
は、システムコールの形式でカーネル内の関数です。ユーザープロセスが clock_gettime()
を呼び出す際に、対応する C ライブラリー (glibc
) が要求された操作を実行する sys_clock_gettime()
システムコールを呼び出し、その結果をユーザープロセスに返します。
ただし、このコンテキスト切り替えは、ユーザーアプリケーションからカーネルへの切り替えにはコストがかかります。このコストは非常に低くなりますが、操作が数千回繰り返し行われると、累積されたコストはアプリケーション全体のパフォーマンスに影響を及ぼす可能性があります。
カーネルにコンテキストが切り替わらないように、クロックの読み取りが速くなり、
CLOCK_MONOTONIC_COARSE
および CLOCK_REALTIME_COARSE
POSIX クロックのサポートが VDSO ライブラリー機能の形式で作成されました。_COARSE
バリアントは読み取りが速く、1 ミリ秒 (ミリ秒) の精度 (解像度とも呼ばれます) を持ちます 。