1

ベアwinsock2上にC++で構築された、動作するマルチクライアント、シングルスレッドのTCP/IPサーバーアプリケーションがあります。その中心はselect()、新しい作業が行われるのを待つために使用されます。同時クライアントの数を数百または数千に拡張することを考えていますが、実際にはほとんどアイドル状態です。私のアーキテクチャは、接続されたアイドル状態のクライアントにほとんどメモリを使用しません。

それぞれの前に、読み取り状態のクライアントソケットと、リスニングソケット(新しい接続を受け入れるため)select()を構築します。書き込み状態のfd_set別のソケット。fd_set次に、select()これらをスキャンして、ソケット番号から、どのクライアントを対象としていたかを再構築します。このfd_set構築とスキャンは、客観的には現在のCPUのボトルネックではありませんが、私を不安にさせます。トランザクションあたりの作業量は、クライアントの数に比例して増加します。でデフォルトの64ソケットの制限を超える方法はわかりますが、fd_setそのルートを使用するのは気が進まないです。

2つのスレッドを使用する方法が漠然とわかります。1つは最もアクティブな少数のクライアントを処理し、もう1つはアイドル状態のクライアントの大部分を処理します。それは実行可能に思えますが、少し複雑です。

select()だから: winsock2の下に代わるものは何ですか?

4

1 に答える 1

1

ご覧のとおりselect()、1回の呼び出しで処理できるソケットの数には上限があります。スケーラビリティが問題になる場合は、代わりに重複I/OまたはI/O完了ポートを使用する必要があります。これにより、必要に応じて個々のソケットに対して読み取り/書き込み操作を発行でき、作業が終了するとOSから通知が届くので、ポーリングする必要はありません。

于 2012-12-11T20:12:40.027 に答える