93 votes

Comment Java utilise-t-il les cœurs multiples ?

Une JVM fonctionne dans un seul processus et les threads d'une JVM partagent le tas appartenant à ce processus. Alors, comment la JVM utilise-t-elle les multiples cœurs qui fournissent de multiples threads du système d'exploitation pour une concurrence élevée ?

6 votes

Pour autant que je sache, les threads Java sont des threads natifs de l'OS (dans la plupart des JVM). Ils n'ont rien de spécial.

5 votes

Les threads des applications natives s'exécutent également dans un seul processus et partagent une allocation de mémoire commune (et peuvent toujours utiliser plusieurs cœurs).

38voto

Emil Points 5513

Vous pouvez utiliser plusieurs cœurs en utilisant plusieurs threads. Mais l'utilisation d'un nombre de threads supérieur au nombre de cœurs présents dans une machine peut tout simplement constituer un gaspillage de ressources. Vous pouvez utiliser [processeurs disponibles()](http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#availableProcessors()) pour obtenir le nombre de cœurs.

Sur Java 7 il y a Cadre de travail pour la bifurcation et la jonction pour utiliser plusieurs cœurs.

Questions connexes :

6 votes

Les machines n'ont généralement que 2 ou 4 processeurs. Vous avez déclaré que "l'utilisation d'un nombre de threads supérieur au nombre de cœurs présents dans une machine peut tout simplement être un gaspillage de ressources", cela signifie-t-il que nous devrions avoir environ seulement 2 ou 4 threads pour maximiser les performances ?

5 votes

"Mais l'utilisation d'un nombre de threads supérieur au nombre de cœurs présents dans une machine peut tout simplement constituer un gaspillage de ressources." Cela n'a pas beaucoup de sens dans le cas général. Si vous avez plus de threads que le nombre de cœurs, les threads seront répartis sur ces cœurs et obtiendront leur part du cœur donné comme n'importe quel autre thread/processus en cours d'exécution, ce qui lui permettra de progresser, ce qui sera certainement plus efficace que de faire le travail séquentiellement.

0 votes

ChiefTwoPencils ; Si nous avons deux applications et que chaque application a 6 threads fonctionnant sur 4 cœurs de CPU. Dans ce cas, comment les tâches seront-elles réparties sur ces CPU ? Une autre question dans une seule application 6 threads sont en cours d'exécution sur 4 CPUs sera tous les 6 threads en parallèle en cours d'exécution sur ces 4 CPUs ou des opérations d'entrelacement à travers le fil.

38voto

Gray Points 58585

Une JVM fonctionne dans un seul processus et les threads d'une JVM partagent le tas appartenant à ce processus. Alors, comment la JVM utilise-t-elle les multiples cœurs qui fournissent de multiples threads du système d'exploitation pour une concurrence élevée ?

Java utilisera les threads du système d'exploitation sous-jacent pour exécuter le code sur différents processeurs, s'il est exécuté sur une machine multi-CPU. Lorsque chaque thread Java est lancé, il crée un thread OS associé et l'OS est responsable de l'ordonnancement, etc. La JVM s'occupe de la gestion et du suivi du thread et des constructions du langage Java telles que volatile , synchronized , notify() , wait() etc. affectent tous l'état d'exécution du thread du système d'exploitation.

Une JVM fonctionne dans un seul processus et les threads d'une JVM partagent le tas appartenant à ce processus.

La JVM n'est pas nécessairement "exécutée dans un seul processus", car même le garbage collector et d'autres codes de la JVM sont exécutés dans différents threads et le système d'exploitation représente souvent ces différents threads comme des processus différents. Sous Linux, par exemple, le processus unique que vous voyez dans la liste des processus est souvent masqué par un ensemble de processus de threads différents. Ceci même si vous êtes sur une machine à un seul cœur.

Cependant, vous avez raison de dire qu'ils partagent tous le même espace de stockage. En fait, ils partagent tout le même espace mémoire, c'est-à-dire le code, les chaînes internées, l'espace de la pile, etc.

Alors, comment la JVM utilise-t-elle les cœurs multiples qui fournissent plusieurs threads de système d'exploitation pour une concurrence élevée ?

L'amélioration des performances des fils est due à plusieurs raisons. Évidemment, la concurrence directe rend souvent le programme plus rapide. La possibilité d'effectuer plusieurs tâches CPU en même temps peut (mais pas toujours) améliorer le débit de l'application. Vous pouvez également isoler les opérations d'entrée/sortie (IO) dans un seul thread, ce qui signifie que d'autres threads peuvent être exécutés pendant qu'un thread attend une IO (lecture/écriture sur le disque/réseau, etc.).

Mais en termes de mémoire, les threads obtiennent une grande partie de leurs améliorations de performance grâce à la mémoire cache locale par CPU. Lorsqu'un thread s'exécute sur un CPU, le cache mémoire local à haute vitesse du CPU aide le thread à isoler les demandes de stockage localement sans avoir à passer le temps de lire ou d'écrire dans la mémoire centrale. C'est pourquoi volatile y synchronized incluent des constructions de synchronisation de la mémoire, car la mémoire cache doit être vidée vers la mémoire principale ou invalidée lorsque les threads doivent coordonner leur travail ou communiquer entre eux.

1 votes

Merci pour cette réponse - mais j'ai une requête : Il serait vraiment utile que vous fassiez précéder chaque utilisation du mot "thread" du préfixe "OS" ou "Java". Le choc des termes est terriblement déroutant pour moi (et pour d'autres aussi, je suppose) et je mentirais si je disais que je comprends vraiment tout maintenant.

3 votes

Le point essentiel ici @NikiHerl est que les threads Java ont des équivalents de threads OS. Si je ne spécifie pas le type de thread, cela n'a pas d'importance. Par exemple, lorsque je parle d'isoler l'entrée-sortie (IO) dans un seul thread, cela concerne à la fois le thread JVM et le thread OS qui effectue le travail.

25voto

Vijay Mathew Points 17155

Java bénéficiera de plusieurs cœurs, si le système d'exploitation répartit les threads sur les processeurs disponibles. La JVM elle-même ne fait rien de spécial pour que ses threads soient programmés de manière égale sur plusieurs cœurs. Quelques points à garder à l'esprit :

  • Lors de la mise en œuvre d'algorithmes parallèles, il peut être préférable de créer autant de threads que de cœurs. ( Runtime.getRuntime().availableProcessors() ). Pas plus, pas moins.
  • Utilisez les installations fournies par le java.util.concurrent paquet.
  • Assurez-vous que vous avez Java Concurrency en pratique dans votre bibliothèque personnelle.

3 votes

Pas plus, pas moins. C'est faux. Selon le livre que vous avez suggéré, on devrait spawn (No. of processors + 1), puisque pendant qu'un thread fait IO, le thread supplémentaire peut utiliser le C.P.U. inactif.

5 votes

Si les threads ne font que du traitement et n'attendent pas d'appels à distance (base de données, API distante, JMS, etc.), la suggestion ci-dessus est logique. Mais en pratique, toutes les applications régulières utilisent des appels à distance. Donc le meilleur nombre de threads peut varier en fonction de la latence de vos appels à distance. Faites un test de charge et décidez.

23voto

Steve-o Points 9043

Fils verts ont été remplacés par des threads natifs dans Java 1.2.

6 votes

+1 - En d'autres termes, le système d'exploitation fera en sorte que différents threads java utilisent différents cœurs ... en fonction des contraintes d'ordonnancement et de gestion des ressources du système.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X