2014-01-16 19 views
8

私はマルチスレッドプログラミングの新機能です。私の頭に浮かんだ問題は、CPUコアの数に応じていくつのスレッドを実行できるかということです。 CPUコア以上のスレッドを実行すると、マシンがアプリケーションを実行するためのオーバーヘッドになります。たとえば、2つのスレッド(メインスレッド+開発者スレッド)を実行するサーバーソフトウェアを持つサーバーマシンがある場合、より多くの同時クライアントがサーバーへのソケット接続を行うかどうかはサーバーのオーバーヘッドになりますか?java内のアプリケーション内のCPUコア数とスレッド数の関係は何ですか?

ありがとうございました。

答えて

3

スレッドが何をしているかによって異なります。 CPUは一度にXのことしかできません.Xはコアの数です。つまり、たいていのXスレッドは一度にアクティブになることができますが、他のスレッドはターンを待つことができ、CPUは適切なタイミングでそれらを処理します。

また、スレッドが応答を待っている、またはデータがロードされるのを待っている、またはネットワーク・メッセージが到着している多くの時間、などがそう実際に何かをしようとしていないことを考慮すべきです。これらのアイドル/待機スレッドはシステムにほとんど負荷をかけません。 CPUは、あなたのシステム内のすべてのCPUを使用していない意味することができ未満のスレッドを持つ

+0

サーバは、クライアント接続ごとにmain()メソッド内で1つのオブジェクトを作成しますが、そうであれば、サーバがオブジェクトごとに1つの余分なスレッドを実行するオーバーヘッドになります(ネットワークスピード)?ありがとうございます。 – Ramin

+0

私はあなたのコメントを本当に理解していません。 mainを実行するために作成されたスレッドがあります。スレッドはネットワーク速度にゆるやかにしか接続されません。 –

2

。 CPUがボトルネックになっている場合、スレッド数を増やすとスループットが向上する可能性があります。 CPUオーバーヘッドを導入し、CPUがボトルネックである場合、これはパフォーマンスを傷つけることができるより多くのスレッドを持つ

。しかし、ネットワークIOがボトルネックになっている場合、このオーバーヘッドは、通常はもっと多くの接続を処理できるので、支払いに値する価格です。例えば独自のスレッドで1000のTCP接続を持つことができます。

0
されていない場合> NOCは、プロセッサが スイッチコンテキストやOSがある、その仕事をしようとする必要があるため、コア( NOC)の数は、スレッドの数( ませ)に等しいとき

最高のパフォーマンスは次のようになります高価な十分な費用。しかし、同時にどれくらいのクライアントが存在するか予測できないため、WebサーバーにNOC = NOTを設定することは不可能であることを理解しておく必要があります。最良の方法でこの問題を解決するためにload balancing概念を見てみましょう。

+1

これはよくある誤解です。コンテキストスイッチが非常に悪い場合、OS開発者はOSをコードしないようにコードするだけではないでしょうか?明らかに、お使いのOSが馬鹿によって開発されていない限り、コンテキストスイッチは有益な場所でのみ実行されます。したがって、コンテキストスイッチを避けることは、スレッドの数を減らすための合理的な理由ではありません。 10スレッドを持ち、毎秒Xコンテキストスイッチを行うことができます。また、100スレッドを持ち、非常に同じXコンテキストスイッチを毎秒行うこともできます。必要なコンテキストスイッチの数は、他の設計要因に依存します。 –

+2

コンテキストスイッチは高価でしたが、確かに今はありません。オペレーティングシステムはハードウェアの周りのダンプラッパーではなく、CPUは邪悪なものです。人々は、彼らが知っていることがまだ最新であるかどうかを確認する時間を取らない(「Javaは遅い!」)、これはこれらの種類の文IMOの問題である。 – Gimby

+0

私はJavaが遅いとは思わない、逆に私はそれが十分に速いと思います。可能なOSはコンテキストの切り替えを避けようとし、SWレベルでそれを行いますが、私のポストの主なアイデアはそれのために変化しておらず、絶対に正しいです。 – Divers

3

CPUコアよりも多くのスレッドを取得する心配はありません。それは実際にはあなたの手にはないが、OSの中にある。 JVMを想定し

が(これらの日はかなり正常です)OSスレッド上にJavaスレッドをマッピングし、それはあなたのOSが行うスレッド管理に依存します。そこでは、カーネルの実装がコアからどのようにパフォーマンスを引き出すかということに頼っています。あなたが心に留めておく必要がありますどのような

は、あなたのデザインが持続可能でなければならないということです。たとえば、アプリケーションサーバーは、ワーカースレッドでいっぱいのスレッドプール上に構築されます。これらのスレッドは、要求を処理するために呼び起こされます。リクエストごとにスレッドが必要ですか?そうすれば、サーバーに何千ものリクエストが届く可能性があります。これはカーネルが管理する上で問題になる可能性があります。実際にはスレッドプールのサイズは制限されていなければなりません(リアルタイムでも簡単に変更できます)。スレッドは並行キューから作業を取得する必要があります(Javaではいくつか優れたクラスが用意されています)。私は助け

5

のスレッドの数で、システムが同時にを実行できることを願っています

は(もちろん)システムのコア数と同じです。

システム上に存在できるスレッドの数は、使用可能なメモリによって制限されています(各スレッドには、OSがスレッドを管理するためにスタックと構造体が必要です)。また、 (これはOSアーキテクチャに依存しますが、一部のOSでは固定サイズのテーブルを使用することがあり、一度そのフルスレッドを作成することはできません)。

一般に、今日のコンピュータは数百から数千のスレッドを処理できます。

システムにコアよりも多くのスレッドが使用されている理由は、ほとんどのスレッドは、多くの時間を費やすことになります。は、何らかのイベント(たとえば、キーボードでの入力を待っているワードプロセッサ)です。このようにして待機するスレッドがCPU時間を消費しないように、OSが管理します。

3

あなたのCPUがスリープ状態にならないようにするには、スレッドスイッチングでほとんどの時間を無駄にしないようにしてください。

その、それは、そのすべてのメモリ内の演算タスク場合は、コアのN + 1つのスレッド(N番号を使用することができ、タスクの性質に依存するの背後にあるTuning the pool size, In IBMs paper

アイデアをチェックすると便利(付属ハイパースレッド化))。

我々はアプリケーションのプロファイリングを行い、待機時間(WT)を見つける必要があり

それとも

、典型的な要求のためのサービス時間(ST)と、最適なスレッドの約N *(1 + WT/ST)数我々 CPUの利用率を100%とみなして考えることができます。

関連する問題