12

選択した言語でスレッドを作成する方法と、ミューテックスや共有データの危険性などについては理解していますが、O/S がスレッドを管理する方法と各スレッドのコストについては確信があります。私には一連の質問がありますが、それらはすべて関連しており、私の理解の限界を示す最も明確な方法は、おそらくこれらの質問を使用することです.

スレッドを生成するコストはいくらですか? ソフトウェアを設計するときに心配する価値さえありますか? スレッドを作成するためのコストの 1 つは、独自のスタック ポインターとプロセス カウンターである必要があります。次に、スケジューラーによってコアに出入りするときに、すべての作業レジスターをコピーするためのスペースが必要ですが、他に何がありますか?

1 つのプログラムで使用できるスタックの量は、プロセスのスレッド間または先着順で均等に分割されますか?

(プログラムの)起動時にハードウェアのコア数をどうにかしてチェックできますか。N コアのマシンで実行している場合、スレッド数を N-1 に保つ必要がありますか?

4

3 に答える 3

9

次に、スケジューラによってコアに出入りするときに、すべての作業レジスタをコピーするためのスペースが必要ですが、他に何がありますか?

あまり目立たないコストの 1 つは、数千のスレッドをジャグリングする必要がある場合に、スケジューラーに課せられる負担です。メモリは実際には問題ではありません。適切に調整することで、「スレッド」が占有するメモリをスタックよりもわずかに少なくすることができます。この微調整は難しい場合があります (つまりclone(2)、Linux で直接使用するなど) が、実行できます。

1 つのプログラムで使用できるスタックの量は、プロセスのスレッド間で均等に分割されますか、または先着順で処理されますか?

各スレッドは独自のスタックを取得し、通常はそのサイズを制御できます。

N コアのマシンで実行している場合、スレッド数を N-1 に保つ必要がありますか?

コア数の確認は簡単ですが、環境によって異なります。ただし、スレッドの数をコアの数に制限することは、I/O がほとんどなく、CPU を集中的に使用する操作でワークロードが構成されている場合にのみ意味があります。I/O が関係している場合は、コアよりも多くのスレッドが必要になる場合があります。

于 2013-02-12T20:13:21.657 に答える
4

他の優れた投稿に追加するには:

「スレッドを生成するコストはいくらですか? ソフトウェアを設計するときに心配する価値さえありますか?」

それは、設計上の選択の 1 つがそのようなことを頻繁に行っている場合です。この問題を回避する良い方法は、操作専用のプールやアプリの有効期間スレッドを使用して、アプリの起動時にスレッドを 1 回作成することです。スレッド間のシグナル伝達は、継続的なスレッドの作成/終了/破棄よりもはるかに高速であり、はるかに安全/簡単です。

スレッドの停止、終了、破壊、スレッド数の暴走、OOM の失敗などの問題に関する投稿の数は伝説的です。それをまったく避けることができれば、素晴らしいことです。

于 2013-02-12T20:50:20.087 に答える
4

設計および実装するすべてのことについて、可能な限り慎重に行う必要があります。

スレッドを作成するたびに、Java スレッド スタックが約 1MB を占めることを私は知っています。、したがって、それらは合計されます。

スレッドは、他のすべてのユーザー/プロセスの進行を妨げることなく、長時間実行されるアクティビティを実行できる非同期タスクに適しています。

スレッドはオペレーティング システムによって管理されます。多くのスキームがあり、すべてオペレーティング システムの制御下にあります (ラウンド ロビン、先着順など)。

一部のアクティビティ (計算量の多い計算、グラフィックス、数学など) にコアごとに 1 つのスレッドを割り当てることは、私にとって完全に理にかなっていますが、それが決定要因である必要はありません。私が開発する 1 つのアプリは、本番環境で約 100 のアクティブ スレッドを使用します。100 コアのマシンではありません。

于 2013-02-12T20:12:39.380 に答える