Linux / POSIXシステムでシステムタイマーの解像度を見つける方法は?私が特に興味を持っているのは、nanosleep()
人が待つことができる最小限の時間です。既存の実装呼び出しは、古いsysconf(_SC_CLK_TCK)
カーネル(<= 2.4)で正しく機能します。これは1秒あたりのクロックティック数を返します。これはタイマーの解像度です(1 /瞬間)。
しかし、現代の機械は一般的に(a)タイムスタンプカウンター/高精度イベントタイマー(非)「ティックフリー」コア。もはや固定タイマ割り込み間隔を使用しないので、もはや_SC_CLK_TCK
意味がありません。このようなシステムでは、sysconf(_SC_CLK_TCK)
通常100が返されますが、実際のタイマー粒度ははるかに小さいです。
sysconf(_SC_CLK_TCK)
タイマーの粒度に対応していない新しいシステムで実行されているかどうかを検出する方法(可能な限りC / C ++コード)はありますか?この場合は0を返したいと思います。
答え1
待機できる最小時間は、次のようないくつかのnanosleep()
要因によって決まります。
デフォルトとしてタイマーマージン値は50µsです。、nanosleepが0nsまたは1nsの期間で呼び出されても、プロセスが通常の(異なる)スケジュールに従って実行される場合、基本的に実際に約50μsを待ちます。
prctl()
リアルタイム予約クラスでプロセスを呼び出すか実行することで、タイマーの空きメカニズムを無効にできます。
しかし、ナノスリープコールは、ハードウェアによって約3μsかかる自発的なコンテキスト遷移をもたらします。
実際、nanosleepで使用されるタイマーの精度/精度を照会する直接的な方法はありません。 POSIXはナノスリープを測定する必要があることを指定しますCLOCK_REALTIME
。以下を使用して解像度を照会できます。clock_getres()
。ただし、タイマーの精度/精度はこれより低い場合があります。
ただし、プログラムの起動時に小さな値(1ns、1μs、10μsなど)を呼び出すことで、ナノスリープの精度/精度を間接的に照会し、clock_gettime(CLOCK_REALTIME)
CPUの実行時間に対する実際の実行時間を測定できます。TSC。
答え2
私の(より多くの)経験はBSDについてです。ナノ睡眠 はいPOSIX.1(IEEE規格1003.1-2008)。関連性があるようですlibc
。したがって、(Linuxでも)time.h
探している(高精度)タイマーへのいくつかのポインタを見つけることができます。私はLinuxボックスを持っていません。だから確信を得ることはできません。しかし! :)