OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
締切り
済み

複数スレッドを動作させるのに必要なメモリ

  • すぐに回答を!
  • 質問No.241189
  • 閲覧数91
  • ありがとう数2
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 50% (1/2)

今回、最大256個のソケットハンドルをもつプロセスのパフォーマンスを向上させるため、1ソケットに対して1つのスレッドを割り当ててデータの送受信を行おうと思っているのですが、256個ものスレッドが起動された場合どれくらいのメモリを必要とするのでしょうか。また最大何個までのスレッドを持たせることが出来るのか、知っている方どうぞ教えてください。
なにかの本にスレッドを多く持つとオーバーヘッドが多くなり、逆にパフォーマンスが悪くなることもあるとありました。スレッド化する以外に何か良い方法があればそれも教えてください。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 34% (574/1662)

まず、メモリの必要量はOS、コンパイラ等がわからないと回答不能ですね。 わかっても、回答できるとは限りませんが。 スレッド数にしてもそうです。 また、設定等で変更できる可能性もあります。 次に、スレッドを256個と作るとパフォーマンスが上がると考えた理由はなんでしょうか。 処理内容,OS等によって変わりますが、単に256個のソケットがあるからという理由程度なら、 パフォーマンスは向上し ...続きを読む
まず、メモリの必要量はOS、コンパイラ等がわからないと回答不能ですね。
わかっても、回答できるとは限りませんが。
スレッド数にしてもそうです。
また、設定等で変更できる可能性もあります。


次に、スレッドを256個と作るとパフォーマンスが上がると考えた理由はなんでしょうか。
処理内容,OS等によって変わりますが、単に256個のソケットがあるからという理由程度なら、
パフォーマンスは向上しないでしょう。


また、256ものソケットハンドルを同時に使う必要があるかです。
必要なケースもあるでしょうが、ほんとうに必要ですか?
だいたい、256も同時に使えない可能性もあると思います。


スレッドを増やせば、ごくわずかという可能性もありますが、それでもオーバーヘッドは確実に増えます。
それでも使う理由は、例えば,
スレッドを作ることで、プログラムが簡潔に書けるとか、
処理の途中でなんらかの待ちがあるので、その時に平行して進めて起きたい処理があるとか、
マルチCPUのシステムを使っていて、スレッドが別々のCPUで処理されて、パフォーマンスが上がる可能性があるとか、
何らかのメリットがあるから使うはずです。


これ以上は具体的にどんなことがやりたいか、実行する環境(マシン,OS等)か等がわからないと、書けません。
補足コメント
cocoa-milk

お礼率 50% (1/2)

terra5さん早速の回答ありがとうございます。大変参考になりました。

質問内容があいまいだったので補足すると、OSはWindowsNTでVC++で作成し、複数端末とServer間のGWとして動作します。

現時点では1プロセスで(スレッドは使わず)実現しているのですが、そうすると
回線速度の遅い端末へ大量のデータを送信している間、他の端末への送信が行えず
かなり待たされてしまうので、データ送信はスレッド化してしまおうと考えました。

256個というのは理論値で実際には30くらいの端末を接続しています。
実装上問題がなければ256のソケットが同時並行して送受信できるように作っておきたいのです。アドバイスよろしくお願いします。
投稿日時 - 2002-03-26 10:30:01
  • 回答No.2
レベル13

ベストアンサー率 34% (574/1662)

スレッドを使わない方法としては、 I/Oの完了を待たず、完了をイベントなりなんなり知り 処理を実行するような手があります。 非同期I/OとかNO WAIT I/OとかNone delay I/Oとか呼ぶと思いますが、正確な用語は覚えてません(^^;; 通常のI/Oはたとえば、readすればそれが終わるまでプロセスが停止することが多いですが, OSに対してリクエストだけして完了を待たずに 関 ...続きを読む
スレッドを使わない方法としては、
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とするのがいいように思います。

スレッドあたりの具体的なメモリ消費量はわかりません(^^;
まあ、スレッド生成時にスタックサイズを指定するので、最低それだけは余分に使うとは言えますが。


あとは、スレッドを使ってのプログラムの作成経験がどの程度あるかが気になります。
各種排他管理とか、ライブラリの制限とか、優先度とか
いろいろと気にすることが増えますので。
お礼コメント
cocoa-milk

お礼率 50% (1/2)

色々詳しく書いていただき、ありがとうございました。
おかげでなんとなくですが修正方針が見えてきた気がします。
スレッド使用経験はというと、随分前にバックグランド印刷処理をプログラムしたくらいです。
今回はスレッドの数も多くなるし、色々気をつけないといけませんね。
ありがとうございました。
投稿日時 - 2002-03-28 01:14:08
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ