web-dev-qa-db-fra.com

Java threads et nombre de cœurs

J'avais juste une petite question sur le fonctionnement des processeurs et des threads. Selon ma compréhension actuelle, un noyau ne peut exécuter qu'un seul processus à la fois. Mais nous pouvons produire un pool de threads (disons 30) avec un nombre supérieur au nombre de cœurs que nous possédons (disons 4) et les faire fonctionner simultanément. Comment est-ce possible si nous n'avons que 4 cœurs? Je peux également exécuter mon programme 30 threads sur mon ordinateur local et continuer à effectuer d'autres activités sur mon ordinateur telles que regarder des films ou naviguer sur Internet.

J'ai lu quelque part que la planification des threads se produit et que cela donne l'illusion que ces 30 threads s'exécutent simultanément par les 4 cœurs. Est-ce vrai et si oui, quelqu'un peut-il expliquer comment cela fonctionne et recommander également une bonne lecture à ce sujet?

Merci d'avance pour votre aide.

21
user5765683

Processus vs threads

Autrefois, chaque processus avait précisément un thread d'exécution, donc les processus étaient directement planifiés sur les cœurs (et à l'époque, il n'y avait presque qu'un seul cœur à planifier) . Cependant, dans les systèmes d'exploitation qui prennent en charge le threading (qui est presque tous les systèmes d'exploitation modernes), ce sont les threads , pas les processus qui sont planifiés. Donc, pour le reste de cette discussion, nous parlerons exclusivement des threads, et vous devez comprendre que chaque processus en cours d'exécution a un ou plusieurs threads d'exécution.

Parallélisme vs concurrence

Lorsque deux threads s'exécutent en parallèle , ils s'exécutent tous les deux en même temps . Par exemple, si nous avons deux threads, A et B, leur exécution parallèle ressemblerait à ceci:

CPU 1: A ------------------------->

CPU 2: B ------------------------->

Lorsque deux threads s'exécutent simultanément , leur exécution chevauche . Le chevauchement peut se produire de deux manières: soit les threads s'exécutent en même temps (c'est-à-dire en parallèle, comme ci-dessus), soit leurs exécutions sont entrelacées sur le processeur, comme ceci:

CPU 1: A -----------> B ----------> A -----------> B -------- ->

Ainsi, pour nos besoins , le parallélisme peut être considéré comme un cas particulier de concurrence *

Planification

Mais nous pouvons produire un pool de threads (disons 30) avec un nombre supérieur au nombre de cœurs que nous possédons (disons 4) et les faire fonctionner simultanément. Comment est-ce possible si nous n'avons que 4 cœurs?

Dans ce cas, ils peuvent s'exécuter simultanément, car le planificateur du processeur accorde à chacun de ces 30 threads une partie du temps du processeur. Certains threads s'exécuteront en parallèle (si vous avez 4 cœurs, alors 4 threads s'exécuteront en parallèle à tout moment), mais les 30 threads s'exécuteront simultanément. La raison pour laquelle vous pouvez ensuite jouer à des jeux ou naviguer sur le Web est que ces nouveaux threads sont ajoutés au pool/file d'attente de threads et reçoivent également une part de temps CPU.

Cœurs logiques et physiques

Selon ma compréhension actuelle, un noyau ne peut effectuer qu'un seul processus à la fois

Ce n'est pas tout à fait vrai. En raison de la conception matérielle et du pipelining très intelligents qui seraient beaucoup trop longs pour entrer ici (et je ne les comprends pas), il est possible qu'un noyau physique exécute réellement deux threads complètement différents d'exécution en même temps . Mâchez un peu cette phrase si vous en avez besoin - elle me souffle encore.

Cet exploit étonnant est appelé multi-threading simultané (ou populairement Hyper-Threading, bien qu'il s'agisse d'un nom propriétaire pour une instance spécifique de cette technologie). Ainsi, nous avons cœurs physiques , qui sont les cœurs CPU matériels réels, et cœurs logiques , qui est le nombre de cœurs que le système d'exploitation indique que le logiciel est disponible. Les noyaux logiques sont essentiellement une abstraction. Dans les processeurs Intel modernes typiques, chaque cœur physique agit comme deux cœurs logiques.

quelqu'un peut-il expliquer comment cela fonctionne et recommander également une bonne lecture à ce sujet?

Je recommanderais les concepts du système d'exploitation si vous voulez vraiment comprendre comment les processus, les threads et la planification fonctionnent tous ensemble.

  • Les significations précises des termes parallèle et simultané sont vivement débattues, même ici dans notre propre débordement de pile . Ce que l'on entend par ces termes dépend beaucoup du domaine d'application.
35
gardenhead

En bref, votre compréhension d'un noyau est correcte. Un noyau peut exécuter 1 thread (processus aka) à la fois.

Cependant, votre programme ne vraiment pas exécuter 30 threads à la fois. Sur ces 30 threads, seulement 4 sont en cours d'exécution à la fois, et les 26 autres sont en attente. Le CPU planifiera les threads et donnera à chaque thread une tranche de temps pour s'exécuter sur un core. Ainsi, le processeur fera tourner tous les threads à tour de rôle.

ne idée fausse commune:

Avoir plus de threads rendra mon programme plus rapide.

FAUX: Avoir plus de threads PAS rendra toujours votre programme plus rapide. Cela signifie simplement que le CPU doit faire plus de commutation, et en fait, avoir trop de threads rendra votre programme plus lent en raison de la surcharge causée par la commutation tous les différents processus.

4
Andy Guibert

Java n'effectue pas Ordonnancement des threads, il laisse cela sur Système d'exploitation pour effectuer l'ordonnancement des threads.

Pour les tâches intensives en calcul, il est recommandé d'avoir une taille de pool de threads égale au nombre de cœurs disponibles. Mais pour les tâches liées aux E/S, nous devrions avoir un plus grand nombre de threads. Il existe de nombreuses autres variantes, si les deux types de tâches sont disponibles et nécessitent une tranche de temps CPU.

un noyau ne peut exécuter qu'un seul processus à la fois

Oui, mais ils peuvent multitâche et créer illusion qu'ils traitent plus d'un processus à la fois

Comment est-ce possible si nous n'avons que 4 cœurs? Je peux également exécuter mon programme 30 threads sur mon ordinateur local et continuer à effectuer d'autres activités sur mon ordinateur

Cela est possible en raison de multitâche (qui est simultanéité). Disons que vous avez démarré 30 threads et que le système d'exploitation exécute également 50 threads, les 80 threads partageront 4 cœurs de processeur en obtenant une tranche de temps CPU un par un (un thread par cœur à la fois). Ce qui signifie qu'en moyenne, chaque cœur exécutera 80/4 = 20 threads simultanément. Et vous sentirez que tous les threads/processus s'exécutent en même temps.

quelqu'un peut-il expliquer comment cela fonctionne

Tout cela se passe à niveau OS. Si vous êtes programmeur, vous ne devriez pas vous en préoccuper. Mais si vous êtes un étudiant de l'OS, choisissez un livre sur l'OS et apprenez-en plus sur le multi-threading au niveau de l'OS en détail ou trouvez un bon document de recherche pour la profondeur. Une chose que vous devez savoir que chaque système d'exploitation gère ces choses de manière différente (mais généralement les concepts sont les mêmes)

Il existe des langages comme Erlang, qui utilisent des threads verts (ou processus), grâce auxquels ils ont la possibilité de mapper et de planifier des threads sur leur propre système d'exploitation éliminant. Donc, faites des recherches sur fils verts aussi si vous êtes intéressé.

Remarque: Vous pouvez également rechercher acteurs qui est un autre abstraction sur les threads. Des langages comme Erlang, Scala etc utilisent des acteurs pour accomplir des tâches. Un thread peut avoir des centaines d'acteurs; chaque acteur peut effectuer une tâche différente (similaire aux threads en Java).

C'est un très vaste sujet de recherche actif et il y a beaucoup de choses à apprendre.

3
user4774371