1. ホーム
  2. java

[解決済み] Thread.sleep」を使わない「while(true)」は、LinuxではCPU使用率が100%になるのに、Windowsではならないのはなぜですか?

2022-04-25 11:49:42

質問

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のスケジューラは先取りしないのでしょうか?

解決方法は?

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

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

  • IRIXモードOFFの場合、1コアのフル稼働率は25%、4コアは100%となります。

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

IRIXモードの切り替えは top が実行されている場合 シフト + i . これで数字が一致するようになります。