4.7. アプリケーションのタイムスタンプに _COARSE POSIX クロックを使用
タイムスタンプを頻繁に実行するアプリケーションは、クロックを読み取るコストの影響を受けます。クロックの読み取りにかかるコストと時間がかかると、アプリケーションのパフォーマンスに悪影響を及ぼす可能性があります。
概念としては、ドロワー内のクロックを使用して、監視される時間イベントへの概念を示します。ドロワーを開くたびに、クロックを取得し、時間を読むだけにかかる場合は、クロックの読み取りコストが高すぎるため、欠落しているイベントが発生したり、誤ってタイムスタンプのタイムスタンプが付いてしまう可能性があります。
ウイン、壁上のクロックは読み取りにより速くなり、タイムスタンプにより観察されるイベントへの干渉が少なくなります。ウォールクロックの直前には、時間読み取りを取得する方がさらに速くなります。
同様に、読み取りメカニズムの高速なハードウェアクロックを選択すると、このパフォーマンスが向上します (クロックの読み取りコストが削減)。Red Hat Enterprise Linux for Real Time では、clock_gettime() 関数で POSIX クロックを使用して可能な限り低コストでクロックの読み取り値を生成することで、さらなるパフォーマンス向上を実現できます。
POSIX クロック
POSIX クロックは、タイムソースを実装して表すための標準です。POSIX クロックは、システムの他のアプリケーションに影響を及ぼさずに、各アプリケーションで選択できます。これは、ハードウェアクロックとは対照的である。「システムタイムスタンプでのハードウェアクロックの使用」これはカーネルによって選択され、システム全体に実装されます。
特定の POSIX クロックを読み取るために使用される関数は、
<time.h> で定義されている clock_gettime() です。clock_gettime() に は、システムコールの形式でカーネル内に対応するものがあります。ユーザープロセスが clock_gettime() を呼び出すと、対応する C ライブラリー (glibc) が sys_clock_gettime() システムコールを呼び出し、要求された操作を実行して結果をユーザープログラムに返します。
ただし、このコンテキストはユーザーアプリケーションからカーネルへの切り替えにはコストがかかります。このコストは非常に低くなりますが、操作が数千回繰り返し行われると、累積されたコストはアプリケーション全体のパフォーマンスに影響を及ぼす可能性があります。カーネルへのコンテキストスイッチを回避し、クロックの読み取りを高速化するために、
CLOCK_MONOTONIC_COARSE および CLOCK_REALTIME_COARSE POSIX クロックのサポートが VDSO ライブラリー関数の形式で作成されました。
_COARSE クロックバリアントの 1 つを使用して clock_gettime() によって実行される時間の読み取りは、カーネルの介入を必要とせず、完全にユーザー空間で実行されるため、パフォーマンスが大幅に向上します。_COARSE クロックの時間読み取りにはミリ秒 (ms) の解像度があるため、1 ミリ秒未満の時間間隔は記録されません。POSIX クロックの _COARSE バリアントは、ミリ秒のクロック解像度に対応できるあらゆるアプリケーションに適しており、読み取りコストの高いハードウェアクロックを使用するシステムではその利点がより顕著になります。
注記
_COARSE 接頭辞の有無で POSIX クロックを読み取る場合のコストと解像度を比較するには、Red Hat Enterprise Linux for Real Time の Red Hat Enterprise Linux for Real Time リファレンスガイドを 参照してください。
例4.1 clock_gettime で _COARSE クロックバリアントを使用する
#include <time.h>
main()
{
int rc;
long i;
struct timespec ts;
for(i=0; i<10000000; i++) {
rc = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts);
}
}
上記の例をさらに改良して、たとえば、より多くの文字列を使用して、clock_gettime() の戻りコードを検証したり、
rc 変数の値を検証したり、ts 構造体の内容が信頼できることを確認したりすることができます。clock_gettime() man ページは、より信頼性の高いアプリケーションを作成するのに役立つ詳細な情報を提供します。
重要
clock_gettime() 関数を使用するプログラムは、
gcc コマンドラインに '-lrt' を追加して rt ライブラリーにリンクする必要があります。
~]$ gcc clock_timing.c -o clock_timing -lrt
関連する man ページ
詳細は、以下の man ページと書籍は本セクションに記載の情報に関連しています。
- clock_gettime()
- 『Linux System Programming』 by Robert Love
- 『Understanding The Linux Kernel』 by Daniel P. Bovet and Marco Cesati