web-dev-qa-db-ja.com

「Thread.sleep」なしで「while(true)」を使用すると、LinuxではCPU使用率が100%になりますが、Windowsでは発生しません

Javaで簡単なプログラムを作成しました。

public static void main(String[] args) throws InterruptedException {
    while (true) 
        ;
}

Linuxマシンでこれを実行すると、CPU使用率が100%になりますが、OSが遅く見えることはありません。ただし、Windows上でまったく同じコードを実行すると、CPU使用率は約20%しか表示されません。

WindowsではOracle JREを、LinuxではOpenJDK 6を使用しています。

Windowsのスケジューラがスレッドをランダムにプリエンプトし、Linuxがスレッドをプリエンプトしないのだろうか?

156
Maniek

デフォルトでは、LinuxのtopはいわゆるIRIXモードで実行されますが、Windowsタスクマネージャーはそうではありません。 4つのコアがあるとします。

  • IRIXモードがオンの場合、1つの完全に使用されているコアは100%で、4つのコアは400%です。

  • IRIXモードがオフの場合、完全に使用されている1つのコアは25%、4つのコアは100%です。

つまり、デフォルトでは、Linuxのtopは無限ループを〜100%として表示し、Windowsは〜25%として表示します。これはまったく同じことを意味します。

topの実行中にIRIXモードを切り替えることができます Shift+i。これにより、数字が一致します。

385
that other guy