5ms(正確)ごとにウェイクアップし、いくつかの作業を行うために、プロセスにスレッドが必要です。
私は posix タイマーを使用しました。それらは 90% の精度であると思われ、CPU に負荷がかかると精度がさらに低下します。
これは、posixタイマーが期限切れになるたびに新しいスレッドをフォークする必要があるためだと思います。
Linuxで高解像度タイマーを実装する他の信頼できる方法はありますか?スレッドヘルプの優先度を上げますか?
私はCentOS 5.6を使用しています。
1 に答える
POSIX タイマー ( で作成timer_create()
) はすでに高解像度です。問題は配送方法にあります。非常に正確なタイミングが必要な場合SIGEV_THREAD
は、お勧めできません。
代わりにSIGEV_SIGNAL
、タイマーの有効期限がシグナルで通知されるように使用し、有効期限がsigwaitinfo()
切れるのを待つために使用できます。別の方法として、POSIX タイマー (で作成) の代わりに timerfd を使用することもできますtimerfd_create()
。
さらに、タイマーが切れたときにスレッドが他の実行中のスレッドをプリエンプトするようにするには、リアルタイム スケジューリング ポリシー (SCHED_FIFO
またはSCHED_RR
) をsched_setscheduler()
.
また、カーネルがこのオプションを使用してコンパイルされていることを確認してくださいCONFIG_PREEMPT
。これにより、ほとんどのカーネル コードをプリエンプト可能にすることができます。ハードウェア割り込みやソフト IRQ などのプリエンプティブルでないカーネル作業によって引き起こされる、ある程度のジッターは依然として存在します。これをさらに減らすには、CONFIG_PREEMPT_RT
カーネル パッチセットの使用を試すことができます。