Vous ne posez pas la question sans doute la plus fondamentale: "Comment puis-je avoir 290 processus lorsque mon processeur n'a que quatre cœurs?" Cette réponse est un peu d'histoire, ce qui pourrait vous aider à comprendre la situation dans son ensemble, même si la question spécifique a déjà été répondue. En tant que tel, je ne donnerai pas une version TL; DR.
Il était une fois (pensez, années 1950-1960), les ordinateurs ne pouvaient faire qu'une chose à la fois. Elles étaient très chères, remplies de salles entières et nous avions besoin d’un moyen de les utiliser efficacement en les partageant entre plusieurs personnes. La première façon de faire était le traitement par lots , dans lequel les utilisateurs soumettraient des tâches à l'ordinateur et seraient mis en file d'attente, exécutés l'un après l'autre et les résultats renvoyés à l'utilisateur. C’était acceptable, mais cela signifiait que si vous vouliez faire un calcul qui prendrait quelques jours, personne d’autre ne pourrait utiliser l’ordinateur pendant cette période.
La prochaine innovation (pensez, années 1960-1970) était partage de temps . Désormais, au lieu d'exécuter la totalité d'une tâche, puis la totalité de la suivante, l'ordinateur exécuterait un peu d'une tâche, l'interromprait ensuite et exécuterait un peu la suivante, et ainsi de suite. Ainsi, l’ordinateur donnerait l’impression qu’il exécutait plusieurs processus simultanément. Le grand avantage de cela est que vous pouvez maintenant exécuter un calcul qui prendra quelques jours et, bien que cela prendra encore plus longtemps, car il continue de s’interrompre, d’autres personnes peuvent toujours utiliser la machine pendant cette période.
Tout cela était destiné aux énormes ordinateurs de type mainframe. Quand les ordinateurs personnels ont commencé à devenir populaires, ils n’étaient au début pas très puissants et, hé, depuis personnel cela leur semblait correct de ne pouvoir faire qu'une chose - exécuter une seule application à la fois (pensez, années 1980). Mais, à mesure qu'ils sont devenus plus puissants (pensez, des années 1990 à aujourd'hui), les gens voulaient aussi que leurs ordinateurs personnels partagent leur temps.
Nous nous sommes donc retrouvés avec des ordinateurs personnels qui donnaient l’illusion d’exécuter simultanément plusieurs processus en les exécutant un à la fois pendant de brèves périodes, puis en les mettant en pause. Les threads sont essentiellement la même chose: finalement, les utilisateurs voulaient que même des processus individuels donnent l’illusion de faire plusieurs choses simultanément. Au début, le rédacteur de l'application devait se débrouiller seul: passer un peu de temps à mettre à jour les graphiques, mettre cela en pause, dépenser un peu de temps à calculer, mettre ça en pause, passer un peu de temps à faire autre chose, ...
Cependant, le système d'exploitation maîtrisant déjà plusieurs processus, il était logique de l'étendre pour gérer ces sous-processus appelés processus. Nous avons donc un modèle où chaque processus (ou application) contient au moins un thread, mais certains en contiennent plusieurs. Chacun de ces threads correspond à une sous-tâche quelque peu indépendante.
Mais, au plus haut niveau, le processeur ne fait que donner l’illusion que ces threads fonctionnent tous en même temps. En réalité, il en fonctionne un pendant un petit moment, le met en pause, en choisit un autre pour courir un peu, etc. Sauf que les processeurs modernes peuvent exécuter plusieurs threads à la fois. Donc, dans le réal En réalité, le système d’exploitation joue à ce jeu de "courir pour un peu, faire une pause, faire autre chose pour un peu, faire une pause" sur tous les cœurs simultanément. Ainsi, vous pouvez avoir autant de threads que vous (et les concepteurs de vos applications) souhaitez, mais, à tout moment, ils seront tous en pause.