2012-12-13 17 views
11

私はマルチスレッド化にかなり慣れており、Javaプログラムで4つのCPUを利用しようとしているプロジェクトに取り組んでいます。私は何かをしたいと思ったスレッドとCPU間のJavaの関係

int numProcessors = Runtime.getRuntime().availableProcessors(); 
ExecutorService e = Executors.newFixedThreadPool(numProcessors); 

これは私がCPUごとに1つのスレッドを動作させることを保証しますか?スレッドを作成する時点では、システムはビジーではありませんが、その後はしばらく時間がかかります。私は、OSがスレッドを作成するために最もビジー状態のCPUを選択すると思っていましたが、作成時にそれらのどれも特にビジーでない場合、どのように機能しますか?

また、スレッドプールサービスはスレッドを再利用することになっていますが、別のCPUで使用可能な空き領域が増えると、スレッドを強制終了して新しいスレッドを生成しますか?

+2

お使いのOSはJavaではなくスレッドスケジューリングを行います。 –

答えて

2

は、私が持っています。この保証は一つのスレッドがCPUごとの作業予定に直接Javaで利用できないのですか?

同時に実行する必要がある4つのタスクがある場合は、それぞれにスレッドがあると期待できます。 HotSpot JVMでは、プールを作成するときに実際のスレッドの代理であるThreadオブジェクトを作成します。実際のスレッドが作成されると、どのように、あなたにとって重要です。

スレッドを作成する時点では、システムはビジーではありませんが、その後はしばらく時間が掛かります。私は、OSがスレッドを作成するために最もビジー状態のCPUを選択すると思っていましたが、作成時にそれらのどれも特にビジーでない場合、どのように機能しますか?

スレッドはOSによって作成され、スケジュールするスレッドのリストに追加されます。

また、スレッドプールサービスはスレッドを再利用することになっていますが、別のCPUで使用可能な空き領域が増えると、スレッドを強制終了して新しいスレッドを生成しますか?

Javaには問題はありません。 OSが決定する。スレッドを強制終了せず再起動しません。

スレッドは、あなたの提案する方法でCPUに束縛されません。 OSは、1つのスレッドを実行する必要があるCPUと空いているCPUを基に、CPU間でスレッドを渡します。

+0

私の関心事は、OSが実際には同じCPU上にそれらをすべてインスタンス化してから、スレッドを再利用するために、CPUが固定されていて他の3つがフリーである。これは可能ですか? – Marianna

+0

OSに強制的に実行させることができますが、デフォルトでは、実行可能な次の空きスレッドである各CPUが与えられます。 –

+0

更新していただきありがとうございます。 OSがスレッドをCPUに渡している場合は、私の質問に答えると思います。 UNIXでこれを監視する最良の方法は何ですか? 'top'関数を使用すると、複数のJava procが実行されていますか? – Marianna

2

いいえ、それはスレッドが、それはあなたがコア0と次の上に置くことができフィット(そう一行を見ていると、実際にOSのスレッドスケジューラは、コアの周りにスレッドを移行して自由である

を実行する場所については何も保証するものではありませんコア4)に

あなたは、スレッドのaffinityを設定できますが、これは(私の知る限り)

1

"他のCPUで使用可能な空き領域が増えると、スレッドを強制終了して新しいスレッドを生成しますか?"

利用可能なCPUを使用するためにもう1つを強制終了して起動する必要はありません。スレッドは、特定のCPUにバインドされていないメモリオブジェクトであり、あるCPUから別のCPUにフロートすることができます。スレッドの実行は、このようなループです:

  • Thread.start()は、プロセッサキューにスレッドを置く
  • 利用できるプロセッサがある場合には、スケジューラは、プロセッサキュー内の最初のスレッドを取るプロセッサ
  • のプット占有されているロック上のスレッドブロック、またはI/O操作の終了を待っているときは、プロセッサーから取り外され、対応するキューに入れられます。ロックが解放されるか、またはI/O操作が完了すると、スレッドはそのキューからプロセッサキューに戻されます。
  • 割り込みが発生し、プロセッサキューにスレッドがあるかどうかをスケジューラが調べます。存在する場合、現在のスレッドはプロセッサから取り出され、プロセッサキューの最後に置かれ、キューの最初のスレッドはプロセッサに置かれます。こうすることで、長時間実行されているスレッドでも他のスレッドも実行できます。

結果として、スレッドは状態を変更することがよくありますが、これはプログラマにとっては透過的です。スレッドの考え方全体は、スレッドがプロセッサのモデルであり、実際のプロセッサよりも便利であるということです。あなたが本当に必要とするまで、そのモデルを使用し、プロセッサ上のスレッドをマッピングすることについて心配しないでください。

関連する問題