Quelle est la différence entre les threads logiciels, les threads matériels et les threads Java?
Les threads logiciels, Java et les threads matériels sont-ils indépendants ou interdépendants? Je pose cette question car, je sais que les fils Java sont créés dans un processus avec en jvm (Java.exe).
Est-il également vrai que ces différents processus sont exécutés sur différents threads matériels?
Les threads logiciels sont des threads d'exécution gérés par le système d'exploitation.
Les threads matériels sont une caractéristique de certains processeurs qui permettent une meilleure utilisation du processeur dans certaines circonstances. Ils peuvent être exposés au/par le système d'exploitation comme semblant être des cœurs supplémentaires ("hyperthreading").
En Java, les threads que vous créez conservent l'abstraction des threads logiciels, où la JVM est le "système d'exploitation". Si la JVM mappe ensuite Java aux threads du système d'exploitation sont l'affaire de la JVM (mais c'est certainement le cas). Et ensuite, le système d'exploitation utilisera les threads matériels s'ils sont disponibles.
Un "thread matériel" est un processeur physique ou un noyau. Ainsi, un CPU à 4 cœurs peut véritablement prendre en charge 4 threads matériels à la fois - le CPU fait vraiment 4 choses en même temps temps.
Un thread matériel peut exécuter plusieurs threads logiciels. Dans les systèmes d'exploitation modernes, cela se fait souvent par découpage temporel - chaque thread obtient quelques millisecondes à exécuter avant que le système d'exploitation ne planifie un autre thread pour qu'il s'exécute sur ce CPU. Étant donné que le système d'exploitation bascule rapidement entre les threads, il apparaît comme si un processeur faisait plus d'une chose à une fois, mais en réalité, un noyau exécute toujours un seul thread matériel, qui bascule entre de nombreux threads logiciels.
Les machines virtuelles Java modernes mappent Java threads directement aux threads natifs fournis par le système d'exploitation, il n'y a donc pas de surcharge inhérente introduite par Java threads vs threads natifs. Quant au matériel) threads, le système d'exploitation essaie de mapper les threads aux cœurs, s'il y a suffisamment de cœurs. Donc, si vous avez un programme Java qui démarre 4 threads et que vous avez 4 cœurs ou plus, il y a de fortes chances vos 4 threads fonctionneront vraiment en parallèle sur 4 cœurs distincts, si les cœurs sont inactifs.