0

UDP ソケットからデータを読み取るコードを継承しました。ここで何が起こっているのかを理解するための助けが必要です.また、パフォーマンス全体を改善できるかどうか.

このコードは、まず select() を呼び出し、次に recvfrom() を呼び出します。私の調査によると、recvfrom() は、select() が利用可能なデータがあるという事実を返したときにのみ呼び出されるようです。このコードは基本的に、マルチキャスト メッセージを継続的にリッスンするスレッドで構成されています。その結果、データを受信するかタイムアウトするまで、基本的に select() ルーチンに留まります。

このコードのパフォーマンスを改善するためのより良い方法があるのではないかと考えていました。まず、select() は必要ですか? このスレッドに基づいて: UDP ソケットの recv fcn のタイムアウトを設定すると、recvfrom() コマンド自体のタイムアウトを設定できるようです。これで何か買えますか?また、いくつかの調査に基づいて、select() を使用しない多くの実装を見てきました。どうしてこれなの?

また、理想的には、できるだけ多くの CPU を解放したいと考えています。パケットを受信するまでプロセスをスリープ状態にする方法はありますか? そうは言っても、簡単にするために、一度に完全なパケットを受け取りたいと思います。

助けてくれてありがとう。

4

4 に答える 4

2

recvfromブロック中またはがイベントを待機中の場合select、プロセスは事実上スリープ状態になります。つまり、実行するようにスケジュールされていません。したがって、既存のコード (少なくとも説明を正しく解釈している場合) は、最初の要件を既に満たしています。

パケットを受信するまでプロセスをスリープ状態にする方法はありますか?

UDP は「データグラム パケット サービス」です。(から引用man 7 udp)。つまり、常に完全なパケットを送受信します。したがって、UDP を使用すると、2 番目の要件について心配する必要はありません。

簡単にするために、一度に完全なパケットを受信したいと思います。

全体として、問題はないと思います。

select()ただし、単一の記述子でのみ待機している場合は、呼び出しを削除できる場合がsetsocketopt() SO_RCVTIMEOあります (おそらくできると仮定しますが、Posix では個々の実装でオプションの設定を許可しないため、絶対的な保証ではありません。)そうすることでパフォーマンスの向上に気付くかどうかは疑問ですが、数マイクロ秒節約できるはずです。

于 2013-06-15T06:34:48.770 に答える
1

パケットを受信するまでプロセスをスリープ状態にする方法はありますか?

あなたはすでにそれをやっています。それが select() やブロッキングモードの recvfrom() です。

簡単にするために、一度に完全なパケットを受信したいと思います。

それが、UDP がすでに行っていることです。

于 2013-06-15T07:19:00.810 に答える
0

これが役立つかもしれません:10kの問題

于 2013-06-15T07:15:30.193 に答える
0
I can just set the timeout of the recvfrom() command itself

select が 1 つのファイル記述子 (例: ソケット) のみを待機する場合、提案した内容と大きな違いはありません。しかし、これが複数を管理する場合、これに対するより良い解決策は実際にはありません。

于 2013-08-04T20:34:11.277 に答える