Question

Duplicata possible:
Une application Java multithread exploiterait-elle très bien une machine multi-core?

J'ai un fil Java simple et simple comme celui-ci en cours d'exécution sur ma machine double cœur (Enviroment Windows XP 32 bits)

public static void main(String[] strs) {

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

    System.out.println(j);
    }

Je m'attendais à ce qu'il respecterait un seul processeur pour exploiter pleinement le cache à grande vitesse (car dans la boucle, nous continuons à fonctionner avec la variable locale j, donc une utilisation du processeur serait à 100% et l'autre serait à peu près inactive. Ma surprise des deux processeurs est utilisée à environ 40% ~ 60% après le début du thread et l'utilisation d'un processeur est légèrement plus élevée que l'autre.

Ma question est qu'il y a un mécanisme d'équilibrage de chargement du système d'exploitation qui entre en jeu lorsque le déséquilibre a été détecté? Dans mon cas, est-il possible que Windows OS ait constaté qu'un processeur frappe près de 100% et l'autre est presque inactif, alors il reprograisse le fil à un autre processeur périodiquement?

enter image description here

# Edit1J'ai trouvé une explication possible:http://siber.cankaya.edu.tr/ozdogan/operatingsystems/ceng328/node130.html

Était-ce utile?

La solution

Lorsque le système d'exploitation exécute des threads, il exécute chaque thread pendant une certaine période (disons 10-20 ms), puis enregistre l'état du thread et recherche d'autres threads à exécuter.

Maintenant, malgré ce que vous pourriez penser en regardant le graphique d'utilisation du processeur, le système d'exploitation exécute en fait beaucoup plus de threads que ceux de votre programme. Il y a des threads exécutant des boucles d'interface utilisateur, des threads en attente d'E / S, des threads exécutant des services d'arrière-plan, etc. La plupart des threads passent la plupart de leur temps bloqué à attendre quelque chose.

La raison pour laquelle je parle de cela est d'expliquer que du point de vue de l'OS, la situation est plus complexe qu'elle ne pourrait sembler. Il y a tout un tas de fils qui font tout un tas de choses, et le système d'exploitation tente de basculer entre eux. Supposons que vous vouliez mettre en œuvre une heuristique que si un fil utilise son quantum entier la dernière fois, alors le système d'exploitation fera un effort pour le planifier au même cœur. Le système d'exploitation doit suivre et prendre en compte plus d'informations, et le succès de l'optimisation peut dépendre de nombreux facteurs difficiles à prédire.

De plus, l'avantage d'affinier un fil dans un noyau est souvent négligeable dans la pratique, donc les OSE n'essaient pas de le faire automatiquement. Au lieu de cela, ils exposent une fonctionnalité qui permet au développeur de dire explicitement qu'un thread particulier doit être affinalisé dans un noyau, puis le système d'exploitation respectera la décision.

Cela semble être un compromis raisonnable: si votre fil fonctionne mieux lorsqu'il est affecté à un noyau, demandez simplement au système d'exploitation de le faire. Mais, le système d'exploitation ne prendra pas la peine d'essayer de le comprendre pour vous.

Autres conseils

Comme vous le mentionnez, le système d'exploitation rebondira. Le code natif suivant le fait également comme vous l'avez décrit.

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

Si vous regardez le processus, il est constamment à 25% (en utilisant un quad-core), mais le moniteur de ressources de Windows 7 montre qu'aucun des 4 cœurs est constant à 100%, même si Core 0 est à une utilisation plus élevée que les autres.

La Le processeur peut partager Le cache entre les noyaux, donc ce comportement ne signifie pas que le cache n'est pas utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top