5

Linuxホスト上でマイクロ秒の精度でタスクを実行することは可能ですか?つまり、特定の時点でタスクを実行したいのです。Linuxはリアルタイムシステムではありませんが、Linuxで最適なソリューションを探しています。

これまで、カーネルモジュールを作成し、hrtimerをセットアップし、コールバック関数が入力されたときのジッターを測定しました(実際の遅延についてはあまり気にしません。重要なのはジッターです)、約20〜50usです。これは、ユーザースペースでtimerfdを使用するよりも大幅に優れているわけではありません(プロセスにリアルタイムの優先度を使用してみましたが、実際には何も変わりませんでした)。

Linux 3.5.0を実行しています(ほんの一例です。2.6.35から3.7までのさまざまなカーネルを試しました)。/proc/timer_listはhrtimer_interruptを示し、hrtimer機能を無効にするフェイルセーフモードで実行していません。さまざまなCPU(IntelAtomからCorei7)で試してみました。

これまでの私の最善のアイデアは、hrtimerをndelay/udelayと組み合わせて使用​​することです。これは本当にそれを行うための最良の方法ですか?マイクロ秒の精度でタスクをトリガーすることは不可能だとは信じられません。モジュールとしてカーネル空間でコードを実行することは許容されますが、コードが他のタスクによって中断されていない場合は素晴らしいでしょう。システムの残りの部分についてはあまり気にしません。タスクは1秒間に数回しか実行されないため、タスクを実行するたびにmdelay/ndelayを使用してCPUを数マイクロ秒焼きます。とはいえ、私はもっとエレガントな解決策を好みます。

質問が明確で、タイマーの精度に関する多くのトピックが見つかりましたが、その問題に対する本当の答えはありません。

4

2 に答える 2

3

ユーザー空間からやりたいことができる

  1. とともに使用clock_gettime()して、 -second 分解能CLOCK_REALTIMEで時刻を取得しますnano
  2. を使用nanosleep()して、タスクの実行に必要な時間に近づくまで CPU を解放します (少なくともmilli-2 秒の解像度です)。
  3. clock_gettime()目的の時間に達するまでスピンループを使用します
  4. あなたのタスクを実行します

このclock_gettime()関数はVDSO、最近のカーネルと最新の x86 プロセッサでは として実装されています。 -second 解像度nanoで時刻を取得するには 20 ~ 30 秒かかります。 -1 秒あたり 30 回以上nano呼び出すことができるはずです。この方法を使用すると、タスクは意図した時間の 1/30 秒以内にディスパッチする必要があります。clock_gettime()micromicro

于 2013-02-18T20:09:26.887 に答える
0

デフォルトの Linux カーネル タイマーは、ミリ秒ごとに刻みます。マイクロ秒は、現在のユーザー ハードウェアの能力をはるかに超えています

表示されるジッターは、割り込み処理や優先度の高いタスクの処理など、多くの要因によるものです。ハードウェアを慎重に選択し、本当に必要なものだけを有効にすることで、それをいくらか減らすことができます。カーネルへのリアルタイムパッチシリーズ ( HOWTOを参照) は、それをさらに減らすためのオプションかもしれません。

インタラクティブ性、安定性、そして (最後に、しかし最も重要なこととして) 構築、調整、トラブルシューティング、およびカードの家がバラバラにならないようにするための時間の点で、利益には明確な代償があることを常に心に留めておいてください。

于 2013-02-18T20:09:13.283 に答える