2013-05-23 14 views
7

Windowsプロセスでは、一度に使用されるスレッドに制限があります。そうであれば、プロセスごとに使用できるスレッドの最大数はいくらですか?プロセスがウィンドウ内に持つことができるスレッドの最大数は何ですか?

+0

あなたはhttps://www.google.de/#q=What+is+the+maximum+number+of+threads+a+process+を試してみました既に+ in + windowsを持つことができますか? –

+0

私はこれをテストしました。私の64ビットVistaの究極のものは〜7000スレッド以上を作成することを拒否し、正確な数字を覚えることはできません。 –

+5

これは単なる「本当の疑問」ではなく、貴重なものです。制限が16または32でないこと、または無駄に小さい数であることはすぐには分かりません。さらに、「ここで何が尋ねられるのか分かりにくい」という些細なことでもなく、あいまいさや曖昧さなどもありません。私はそのような質問を閉じる人々が、質問が他の人に自分自身に提供しないでください。この質問は、私が知りたいと思ったことを正確に尋ね、答えは非常に役立ちました。 ESP経由でそれ以外のことをどうやって知っていたのですか?経験? omatai

答えて

4

は、私の知っている制限はありませんが、二つの実用的な限界がある:スタックのための

  1. 仮想空間。例えば、32ビットでは、プロセスの仮想空間は4GBですが、一般的な使用には約2Gしか使用できません。デフォルトでは、各スレッドは1MBのスタック領域を確保するため、最高値は2000スレッドです。当然ながら、スタックのサイズを変更してスレッド数を減らすことができます(パラメータdwStackSizeCreateThread、リンカコマンドのオプションは/STACK)。 64ビットシステムを使用する場合、この制限は事実上消えます。
  2. スケジューラオーバーヘッド。何千ものスレッドを読んだら、スケジューリングするだけでCPU時間の100%近くを食べるので、とにかく役に立たない。これは厳しい制限ではなく、作成するスレッドの数が増えるにつれてプログラムが遅くなり、遅くなります。
+0

まあ、スレッドの状態に依存します。 6000のブロックされたスレッドは、私のマシンの動作に影響しません。また、たとえスレッドが準備完了/実行中であったとしても、16スレッドまたは1600を持っていれば大したことになりません。どちらの場合でも4/8コアが最大になります。 –

+0

@MartinJames:カーネルスケジューラがスレッドテーブルのサイズで次のスケーリングを実行するかどうかを決定するために使用するアルゴリズムです。間違いなく、詳細はWindowsのバージョンによって異なりますが、私はWinXPで 'for(); Sleep(1000)'だけで2000スレッドを作成し、CPU使用率は80%を超えたことを覚えています。 – rodrigo

+0

IIRCでは、readdtスレッド構造は、基本的にスレッド情報ブロックポインタの優先度順のキューの配列です。 1つのキューに2000個のエントリがあるがコアが4つしかない場合は、タイマー割り込みでスレッドの周りをシャトルするだけで、「古い」4つのスレッドをバックでプッシュし、4つの「新しい」スレッドを前面からポップする必要があります。待ち行列が長い。それは長くかかることはありませんか? –

1

実際の制限は、さまざまな方法で使用可能なメモリの量によって決まります。 Windowsでは、「これ以上多くのスレッドやプロセスを持つことはできません」という制限はありませんが、システム内で使用できるメモリの量には限界があります。スレッド。

マークRussinovich氏によるこのブログを参照してください: http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

関連する問題