web-dev-qa-db-fra.com

Pourquoi «while (true)» sans «Thread.sleep» entraîne-t-il 100% d'utilisation du processeur sous Linux mais pas sous Windows?

J'ai créé un programme simple en Java:

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

Si j'exécute cela sur une machine Linux, cela montre 100% d'utilisation du processeur, mais ne fait pas apparaître le système d'exploitation lentement. Cependant, si j'exécute exactement le même code sous Windows, il ne montre qu'environ 20% d'utilisation du processeur.

J'utilise Oracle JRE sous Windows et OpenJDK 6 sous Linux.

Je me demande si le planificateur de Windows préempte les threads de manière aléatoire et Linux non?

156
Maniek

Par défaut, top sous Linux s'exécute en mode dit IRIX, contrairement à Windows Task Manager. Disons que vous avez 4 cœurs:

  • Lorsque le mode IRIX est activé, 1 cœur entièrement utilisé est à 100% et 4 cœurs à 400%.

  • Avec le mode IRIX désactivé, 1 cœur entièrement utilisé est à 25% et 4 cœurs à 100%.

Cela signifie que par défaut, top sur Linux affichera une boucle infinie comme ~ 100% et Windows l'affichera comme ~ 25%, et cela signifie exactement la même chose.

Vous pouvez basculer le mode IRIX pendant que top fonctionne avec Shift+i. Cela fera correspondre les chiffres.

385
that other guy