poll()
準備されたネットワークイベント(パケット)を検出し、できるだけ早く処理するために使用したいBoost Asioを使用するアプリケーションがあります。
また、このプロセス(シングルスレッド)でSCHED_FIFOを使用してジッタを制御したいと思います(私が解決しようとしている主な問題です。)。
現在の制限はカーネルが2.6.32(ライブパッチなし)であることです。これには、アプリケーションが実行されているコアから移動できないカーネルプロセスがいくつかあり(つまり、カーネルが実行されていない)、実際の分離がないような追加の問題があります。この問題が次に発生することを知っています。最新バージョンのカーネル - しかし、まだアップグレードすることはできません。 )
だから今は不親切なら次のようにします。
while(some_condition)
service.poll();
プロセスはコアを回転させ、SCHED_FIFOが設定されているため、そのコアで実行する必要がある他のカーネルプロセスを決して放棄せず、あらゆる種類の予測不能な悪いことが発生します。今私の質問は、このポーリングループをどのように実行し、他のスレッドが少なくとも少しでも実行されるように放棄するかを確認することです。
2つのオプションがあります。
- 一種の睡眠
- イベントが処理されない場合は、イベントのいずれかのブロックを呼び出すことが
poll()
できますが、run_one()
ここで問題は、このイベントが私が望むパケットになる可能性があることです。
別の方法を見逃しましたか?
ベストアンサー1
使ったことはありませんが、一見Boost::asio
すると使いたいのですが、使いたく.run()
ないような感じがします.poll()
。 Patrickが指摘したように、正規のpoll()
システムコールは受動的にブロックできますが、asio::poll()
明示的にはブロックできません(Busy-loopが必要です)。run()
する:
run()関数は、すべての操作が完了し、ハンドラをディスパッチする必要がなくなるまで、またはio_serviceが停止するまでブロックされます。
もちろん、絶え間ないパケットストリームを処理しても問題は解決されません。しかし、私の考えには皆さんが窮地に追い込まれたようです。システムがそのコアを定期的に使用し、そのコアのみを使用する必要があり、それを放棄すると処理に遅延が発生する場合、これは困難な状況です。