7

重複の可能性:
マルチスレッドJavaアプリケーションはマルチコアマシンを非常にうまく活用しますか?

デュアルコアマシン(Windows XP 32ビット環境)でこのようなプレーンでシンプルなJavaスレッドを実行しています

public static void main(String[] strs) {

    long j  = 0;
    for(long i = 0; i<Long.MAX_VALUE; i++)
        j++;

    System.out.println(j);
    }

私の期待は、高速キャッシュを完全に活用するために単一のCPUに固執することでした(ループ内ではローカル変数jで動作し続けるため、一方のCPU使用率は100%で、もう一方はほとんどアイドル状態になります。驚いたことに、スレッドの開始後、両方のCPUが約40%〜60%で使用されており、一方のCPUの使用率がもう一方のCPUよりもわずかに高くなっています。

私の質問は、不均衡が検出されたときに作動するOS負荷分散メカニズムはありますか?私の場合、Windows OSは、一方のCPUがほぼ100%に達し、もう一方のCPUがほぼアイドル状態になっていることを検出したため、スレッドを別のCPUに定期的に再スケジュールする可能性がありますか?

ここに画像の説明を入力してください

#EDIT1 考えられる説明を見つけました: http ://siber.cankaya.edu.tr/ozdogan/OperatingSystems/ceng328/node130.html

4

3 に答える 3

3

OSがスレッドを実行すると、各スレッドが一定期間(たとえば、10〜20ミリ秒)実行され、スレッドの状態が保存され、実行する他のスレッドが検索されます。

これで、CPU使用率のグラフを見て考えられるかもしれませんが、OSは実際にはプログラムのスレッドよりもはるかに多くのスレッドを実行しています。UIループを実行しているスレッド、I / Oを待機しているスレッド、バックグラウンドサービスを実行しているスレッドなどがあります。ほとんどのスレッドは、ほとんどの時間をブロックされて何かを待機しています。

私がこれについて話している理由は、OSの観点から、状況が見た目よりも複雑であることを説明するためです。たくさんのことをしているたくさんのスレッドがあり、OSはそれらを切り替えようとしています。スレッドが前回クォンタム全体を使い果たした場合、OSが同じコアにスケジュールするように努力するヒューリスティックを実装したいとします。OSはより多くの情報を追跡して考慮する必要があり、最適化の成功は多くの予測が難しい要因に依存する可能性があります。

さらに、スレッドをコアにアフィニティ化する利点は実際には無視できることが多いため、OSは自動的にそれを実行しようとはしません。代わりに、開発者が特定のスレッドをコアにアフィニティ化する必要があることを明示的に指定できる機能を公開します。そうすれば、OSはその決定を尊重します。

これは合理的なトレードオフのように思えます。コアにアフィニティ化したときにスレッドのパフォーマンスが向上する場合は、OSにそれを実行するように依頼してください。しかし、OSはわざわざそれを理解しようとはしません。

于 2012-03-01T08:14:49.133 に答える
1

おっしゃるように、OSはスレッドをバウンスします。次のネイティブコードも、説明したとおりに機能します。

int main( int argc, char** argv )
{
    while( true );
    return 0;
}

プロセスを見ると、常に25%(クアッドコアを使用)ですが、Windows 7のリソースモニターは、コア0の使用率がより高い場合でも、4つのコアのいずれも一定の100%ではないことを示しています他人。

CPUはコア間でキャッシュを共有する可能性があるため、この動作はキャッシュが使用されていないことを意味するものではありません。

于 2012-03-01T03:00:18.573 に答える