今回、最大256個のソケットハンドルをもつプロセスのパフォーマンスを向上させるため、1ソケットに対して1つのスレッドを割り当ててデータの送受信を行おうと思っているのですが、256個ものスレッドが起動された場合どれくらいのメモリを必要とするのでしょうか。また最大何個までのスレッドを持たせることが出来るのか、知っている方どうぞ教えてください。
なにかの本にスレッドを多く持つとオーバーヘッドが多くなり、逆にパフォーマンスが悪くなることもあるとありました。スレッド化する以外に何か良い方法があればそれも教えてください。
No.2ベストアンサー
- 回答日時:
スレッドを使わない方法としては、
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とするのがいいように思います。
スレッドあたりの具体的なメモリ消費量はわかりません(^^;
まあ、スレッド生成時にスタックサイズを指定するので、最低それだけは余分に使うとは言えますが。
あとは、スレッドを使ってのプログラムの作成経験がどの程度あるかが気になります。
各種排他管理とか、ライブラリの制限とか、優先度とか
いろいろと気にすることが増えますので。
色々詳しく書いていただき、ありがとうございました。
おかげでなんとなくですが修正方針が見えてきた気がします。
スレッド使用経験はというと、随分前にバックグランド印刷処理をプログラムしたくらいです。
今回はスレッドの数も多くなるし、色々気をつけないといけませんね。
ありがとうございました。
No.1
- 回答日時:
まず、メモリの必要量はOS、コンパイラ等がわからないと回答不能ですね。
わかっても、回答できるとは限りませんが。
スレッド数にしてもそうです。
また、設定等で変更できる可能性もあります。
次に、スレッドを256個と作るとパフォーマンスが上がると考えた理由はなんでしょうか。
処理内容,OS等によって変わりますが、単に256個のソケットがあるからという理由程度なら、
パフォーマンスは向上しないでしょう。
また、256ものソケットハンドルを同時に使う必要があるかです。
必要なケースもあるでしょうが、ほんとうに必要ですか?
だいたい、256も同時に使えない可能性もあると思います。
スレッドを増やせば、ごくわずかという可能性もありますが、それでもオーバーヘッドは確実に増えます。
それでも使う理由は、例えば,
スレッドを作ることで、プログラムが簡潔に書けるとか、
処理の途中でなんらかの待ちがあるので、その時に平行して進めて起きたい処理があるとか、
マルチCPUのシステムを使っていて、スレッドが別々のCPUで処理されて、パフォーマンスが上がる可能性があるとか、
何らかのメリットがあるから使うはずです。
これ以上は具体的にどんなことがやりたいか、実行する環境(マシン,OS等)か等がわからないと、書けません。
この回答への補足
terra5さん早速の回答ありがとうございます。大変参考になりました。
質問内容があいまいだったので補足すると、OSはWindowsNTでVC++で作成し、複数端末とServer間のGWとして動作します。
現時点では1プロセスで(スレッドは使わず)実現しているのですが、そうすると
回線速度の遅い端末へ大量のデータを送信している間、他の端末への送信が行えず
かなり待たされてしまうので、データ送信はスレッド化してしまおうと考えました。
256個というのは理論値で実際には30くらいの端末を接続しています。
実装上問題がなければ256のソケットが同時並行して送受信できるように作っておきたいのです。アドバイスよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- CPU・メモリ・マザーボード インテルCPUの世代ごとのデスクトップとノートのコア数についてこれで正しいですか?(*´ω`*) 1 2023/01/07 14:44
- グループウェア slackについて取り急ぎ教えて頂きたいことがあります 2 2022/04/08 09:05
- BTOパソコン PCの選び方 6 2022/09/11 00:16
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 政治 Yahoo知恵袋について質問です。あそこの政治経済のスレッドですが、ここはいったいあそこは何なのです 4 2022/06/18 22:10
- その他(ゲーム) マイクラ(java)のfpsがなぜか30前後しか出ません。 1 2022/09/19 17:27
- CPU・メモリ・マザーボード FF14をやるにあたって 3 2022/09/16 22:28
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VC++スレッドの正しい終了のさ...
-
Windows上で、シグナル(SIGTERM...
-
MFC通信プログラムマルチスレッ...
-
スレッドにて同一メモリの書き...
-
マルチスレッドについて
-
自作クラスのイベントを外部ハ...
-
ユーザーインターフェイスの一...
-
.netアプリへのSendMessageでフ...
-
特定のスレッドの破棄
-
C++ GUIのメッセージループ。
-
マルチスレッドプログラムでメ...
-
excelvbaでCreateThreadの動作
-
スレッドの終了の仕方
-
msec単位のWait Timerが作れない!
-
別スレッドとイベントの終了手...
-
スレッドの終了はどうやるんで...
-
Linuxでスレッド優先度って変え...
-
_beginthreadexについて
-
DirectX LPDIRECT3DDEVICE9のマ...
-
Macターミナルで実行中のプログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
WaitForSingleObjectの使い方に...
-
VC++スレッドの正しい終了のさ...
-
スレッドの監視方法について
-
スレッドの安全な終了のさせ方
-
スレッドにて同一メモリの書き...
-
Windows上で、シグナル(SIGTERM...
-
スレッドの終了の仕方
-
スレッドの終了はどうやるんで...
-
VB2005 シリアル通信のClose処理
-
マルチスレッドプログラミング...
-
.netアプリへのSendMessageでフ...
-
マルチスレッドについて
-
Linuxでスレッド優先度って変え...
-
Win32APIでのスレッド処理
-
pthread_cond_wait 取りこぼし?
-
LinuxでDoEvents()同等機能
-
C++ GUIのメッセージループ。
-
excelvbaでCreateThreadの動作
-
マルチスレッドの実行順序の制御
-
同一スレッドで、ロックをかけ...
おすすめ情報