10

私は、C++ で Linux 上のスレッド化されたアプリケーションに取り組んでいます。これは、リアルタイムで、ハートビートで、または可能な限りそれに近いアクションを実行しようとします。

実際には、OS がスレッドをスワップアウトしていて、スレッドが切り替えられている間に最大 10 分の 1 秒の遅延が発生し、ハートビートが不規則になることがわかりました。

私のスレッドが OS に、コンテキストを切り替える良い時期であることを示唆する方法はありますか? ハートビートを実行した直後にこの呼び出しを行うことができたので、タイミングの悪いコンテキスト スイッチによる遅延を最小限に抑えることができました。

4

6 に答える 6

6

あなたの場合の主な問題が何であるかを言うのは難しいですが、sched_yield()orへの呼び出しで修正できるものではないことは間違いありませんpthread_yield()。Linux での譲歩の明確に定義された唯一の使用法は、別の準備完了スレッドが、SCHED_FIFO スケジューリング ポリシーの下で、同じ CPU 上の同じ優先度で、現在 CPU にバインドされている実行中のスレッドをプリエンプトできるようにすることです。これは、ほとんどすべての場合に不適切な設計上の決定です。

Linux で「リアルタイムであることを試みる」という目標を真剣に考えている場合は、まず、リアルタイムsched_setscheduler設定 (SCHED_FIFO または SCHED_RR、FIFO を推奨) を使用する必要があります。次に、Linux 用の完全なプリエンプション パッチを取得します (お使いのディストリビューションで提供されていない場合は、 kernel.orgから入手してください。これにより、デバイス ドライバー スレッドのスケジュールを変更したり、ハード ディスクやイーサネット ドライバー スレッドよりも高いスレッドを実行したりすることもできます)。第 3 に、RTWikiやその他のリソースを参照して、リアルタイム アプリケーションを設計および設定する方法に関するヒントをさらに確認してください。

これは、適切なデスクトップ システムのシステム負荷に関係なく、応答時間を 10マイクロ秒未満にするのに十分なはずです。私は組み込みシステムを使用しており、アイドル状態で 60 us の応答を絞り出し、ディスク/システムの負荷が高い場合は 150 us しか絞り出しませんが、それでもあなたが説明しているよりも桁違いに高速です。

于 2010-05-27T05:11:59.877 に答える
3

yieldなどのさまざまなコマンドを使用して、現在実行中のスレッドに実行を一時停止するように指示できます。

スレッドに一時停止するように指示するだけでは決定論的ではなく、999 回は適切な間隔が提供される可能性があり、1 回は提供されない可能性があります。

一貫した結果を得るには、おそらくリアルタイムのスケジューリングを検討する必要があります。このサイトhttp://www2.net.in.tum.de/~gregor/docs/pthread-scheduling.htmlは、スレッドのスケジューリングについて調査するための出発点として適しているようです。

于 2010-05-27T04:31:30.973 に答える
1

使用するsched_yield

そして、ファースレッドには pthread_yield http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_yield.3.htmlがあります。

于 2010-05-27T04:19:51.953 に答える
1

私はその質問に少し混乱しています。プログラムが定期的なハートビートを待機してから何らかの作業を行っている場合、OS は、ハートビートの待機に戻ったときに他のことをスケジュールすることを認識している必要があります。

「ハートビート」を取得するためにフラグを回転させているのではありませんか?

于 2010-05-27T04:47:16.467 に答える
1

などのタイマー機能を使っていますsetitimer()ね?右???

そうでない場合は、すべて間違っています。

実際に必要なものよりも少し短いタイマー間隔を指定する必要がある場合があります。リアルタイム スケジューラの優先度とタイマーを使用している場合、プロセスはほとんどの場合、時間どおりに起動されます。

常に時間通りにということですが、Linux はまだ完全なリアルタイム OS ではありません。

于 2010-06-01T19:24:09.200 に答える
0

Linux についてはよくわかりませんが、Windows では、いくつかの理由でシステムに中断しないように要求することはできないと説明されています(主に最初の段落)。私の頭から離れた理由の 1 つは、いつでも発生する可能性があり、制御できないハードウェア割り込みです。

EDIT一部の男がの使用を提案したsched_yield後、彼の回答を削除しました。ただし、プロセス全体の時間を放棄します。sched_setscheduler必要なものについてカーネルにヒントを与えるために使用することもできます。

于 2010-05-27T04:05:22.283 に答える