- 締切済み
複数スレッドを動作させるのに必要なメモリ
今回、最大256個のソケットハンドルをもつプロセスのパフォーマンスを向上させるため、1ソケットに対して1つのスレッドを割り当ててデータの送受信を行おうと思っているのですが、256個ものスレッドが起動された場合どれくらいのメモリを必要とするのでしょうか。また最大何個までのスレッドを持たせることが出来るのか、知っている方どうぞ教えてください。 なにかの本にスレッドを多く持つとオーバーヘッドが多くなり、逆にパフォーマンスが悪くなることもあるとありました。スレッド化する以外に何か良い方法があればそれも教えてください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- terra5
- ベストアンサー率34% (574/1662)
スレッドを使わない方法としては、 I/Oの完了を待たず、完了をイベントなりなんなり知り 処理を実行するような手があります。 非同期I/OとかNO WAIT I/OとかNone delay I/Oとか呼ぶと思いますが、正確な用語は覚えてません(^^;; 通常のI/Oはたとえば、readすればそれが終わるまでプロセスが停止することが多いですが, OSに対してリクエストだけして完了を待たずに 関数から戻るような処理が書けます。 あとは、ポーリングするなり、コールバックなり、 イベントなりでI/Oの完了を知り、次の処理を行うようにすれば、 I/O待ちでプログラムが停止することはなくなります。 WindowsではCreateFileで FILE_FLAG_OVERLAPPED のがそれです。 今回のケースでは、端末一つに対してスレッドを生成して処理する方がいいような気がしますが。 スレッドは動的に必要なだけ生成し、その上限を256とするのがいいように思います。 スレッドあたりの具体的なメモリ消費量はわかりません(^^; まあ、スレッド生成時にスタックサイズを指定するので、最低それだけは余分に使うとは言えますが。 あとは、スレッドを使ってのプログラムの作成経験がどの程度あるかが気になります。 各種排他管理とか、ライブラリの制限とか、優先度とか いろいろと気にすることが増えますので。
- terra5
- ベストアンサー率34% (574/1662)
まず、メモリの必要量はOS、コンパイラ等がわからないと回答不能ですね。 わかっても、回答できるとは限りませんが。 スレッド数にしてもそうです。 また、設定等で変更できる可能性もあります。 次に、スレッドを256個と作るとパフォーマンスが上がると考えた理由はなんでしょうか。 処理内容,OS等によって変わりますが、単に256個のソケットがあるからという理由程度なら、 パフォーマンスは向上しないでしょう。 また、256ものソケットハンドルを同時に使う必要があるかです。 必要なケースもあるでしょうが、ほんとうに必要ですか? だいたい、256も同時に使えない可能性もあると思います。 スレッドを増やせば、ごくわずかという可能性もありますが、それでもオーバーヘッドは確実に増えます。 それでも使う理由は、例えば, スレッドを作ることで、プログラムが簡潔に書けるとか、 処理の途中でなんらかの待ちがあるので、その時に平行して進めて起きたい処理があるとか、 マルチCPUのシステムを使っていて、スレッドが別々のCPUで処理されて、パフォーマンスが上がる可能性があるとか、 何らかのメリットがあるから使うはずです。 これ以上は具体的にどんなことがやりたいか、実行する環境(マシン,OS等)か等がわからないと、書けません。
補足
terra5さん早速の回答ありがとうございます。大変参考になりました。 質問内容があいまいだったので補足すると、OSはWindowsNTでVC++で作成し、複数端末とServer間のGWとして動作します。 現時点では1プロセスで(スレッドは使わず)実現しているのですが、そうすると 回線速度の遅い端末へ大量のデータを送信している間、他の端末への送信が行えず かなり待たされてしまうので、データ送信はスレッド化してしまおうと考えました。 256個というのは理論値で実際には30くらいの端末を接続しています。 実装上問題がなければ256のソケットが同時並行して送受信できるように作っておきたいのです。アドバイスよろしくお願いします。
お礼
色々詳しく書いていただき、ありがとうございました。 おかげでなんとなくですが修正方針が見えてきた気がします。 スレッド使用経験はというと、随分前にバックグランド印刷処理をプログラムしたくらいです。 今回はスレッドの数も多くなるし、色々気をつけないといけませんね。 ありがとうございました。