44

最初に、私はどの州でどれが最高かを尋ねなければなりませんか?たとえば、リアルタイムMMORPGサーバー。非ブロッキングソケットを使用する代わりに、クライアントごとにスレッドを作成するとどうなりますか?または、すべての非ブロッキングソケットを含む1つのスレッドを使用するとどうなりますか?利点を説明してもらえますか?

4

2 に答える 2

38

あなたの質問はもっと長い議論に値しますが、ここに答えの簡単な刺し傷があります:

  • ブロッキング ソケットを使用するということは、任意の 1 つのスレッドで常に 1 つのソケットしかアクティブにできないことを意味します (アクティビティの待機中にブロックされるため)。
  • ブロッキング ソケットの使用は、一般に非ブロッキング ソケットよりも簡単です (非同期プログラミングはより複雑になる傾向があります)。
  • あなたが述べたように、ソケットごとに1つのスレッドを作成できますが、スレッドにはオーバーヘッドがあり、非ブロッキングソリューションと比較して非常に非効率的です;
  • ノンブロッキング ソケットを使用すると、はるかに大量のクライアントを処理できます。1 つのプロセスで数十万に拡張できますが、コードは少し複雑になります。

ノンブロッキング ソケット (Windows の場合) には、いくつかのオプションがあります。

  • ポーリング
  • イベントベース
  • オーバーラップ I/O

重複した I/O は、正しく理解して実装するのが最も複雑なモデルであるという代償を払って、最高のパフォーマンス (数千のソケット/プロセス) を提供します。

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

ノート

以下は、スレッド/ソケット モデルを使用することが悪い考えである理由のより良い説明です。

Windows では、大量のスレッドを作成することは非常に非効率的です。これは、スケジューラーがプロセッサ時間を受け取るべきスレッドと受け取るべきでないスレッドを適切に判断できないためです。これは、各スレッドのメモリ オーバーヘッドと相まって、ソケット接続を処理する容量がなくなるずっと前に、OS レベルでメモリ (スタック領域のため) とプロセッサ サイクル (スレッド管理のオーバーヘッドのため) が不足することを意味します。 .

于 2012-05-18T14:19:36.623 に答える
10

おもちゃのプログラム以外のほとんどすべての場合、当然のことながらノンブロッキング ソケットを使用する必要があります。

ソケットのブロックは重大な問題を引き起こします。相手側のマシン (または接続の一部) がブロック呼び出し中に失敗した場合、コードは IP スタックのタイムアウトまでブロックされてしまいます。通常、これは約 2 分であり、ほとんどの目的ではまったく受け入れられません。そのブロッキング呼び出しを中止する唯一の方法1は、スレッドを作成したスレッドを終了することですが、スレッドを終了すること自体はほとんどの場合受け入れられません。スレッドの後にクリーンアップして、割り当てられたリソースを再利用することは本質的に不可能だからです。ノンブロッキング ソケットは、呼び出しを行ったスレッドに何もせずに、必要に応じて呼び出しを中止することを簡単にします。

代わりにマルチプロセス モデルを使用する、ブロッキング ソケットをうまく機能させることができます。ここでは、接続ごとにまったく新しいプロセスを生成するだけです。そのプロセスはブロッキングソケットを使用し、何か問題が発生した場合は、プロセス全体を強制終了します。OS はプロセスからリソースをクリーンアップする方法を知っているため、クリーンアップは問題になりません。ただし、他にも潜在的な問題があります。1) 必要に応じてプロセスを強制終了するには、プロセス モニターが必要であり、2) プロセスの生成は通常、ソケットを作成するよりもかなりコストがかかります。それにもかかわらず、これは特に次の場合に実行可能なオプションになる可能性があります。

  1. 一度に少数の接続を処理している
  2. 通常、接続ごとに広範な処理を行います
  3. ローカル ホストのみを扱うため、ローカル ホストへの接続は高速で信頼性があります
  4. 実行よりも開発の最適化に関心がある

1. 技術的に唯一可能な方法ではありませんが、代替案のほとんどは比較的醜いものです。より具体的に言えば、コードを追加して問題があることを把握し、問題を修正するまでには、ノンブロッキング ソケットを使用する場合よりも多くの余分な作業を行った可能性があります。

于 2012-05-18T15:25:36.543 に答える