5

かなりの数のスレッドを生成するコードを書いています (現時点では約 512 ですが、将来的にはさらに増える可能性があります)。各スレッドは少量の操作しか実行しないため、スレッドがシステムに与えるオーバーヘッドを最小限に抑えたいと考えています。

を使用してスタック サイズを設定しています。pthread_attr_setstacksize()最小許容スタック サイズを から取得できますPTHREAD_STACK_MIN。しかし、私の質問は次のとおりです。スレッドスタックサイズに使用しても安全ですか? PTHREAD_STACK_MIN必要なスタックの量を計算するにはどうすればよいですか? 計算に追加する必要がある隠れたオーバーヘッドはありますか?

また、システムに対するスレッドの負担を軽減するために使用できる他の手法はありますか?

4

3 に答える 3

7

それほど多くのスレッドを作成するべきではありません。また、少量の操作を行うために新しいスレッドを作成するべきではありません。既存のスレッドが完全に飽和しており、作業を行うための利用可能な物理的または論理的なケアが他にある場合にのみ、新しいスレッドを作成する必要があります。これにより、合理的な現在のアプリケーションに約 10 スレッド程度の厳しい制限が課せられます。ヘキサコアで実行したとしても、最大で 12 程度しか必要ありません。このような設計は非常に欠陥があり、大量のプロセス メモリを使用し、実際にはパフォーマンスが向上しません。

スタック サイズに関しては、コードの実行に完全に依存するため、任意のスレッドに必要な量を実際に計算することはできません。ただし、Visual Studio では、一般的なスタック サイズは数メガバイトです。使用するスタックサイズを知るには、コード全体とスレッドによって実行された結果の逆アセンブリを投稿する必要があります。数メガバイトで固執してください。

于 2010-11-11T12:59:47.427 に答える
5

必要なスタック フレームのサイズは、使用するコンパイラによって異なります。基本的には、auto 変数のサイズ、パラメータ、戻りアドレスのオーバーヘッド、レジスタの保存などを推測できます。

Thread Poolを使用する代わりになるかどうかを検討する必要があります。スレッドの作成は無料ではないため。

于 2010-11-11T13:04:02.173 に答える
4

スレッド スタック サイズを縮小しても、オーバーヘッドは削減されません (CPU、メモリの使用、またはパフォーマンスの観点からではありません)。この点での唯一の制限は、プラットフォーム上のスレッドに与えられる利用可能な仮想アドレス空間の合計です。

プラットフォームに問題が発生するまで (問題が発生した場合)、デフォルトのスタック サイズを使用します。次に、問題が発生した場合にスタックの使用を最小限に抑えます。ただし、ヒープをヒットするか、スレッド依存の割り当てを別の場所で考案する必要があるため、これらは実際のパフォーマンスの問題につながります。

隠れたオーバーヘッドには次のものが含まれる場合があります。

  • VLAなどによるスタック上の大きな配列の割り当て、alloca()または単純な静的サイズの自動配列。
  • テンプレート、ファクトリ クラスなどを使用した場合の結果を制御していないか認識していないコード。ただし、C++ を指定していない場合、これが問題になる可能性は低くなります。
  • ライブラリ ヘッダーなどからインポートされたコード。これらはバージョン間で変更され、スタックやスレッドの使用法さえも大幅に変更される可能性があります。
  • 再帰。これは、上記の点が原因で発生しboost::bindます。 、可変個引数テンプレート、クレイジーなマクロ、およびスタック上のバ​​ッファーまたは大きなオブジェクトを使用した一般的な再帰などを考慮してください。

スタック サイズの設定に加えて、スレッドの優先度を操作し、必要に応じてそれらを一時停止および再開できます。これにより、スケジューラとシステムの応答性が大幅に向上します。Pthreads を使用すると、競合範囲を設定できます。LWPとスコープ内スケジューリングは、パフォーマンス特性が大きく異なります。

便利なリンクを次に示します。

于 2010-11-11T13:10:16.397 に答える