2012-05-18 5 views
34

最初は、どちらが最善の状態であるかを尋ねる必要があります。例えば、リアルタイムのMMORPGサーバ。ノンブロッキングソケットを使用する代わりにクライアントごとにスレッドを作成するとどうなりますか?または、すべての非ブロックソケットを含むスレッドを使用するとどうなりますか?あなたは私に利点を説明できますか?ノンブロッキングまたはブロッキングソケットを使用する理由は何ですか?

答えて

29

ご質問がはるかに長い議論に値するが、ここでの答えに短い刺す:ブロックするソケットを使用して

  • は、1つのソケットだけが任意の1つのスレッドで任意の時点でアクティブにできることを意味し(それブロックので待っている間に)活性のために
  • は、ブロッキングソケットを使用することは一般的に、非ブロッキングソケットよりも簡単です(非同期プログラミングが複雑になる傾向がある)
  • あなたが述べたが、スレッドは、オーバーヘッドがあり、に比べて非常に非効率的であるとして、あなたはソケットごとに1つのスレッドを作成することができます非ブロッキング溶液;あなたは、クライアントの非常に大きなボリュームを扱うことができ、非ブロッキングソケットで
  • :それは単一プロセスで数十万人に拡張可能性が - が、コードは非ブロッキングソケットで

もう少し複雑になります

  • ベース
  • イベントがI/O
  • を重ね合わせ

    • ポーリング:(Windowsの場合)あなたはオプションのカップルを持っています

      オーバーラップI/Oは、正確に理解して実装する最も複雑なモデルではなく、最高のパフォーマンス(何千ものソケット/プロセス)を提供します。

      基本的に、パフォーマンスとプログラミングの複雑さが低下します。

      NOTE

      ここでスレッド/ソケットモデルを使用することが悪い考えである理由のより良い説明です:スケジューラができないため、Windowsで

      、多数のスレッドを作成するには、非常に非効率的ですどのスレッドがプロセッサ時間を受信すべきか、どのスレッドが受信すべきでないかを適切に決定する。これは、各スレッドのメモリオーバーヘッドと相まって、ソケット接続を処理する能力が足りなくなるまでにOSレベルで(スタックスペースのために)メモリ不足とプロセッササイクル(スレッド管理のオーバーヘッドのために)が不足することを意味します。

    +0

    あなたは80ウェイボックス上で実行している場合、あなたは何の問題は、スレッドの数百人をリッピングすることはできません。 –

    +0

    @John - 何百ものスレッドを作成することができます(十分なメモリがあれば)、それは良い考えではありません。実際、それは悪い考えです! –

    +9

    私の主張は、確かにうまく作られていないということです.20番に任意の行を描画し、それを超える数のスレッドを呼び出すことはできません。 –

    8

    私は、については、ほぼについては、おもちゃプログラム以外のものはもちろん、ノンブロッキングソケットを使用することをお勧めします。

    ブロッキングソケットは深刻な問題を引き起こします。ブロッキングコール中に相手側のマシン(またはその接続の一部)が失敗すると、コードはIPスタックのタイムアウトまでブロックされます。典型的なケースでは、それは約2分であり、ほとんどの場合、完全に受け入れられません。 は、そのブロッキングコールを中断する方法ですが、スレッドを終了させることはほとんど不可能です。スレッドを終了して、割り当てられたリソースを取り戻すことは本質的に不可能です。ノンブロッキングソケットを使用すると、必要に応じての呼び出しを中止することが簡単になります。は、呼び出しを行ったスレッドに何もしません。

    の場合、ブロックソケットをうまく動作させることができます。マルチプロセスモデルを使用してください。ここでは、接続ごとにまったく新しいプロセスを生成するだけです。そのプロセスはブロッキングソケットを使用します。何か問題が生じた場合は、プロセス全体を終了させるだけです。 OSはプロセスからリソースをクリーンアップする方法を知っているので、クリーンアップは問題ではありません。しかし、1)必要に応じてプロセスを殺すためにプロセスモニタが必要なこと、2)プロセスを生成することは、ソケットを作成するよりもかなりコストがかかることです。

  • あなたは、一般的にあなたが唯一扱っている
  • 各接続のための大規模な処理を行う

    1. 一度に接続の数が少ないを扱っている:それにもかかわらず、これは特に場合は、実行可能な選択肢であることができますローカルホストでので、それらへの接続は、高速かつ信頼性のある
    2. あなたは、実行

    より開発を最適化するともっと心配しています3210

    1.よく、技術的にはしか使用できませんが、代替案のほとんどは比較的醜いです。具体的には、問題があることを理解するためにコードを追加してから、問題を解決するには、ノンブロッキングソケットを使用するよりも、おそらく余計な作業をしたことでしょう。

  • +6

    他のスレッドコンテキストからソケットを切断してブロックされたスレッドを終了することなく、ブロックされたソケット操作を中止することは可能です。これにより、ブロックされた操作はエラーコードで失敗し、ブロックされたスレッドは通常のクリーンアップのように移動して他の処理を実行できます。 –

    関連する問題