• 締切済み

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

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

みんなの回答

  • terra5
  • ベストアンサー率34% (574/1662)
回答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とするのがいいように思います。 スレッドあたりの具体的なメモリ消費量はわかりません(^^; まあ、スレッド生成時にスタックサイズを指定するので、最低それだけは余分に使うとは言えますが。 あとは、スレッドを使ってのプログラムの作成経験がどの程度あるかが気になります。 各種排他管理とか、ライブラリの制限とか、優先度とか いろいろと気にすることが増えますので。

cocoa-milk
質問者

お礼

色々詳しく書いていただき、ありがとうございました。 おかげでなんとなくですが修正方針が見えてきた気がします。 スレッド使用経験はというと、随分前にバックグランド印刷処理をプログラムしたくらいです。 今回はスレッドの数も多くなるし、色々気をつけないといけませんね。 ありがとうございました。

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

まず、メモリの必要量はOS、コンパイラ等がわからないと回答不能ですね。 わかっても、回答できるとは限りませんが。 スレッド数にしてもそうです。 また、設定等で変更できる可能性もあります。 次に、スレッドを256個と作るとパフォーマンスが上がると考えた理由はなんでしょうか。 処理内容,OS等によって変わりますが、単に256個のソケットがあるからという理由程度なら、 パフォーマンスは向上しないでしょう。 また、256ものソケットハンドルを同時に使う必要があるかです。 必要なケースもあるでしょうが、ほんとうに必要ですか? だいたい、256も同時に使えない可能性もあると思います。 スレッドを増やせば、ごくわずかという可能性もありますが、それでもオーバーヘッドは確実に増えます。 それでも使う理由は、例えば, スレッドを作ることで、プログラムが簡潔に書けるとか、 処理の途中でなんらかの待ちがあるので、その時に平行して進めて起きたい処理があるとか、 マルチCPUのシステムを使っていて、スレッドが別々のCPUで処理されて、パフォーマンスが上がる可能性があるとか、 何らかのメリットがあるから使うはずです。 これ以上は具体的にどんなことがやりたいか、実行する環境(マシン,OS等)か等がわからないと、書けません。

cocoa-milk
質問者

補足

terra5さん早速の回答ありがとうございます。大変参考になりました。 質問内容があいまいだったので補足すると、OSはWindowsNTでVC++で作成し、複数端末とServer間のGWとして動作します。 現時点では1プロセスで(スレッドは使わず)実現しているのですが、そうすると 回線速度の遅い端末へ大量のデータを送信している間、他の端末への送信が行えず かなり待たされてしまうので、データ送信はスレッド化してしまおうと考えました。 256個というのは理論値で実際には30くらいの端末を接続しています。 実装上問題がなければ256のソケットが同時並行して送受信できるように作っておきたいのです。アドバイスよろしくお願いします。

関連するQ&A

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • タスクマネージャ

    タスクマネージャのパフォーマンスのハンドル,スレッド,プロセスとコミットチャージ(合計,制限,最大値)の意味を教えてもらいたいのですが。よろしくお願いします。

  • タスクマネージャーのコミットチャージ等の意味

    WINDOWS XPのタスクマネージャー のパフォーマンスを見たところ コミットチャージ:396MB/1246MB CPU使用率 5% プロセス:30 コミットチャージの意味をおしえてください。 またハンドルの意味をおしえてください。 よろしくお願いします。 以下ある状態のデータ値 ーーーーーーーーーーーーーー 合計 ハンドル 6309 スレッド 294 プロセス 30 PF(ページファイル使用量)395MB 物理メモリ(KB) 522224 コミットチャージ(KB): 合計 405794 制限値 1276252 最大値 406616 となっていました 合計値の405794とかは絶えず値が変動

  • メモリ使用量について

    パソコンのメモリ使用量が今どれくらいなのか知りたいのですが、 タスクマネージャーの物理メモリやらシステムキャッシュとか??なのでメモリについて詳しい方具体的(タスクマネージャー全般の数字ついてや今パソコンがどういう状況にあるかなど)に教えていただけないでしょうか? m(__)mよろしくお願いいたします。 ■参考 合計 ハンドル   8600 スレッド   433 プロセス    38 物理メモリ 合計        1562672 利用可能       1147700 システムキャッシュ  561860 コミットチャージ 合計   357900 制限値  2969244 最大値  363132 カーネルメモリ 合計    83744 ページ   55624 非ページ  28252 (イラストレーターとIEを起動させている状態です)

  • WINDOWS98の最大メモリは32MBですか?

    ウィンドウズ98のメモリ増設によるパフォーマンス向上は、限界があり最大32MBという資料を見たのですが、それ以上のメモリを積んでも意味がないということでしょうか? メモリは多いほどパフォーマンス向上に役立つと思っていましたが、間違っていたのか不安になりました (出典:マイクロソフトMSSエッセンシァルセミナーテキスト 2-15)

  • メモリ不足

    起動時の空きメモリは1300mb位あるのですが、起動後7分で50mbになってしまいます。そしてメモリ不足ですとのメッセージが時々現れて作業ができなくなります。 タスクマネージャーのパーフォーマンスタブに表示されている情報を書きますと、次のような感じです。 物理メモリ(MB) 合計         3261 キャッシュ済み   2165 空きメモリ         3 システム    ハンドル 19745 スレッド 836 プロセス 82 起動時間 ページファイル 1366m/8088m OSはVISTAです。 メモリ不足解消方法をご存知の方教えてください。

  • 既存プロセスからプロセスのプライマリースレッドIDの取得方法

    いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

  • パソコンの動作が遅いです!

    最近、PCの動作が全体的にかなり遅いです。(インターネットも含めて)メモリを増設しようか考えているのですけれど、以下情報でメモリ増設で効果が得られるか判断お願いします。 ■PC情報 メーカー:IBM CPU:Celeron(R)CPU 2.80GHz メモリ:512MB  <タスクマネージャーより> IEのみ起動しているときに調査。 ・CPU使用率 100% ・PF使用率 469MB ・合計 ハンドル 13902     スレッド 616     プロセス 60 ・コミットチャージ(KB) 合計 480340              制限値 1255780              最大値 605648 ・物理メモリ(KB) 合計 513136           利用可能 86644           システムキャッシュ 206028 ・カーネルメモリ(KB) 合計 54928             ページ 42796             非ページ 12132  以上、宜しくお願い致します。

  • メモリかHDDの交換をしたほうがいいのでしょうか

    たびたび、動作や起動が遅くなるのでメモリやHDDの交換を考えています。 システム WindowsXP Home Edition version2002 SP2 intel(R) Pentium(R)4 CPU 3.20GHz 3.19GHz,504 MB RAM C:残り 約4GB/30GB D:残り 約50GB/245GB (Dはテレビの録画等に使用しています。) Windows タスクマネージャ パフォーマンス 合計 ハンドル 15464 スレッド 651 プロセス 64 コミットチャージ(KB) 合計  約800000 制限値 1256260 最大値 882760 物理メモリ(KB) 合計  514092 利用可能 約50000 システムキャッシュ 約12900 カーネルメモリ(KB) 合計 110860 ページ 84280 非ページ 26576 です。この状態での交換は意味あるのでしょうか? HDDの交換はCドライブです。 また、動作が遅くなるのはそれ以外にあるのでしょうか。 ウイルスソフトはNorton360です。

  • メモリ増設したのですが有効に機能しているのでしょうか?

    動画編集などの重いアプリケーションには有効と思いメモリを2Gに増設したのですが、実際に有効に機能しているのかわかりません。 増設したメモリを最大限利用して、PCのパフォーマンスを向上させたいのですが、必要な設定などがありましたらお教え願います。 添付したデータは、DVD映像をPCに取り込んでいる最中のタスクマネージャですが、参考になりますでしょうか? 物理メモリはあまり使用されていないように思うのですが・・・

専門家に質問してみよう