web-dev-qa-db-fra.com

Comment les cœurs, les processus et les threads SMP fonctionnent-ils exactement ensemble?

Sur un processeur à cœur unique, chaque processus s'exécute dans le système d'exploitation et le processeur passe d'un processus à l'autre pour une utilisation optimale. Un processus peut avoir plusieurs threads, auquel cas le processeur l'exécute lorsqu'il s'exécute sur le processus respectif.

Maintenant, sur un processeur multi-core:

  • Les cœurs fonctionnent-ils ensemble dans tous les processus ou peuvent-ils être exécutés séparément dans différents processus à un moment donné? Par exemple, vous avez le programme A en cours d'exécution deux threads. Un processeur dual core peut-il exécuter les deux threads de ce programme? Je pense que la réponse devrait être oui si nous utilisons quelque chose comme OpenMP . Mais pendant que les cœurs fonctionnent dans ce processus intégré OpenMP, l'un des cœurs peut-il simplement basculer vers un autre processus?

  • Pour les programmes créés pour un seul cœur, à 100%, pourquoi l'utilisation de l'UC de chaque cœur est-elle distribuée? (Par exemple, un processeur bicœur de 80% et 20%. Le pourcentage d'utilisation de tous les cœurs totalise toujours 100% dans ce cas.) Les cœurs essaient-ils de s'aider mutuellement en exécutant chaque thread, chaque processus, à certains égards ?

50
Karl

Les cœurs (ou les processeurs) sont les éléments physiques de votre ordinateur qui exécutent le code. Habituellement, chaque noyau a tous les éléments nécessaires pour effectuer des calculs, enregistrer des fichiers, des lignes d'interruption, etc.

La plupart des systèmes d'exploitation représentent des applications en tant que processus . Cela signifie que l'application possède son propre espace d'adressage (== vue de la mémoire), où le système d'exploitation s'assure que cette vue et son contenu sont isolés des autres applications.

Un processus consiste en un ou plusieurs threads , qui exécutent le travail réel d'une application en exécutant le code machine sur une CPU. Le système d'exploitation détermine quel thread s'exécute sur quel processeur (en utilisant une heuristique intelligente pour améliorer l'équilibre de la charge, la consommation d'énergie, etc.). Si votre application ne comporte qu'un seul thread, alors tout votre système multi-CPU ne vous aidera pas beaucoup car il n'utilisera toujours qu'un seul CPU pour votre application. (Cependant, les performances globales peuvent encore s'améliorer car le système d'exploitation exécute d'autres applications sur les autres processeurs, de sorte qu'ils ne se mélangent pas avec le premier).

Passons maintenant à vos questions spécifiques:

1) Le système d’exploitation vous permet généralement de donner au moins des indications sur le noyau sur lequel vous souhaitez exécuter certains threads. Ce que fait OpenMP est de générer du code qui génère un certain nombre de threads afin de répartir le travail de calcul partagé à partir de boucles de votre programme dans plusieurs threads. Il peut utiliser le mécanisme de conseil du système d'exploitation (voir: affinité de threads) pour le faire . Cependant, les applications OpenMP seront toujours exécutées simultanément par d'autres et le système d'exploitation est donc libre d'interrompre l'un des threads et de planifier un autre travail (potentiellement non lié). sur un processeur . En réalité, il est possible que vous souhaitiez appliquer différents schémas de planification en fonction de votre situation, mais ceci est très spécifique et la plupart du temps, vous devriez être en mesure de faire confiance à votre système d'exploitation pour vous. .

2) Même si vous exécutez une application mono-thread sur un processeur multicœur, vous remarquerez que d'autres processeurs fonctionnent également. Cela provient a) du fait que le système d'exploitation effectue son travail entre-temps et b) du fait que votre application ne s'exécute jamais seule - chaque système en cours d'exécution consiste en une multitude de tâches à exécuter simultanément. Vérifiez le gestionnaire de tâches de Windows (ou ps/top sous Linux) pour vérifier ce qui est en cours d'exécution.

47
BjoernD

Notez également que le système d'exploitation ne se soucie pas beaucoup du processus d'où proviennent les threads. Il planifie généralement les threads vers les processeurs/cœurs, quel que soit le processus à partir duquel le thread provient. Cela pourrait entraîner l'exécution de quatre threads d'un processus à la fois, aussi facilement qu'un thread de quatre processus s'exécutant simultanément.

10
John Saunders

@BjoernD, vous avez mentionné cela ..

.. Si votre application ne contient qu'un seul thread, votre fichier Tout système multi-CPU ne vous aidera pas beaucoup car il utilisera toujours seulement un processeur pour votre application ...

Je pense que même si c'est une application à thread unique, ce thread d'application peut être exécuté sur différents cœurs au cours de sa vie. À chaque préemption et attribution ultérieure à une CPU, un noyau différent peut être affecté à ce fil.

9
NitinS

Oui, les threads et les processus peuvent s'exécuter simultanément sur des processeurs multicœurs. Cela fonctionne donc comme vous le décrivez (quelle que soit la manière dont vous créez ces threads et processus, OpenMP ou autre). Un seul processus ou thread ne s'exécute que sur un seul cœur à la fois. S'il y a plus de threads demandant du temps d'UC que de cœurs disponibles (généralement le cas), le planificateur de système d'exploitation déplacera les threads sur des cœurs en fonction des besoins.

La raison pour laquelle les processus mono-thread s'exécutent sur plusieurs processeurs ou sur plusieurs cœurs est liée à votre système d'exploitation et non à une fonctionnalité du matériel. Certains systèmes d’exploitation n’ont aucune idée de «l’affinité entre les threads» (peu importe le processeur sur lequel s’exécute un processeur). Par conséquent, lorsque vient le temps de réévaluer les ressources utilisées (au moins plusieurs fois par seconde), elles ll déplace un thread/processus d’un cœur/d’un processeur à un autre. À part le fait que le cache manque, cela n’affecte généralement pas les performances de votre processus.

5
Nick Bastin

S'il existe une application de threads comportant 10 threads, elle démarrera initialement sur le même processeur/core. Après un certain temps, plusieurs threads seront distribués vers d'autres cœurs/cpus en raison de l'équilibrage de charge sous Linux. Si plusieurs applications de ce type existent, je pense que toutes les applications s’exécutent principalement sur le même core/cpu que les locals/globals des threads sont facilement disponibles dans le cache l1/l2 du core dans lequel elles étaient exécutées. leur sortie du noyau prend beaucoup de temps que leur temps d’exécution. Si les threads doivent être exécutés dans un noyau différent.Je pense qu’il faut fournir les informations d’affinité au thread.

0
Vasudeva Reddy