1

Bittorrent クライアントを実装しようとしています。異なるピアからピースを受け取るために、クライアントは複数のソケットを管理する必要があります。

私が知っているよく知られた解決策は

  • 1. 各スレッドには 1 つのソケットがあります。
  • 2.select()呼び出し、ノンブロッキング I/O を使用します。
  • 3. 1 と 2 の混合。

    最初の解決策では、必要なスレッドが多すぎます。2 番目の解決策は、最大 50 個のソケットをチェックし続けるため、CPU 時間を浪費します。また、3 番目のソリューションを使用することを決定したとき、1 つのプロセスが使用するスレッドの数がわかりません。

    かなり大きなファイルを受け取るには、どのソリューションが最適ですか?
    良い解決策を教えてくれる Web ページはありますか?

    どんなアドバイスも素晴らしいでしょう。

  • 4

    3 に答える 3

    1

    そうです、最初の解決策は最悪です。2 番目のものselect()は仕事をすることができますが、問題があります: select()log(n) の複雑さがあります。/dev/poll、、または何でも使用する必要がありますがepoll()kqueue()使用しないでくださいselect()

    ソケットごとに 1 つのスレッドを使用しないでください !! コンテキストの切り替えにより、多くの時間が失われます。

    あなたが持っている必要があります:

    • リスナー スレッド : すべてを実行しaccept、新しいソケットをワーカー スレッドに配置するだけです。
    • 複数のワーカー スレッド: 他のすべての作業を行います。利用可能なデータがあるかどうかを確認し、それを処理します。ワーカー スレッドは、多くのソケットを管理します。

    詳細については、Kegel の c10k ページをご覧ください。

    于 2013-07-03T12:31:03.353 に答える