La compréhension de java threads natifs et la jvm
Je comprends que la jvm est lui-même une application qui transforme le pseudo-code de l'exécutable java en code machine natif, mais lors de l'utilisation de threads natifs j'ai quelques questions que j'ai juste ne semblent pas répondre.
- Est-ce que chaque fil de créer leur propre
instance de la jvm à gérer leur
particulier de l'exécution? - Si non, alors ne la jvm ont une certaine manière de programmer le thread qui il traitera ensuite, si oui, ne serait-ce pas rendre le multi-thread nature de java inutile puisque un seul thread peut être exécuté à un moment?
Vous devez vous connecter pour publier un commentaire.
Pas. Elles s'exécutent dans le même JVM, de sorte que (par exemple), ils peuvent partager des objets et des attributs de classe.
Il existe deux types de threads en Java. Threads natifs sont mappés sur un fil d'abstraction qui est mis en œuvre par l'OS hôte. Le système d'exploitation prend en charge native de la planification des threads, et les tranches de temps.
Le second type de fil est "fils verts". Ces sont mis en place et géré par la JVM elle-même, avec la JVM de mise en œuvre de la planification des threads. Java fil vert implémentations n'ont pas été pris en charge par Sun /Oracle Jvm depuis Java 1.2. (Voir Fils verts vs "Non-Vert" Threads)
Nous parlons de fils verts, et ceci est d'un intérêt historique (uniquement) à partir de la perspective Java.
Fils verts ont l'avantage de la planification et de la commutation de contexte sont plus rapides dans le non-I/O des cas. (D'après les mesures effectuées avec Java sur Linux 2.2; http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.9238)
Avec verte pure threads, N langage de programmation des threads sont mappés à un seul thread natif. Dans ce modèle, vous n'obtenez pas vrai exécution parallèle, comme vous l'avez noté.
Un hybride fil de la mise en œuvre, N langage de programmation des threads sont mappés sur M threads natifs (N > M). Dans ce modèle, le processus de planificateur de threads est responsable pour le fil vert à un thread natif de planification ET vous bénéficiez d'une véritable exécution parallèle (si M > 1); voir https://stackoverflow.com/a/16965741/139985.
Mais même avec la verte pure threads, vous obtenez toujours la simultanéité. Le contrôle est passé à un autre fils d'un thread se bloque sur une opération d'e/S, où l'acquisition d'un verrou, et ainsi de suite. En outre, la JVM d'exécution pourraient mettre en œuvre périodique fil de préemption de sorte qu'un consommateur d'UC thread n'a pas de monopoliser le (seul) de base, à l'exclusion des autres threads
Non, votre application en cours d'exécution dans la JVM peut avoir plusieurs threads qui existent au sein de cette instance de la JVM.
Oui, la JVM a un planificateur de threads. Il ya beaucoup de différents algorithmes pour la planification de thread, et dont l'un est utilisé est de la JVM-vendeur dépendante. (La planification en général est un sujet intéressant.)
Je ne suis pas sûr de comprendre cette partie de votre question. C'est un peu le point de filetage. Généralement, vous avez plus de threads que de Processeurs, et que vous souhaitez exécuter plus d'une chose à la fois. Threading permet d'en prendre plein la(re) parti de votre PROCESSEUR en s'assurant qu'il est occupé à traiter un seul thread, tandis qu'un autre est en attente sur les I/O, ou pour une autre raison n'est pas occupé.
Un fil de Java peuvent être mis en correspondance un-à-un à un thread du noyau. Mais cela ne doit pas l'être. Il pourrait être n threads du noyau de course m threads java, où m peut être beaucoup plus grande que n, et n doit être plus grand que le nombre de processeurs. La JVM elle-même commence à la n threads du noyau, et chacun d'eux choisit un fil de java et fonctionne pendant un certain temps, puis passe à un autre fil de java. Le système d'exploitation sélectionne threads du noyau et les attribue à un processeur. Il peut donc y avoir de planification de thread sur plusieurs niveaux.
Vous pouvez être intéressé à regarder le ALLER langage de programmation, où des milliers de soi-disant "Goroutines" sont gérés par des dizaines de fils.
Les threads Java sont mappés à des système d'exploitation natif des threads. Ils ont peu à voir avec la JVM elle-même.