Почему "while (true)" без "Thread.sleep" приводит к 100% использованию ЦП в Linux, но не в Windows?

Я создал простую программу в java:

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

Если я запустил это на машине Linux, он показывает 100% использование ЦП, но не приводит к медленной работе ОС. Однако, если я запускаю тот же самый код в Windows, он показывает только около 20% использования ЦП.

Я использую Oracle JRE для Windows и OpenJDK 6 для Linux.

Мне интересно, будет ли планировщик Windows предварительно вытеснять потоки случайно, а Linux - нет?

Ответ 1

По умолчанию top в Linux работает в так называемом режиме IRIX, в то время как диспетчер задач Windows этого не делает. Скажем, у вас 4 ядра:

  • В режиме IRIX 1 полностью используемое ядро ​​составляет 100%, а 4 ядра - 400%.

  • При выключенном режиме IRIX 1 полностью используемое ядро ​​составляет 25%, а 4 ядра - 100%.

Это означает, что по умолчанию top в Linux будет показывать бесконечный цикл как ~ 100%, а Windows покажет его как ~ 25%, и это означает точно то же самое.

Вы можете переключать режим IRIX, пока top работает с Shift + i. Это приведет к совпадению чисел.