2

p2p ではなく、クライアント サーバー ベースのインスタント メッセージング アプリケーションがあるとします。実際のプロトコルは問題ではなく、重要なのはサーバー アーキテクチャです。上記のサーバーは、非ブロック ソケットを使用してシングルスレッドの非並列モードで動作するようにコーディングできます。これにより、定義により、読み書きなどの操作を効果的に即時 (または瞬時) に実行できます。ノンブロッキング ソケットのまさにこの機能により、サーバーのコアである種の選択/ポーリング機能を使用し、実際のソケットの読み取り/書き込み操作でほとんど時間を無駄にすることなく、このすべての情報の処理に時間を費やすことができます。 . 私が理解している限り、適切にコーディングされていれば、これは非常に高速になる可能性があります。しかし、2 番目のアプローチがあります。それは積極的にマルチスレッド化し、新しいスレッドを作成することです (明らかに、ある種のスレッド プールを使用して、その操作そのものが、一部のプラットフォームや状況下では (非常に) 遅くなる可能性があるため)、メインのバックグラウンド スレッドが accept() などを処理している間、これらのスレッドを並行して動作させることができます。このアプローチがネット上のさまざまな場所で説明されているのを見たので、明らかに存在します。

問題は、非ブロッキング ソケット、即時の読み取り/書き込み操作、およびシンプルで簡単にコーディングできる設計がある場合、なぜ 2 番目のバリアントが存在するのでしょうか? 2 番目の設計、つまりスレッドで克服しようとしている問題は何ですか? 私の知る限り、これらは通常、遅くてブロックする可能性のある操作を回避するために使用されますが、そのような操作は存在しないようです!

4

1 に答える 1

1

クライアントごとにスレッドを持つことについて話しているのではなく、通常、そのような設計はまったく異なる理由であると想定していますが、スレッドのプールはそれぞれ複数の同時クライアントを処理します。

そのアーキテクチャとシングル スレッド サーバーの理由は、単純に複数のプロセッサを利用するためです。単なる I/O よりも多くの作業を行っています。メッセージを解析し、さまざまな作業を行う必要があり、場合によっては、より重い暗号アルゴリズムを実行することさえあります。これにはすべて CPU が必要です。スケーリングする場合は、複数のプロセッサを利用することで、さらにスケーリングしたり、クライアントごとのレイテンシをさらに低く保つことができます。

このような設計での利点の一部は、マルチスレッド環境でより多くのロックが必要になる可能性があるという事実によって少し相殺される可能性がありますが、正しく行われ、何をしているかにもよりますが、それは大きな勝利になる可能性があります-犠牲を払ってより複雑に。

また、これは OS の制限を克服するのに役立つ場合があります。カーネル内の I/O パスは、プロセッサ間でより分散される可能性があります。すべてのオペレーティング システムが、シングル スレッド アプリケーションから IO を完全にスレッド化できるわけではありません。昔は、ファイル記述子の制限が通常 1024 であった古い *nix select() に代わる優れた代替手段がすべてあるわけではありませんでした。同様の API は、あまりにも多くのソケットを監視するように指示すると、著しく劣化し始めました。これらすべてのクライアントを複数のスレッドまたはプロセスに分散させることで、この制限を克服することができました。

スレッド間の 1:1 マッピングに関しては、そのアーキテクチャを実装する理由がいくつかあります。

  • より簡単なプログラミング モデル。これにより、バグを見つけるのが難しくなり、実装が速くなります。

  • ブロッキング API をサポートします。これらはいたるところにあります。スレッドがクライアントの多く/すべてを処理してから、データベースへのブロッキング呼び出しを実行すると、全員が失速します。ファイルの読み取りでもアプリケーションがブロックされる可能性があり、通常、IO イベントの通常のファイル ハンドル/記述子を監視することはできません。または、監視できる場合でも、プログラミング モデルは非常に複雑であることがよくあります。

ここでの欠点は、少なくとも最も広く使用されている言語/フレームワークでは拡張できないことです。何千ものネイティブ スレッドがあると、パフォーマンスが低下します。ただし、一部の言語では、Erlang やある程度 Go など、はるかに軽量なアプローチが提供されています。

于 2011-01-13T18:23:32.093 に答える