0

私のサーバーはノンブロッキングソケット多重化を使用しています。着信接続を受信して​​入力を処理するために 1 つのスレッドを使用し、ソケットを介してデータを送信するために別のスレッドを使用したいと考えています。次のようになります。

reader_worker(...)
{
    ...
    select(fd_max+1, &read_set, NULL, NULL, NULL);
    ...
}

writer_worker(...)
{
    ...
    select(fd_max+1, NULL, &write_set, NULL, NULL);
    ...
}

着信接続を見逃したくないので、別々のスレッドで送受信する方がよいと想像できます。read_set と write_set にある可能性のあるソケットをロックする必要がありますか? これは正しいアプローチですか、それともこの方法ではパフォーマンスが向上しませんか?

4

1 に答える 1

1

1つのスレッドで接続を行う場合、着信接続を見逃すことはありません。送信または受信するデータが大量にある場合でも、send()またはrecv()呼び出しの遅延は、ネットワークスタック内のローカルバッファーのサイズによって決定されるため、着信接続を受け入れるためにすぐに戻ります。

ただし、コードサンプルについてよくわからない場合は、次の2つがあります。

  • 接続を受け入れるためのソケットを、単一のselect()呼び出しで使用するために受け入れられた接続と同じ配列に配置します。異なるネットワークインターフェイスにバインドしない限り、複数のスレッドを使用してもプログラムの実行速度は向上しません。
  • 受信データを処理している場合、ここで2番目のスレッドが役立ちます。一般に、ネットワークインターフェイスカード、CPU、ハードディスクなどのリソースがあります。リソースごとに1つのスレッドを用意すると便利です。つまり、1つはネットワークIO(要求の受信、応答の送信)を処理し、もう1つは実際の要求を処理します。複数のコアがある場合は、CPUにバインドされたタスクであれば、要求を処理するために複数のスレッドを利用することもできます。これらの要求が単一のハードディスクから画像を提供することだけである場合、要求に複数のスレッドを使用しても、パフォーマンスを向上させることはできません。
于 2013-01-19T22:28:52.457 に答える