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);
	}
}
Copy to Clipboard Toggle word wrap
上記の例をさらに改良して、たとえば、より多くの文字列を使用して、clock_gettime() の戻りコードを検証したり、rc 変数の値を検証したり、ts 構造体の内容が信頼できることを確認したりすることができます。clock_gettime() man ページは、より信頼性の高いアプリケーションを作成するのに役立つ詳細な情報を提供します。
重要
clock_gettime() 関数を使用するプログラムは、gcc コマンドラインに '-lrt' を追加して rt ライブラリーにリンクする必要があります。
~]$ gcc clock_timing.c -o clock_timing -lrt
Copy to Clipboard Toggle word wrap
  • clock_gettime()
  • Linux System Programming』 by Robert Love
  • Understanding The Linux Kernel』 by Daniel P. Bovet and Marco Cesati
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat