web-dev-qa-db-fra.com

Comment Java utilise-t-il plusieurs cœurs?

Une JVM s'exécute dans un seul processus et les threads d'une JVM partagent le segment appartenant à ce processus. Alors, comment JVM utilise-t-il plusieurs cœurs qui fournissent plusieurs threads de système d'exploitation pour une concurrence élevée?

62
Munish Sodhi

Vous pouvez utiliser plusieurs cœurs à l'aide de plusieurs threads. Mais l'utilisation d'un nombre de threads supérieur au nombre de cœurs présents dans une machine peut simplement être un gaspillage de ressources. Vous pouvez utiliser availableProcessors () pour obtenir le nombre de cœurs.

Dans Java 7 il y a framework fork/join pour utiliser plusieurs cœurs.

Questions connexes:

27
Emil

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

19
Steve-o

Java bénéficiera de plusieurs cœurs, si le système d'exploitation distribue des threads sur les processeurs disponibles. La JVM elle-même ne fait rien de spécial pour que ses threads soient planifiés de manière uniforme 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 générer autant de threads qu'il y a de cœurs. (Runtime.getRuntime().availableProcessors()). Ni plus, ni moins.
  • Profitez des installations fournies par le Java.util.concurrent paquet.
  • Assurez-vous d'avoir Java Concurrency in Practice dans votre bibliothèque personnelle.
18
Vijay Mathew

Une JVM s'exécute dans un seul processus et les threads d'une JVM partagent le segment appartenant à ce processus. Alors, comment JVM utilise-t-il plusieurs cœurs qui fournissent plusieurs threads de système d'exploitation pour une concurrence élevée?

Java utilisera les threads du système d'exploitation sous-jacent pour effectuer le travail réel d'exécution du code sur différents processeurs, s'il s'exécute sur une machine multi-CPU. Lorsque chaque thread Java est démarré, il crée un thread OS associé et le système d'exploitation est responsable de la planification, etc. La JVM assure la gestion et le suivi du thread et Java comme volatile, synchronized, notify(), wait(), etc. affectent toutes l'état d'exécution du thread OS.

Une JVM s'exécute dans un seul processus et les threads d'une JVM partagent le segment appartenant à ce processus.

JVM n'a pas besoin de "s'exécuter dans un seul processus" car même le garbage collector et les autres codes JVM s'exécutent dans des threads différents 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 masque souvent un tas de processus de threads différents. C'est même si vous êtes sur une machine monocœur.

Cependant, vous avez raison, ils partagent tous le même espace de tas. Ils partagent en fait le même espace mémoire entier, ce qui signifie du code, des chaînes internes, un espace de pile, etc.

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

Les threads obtiennent leurs améliorations de performances pour plusieurs raisons. Évidemment, la simultanéité directe accélère souvent l'exécution du programme. 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 IO sur un seul thread, ce qui signifie que d'autres threads peuvent s'exécuter pendant qu'un thread attend sur IO (lecture/écriture sur le disque)/réseau, etc.).

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

17
Gray