46

Sur un processeur central 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 comporter plusieurs threads, auquel cas le processeur exécute ces threads lorsqu'il s'exécute sur le processus respectif.Comment les cœurs, processus et threads SMP fonctionnent-ils exactement ensemble?

Maintenant, sur un multiple core CPU:

  • -ce que les noyaux exécuter dans tous les processus ensemble, ou peuvent les noyaux fonctionner séparément dans différents processus à un moment particulier? Par exemple, vous avez le programme A exécutant 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 alors que les cœurs s'exécutent dans ce processus intégré à OpenMP, un des cœurs peut-il simplement passer à un autre processus?

  • Pour les programmes créés pour un seul cœur, en cas d'exécution à 100%, pourquoi l'utilisation du processeur de chaque cœur est-elle répartie? (par exemple un CPU dual core de 80% et 20%.) Le pourcentage d'utilisation de tous les cœurs est toujours de 100% pour ce cas.) Les noyaux essaient-ils de s'entraider en exécutant chaque thread, de chaque processus, d'une certaine manière ?

+2

Exemple minimal de fonctionnement du matériel: http://stackoverflow.com/a/33651438/895245 –

Répondre

43

Les noyaux (ou CPU) sont les éléments physiques de votre ordinateur qui exécutent du 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 comme processus. Cela signifie que l'application possède son propre espace d'adressage (== view of memory), 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 exécute sur quelle CPU (en utilisant une heuristique intelligente pour améliorer l'équilibre de la charge, la consommation d'énergie, etc.). Si votre application ne comprend qu'un seul thread, alors votre système multi-processeurs ne vous aidera pas beaucoup car il n'utilisera encore qu'un seul CPU pour votre application. (Cependant, les performances globales peuvent encore s'améliorer car le système d'exploitation exécutera d'autres applications sur les autres processeurs afin qu'ils ne se mélangent pas avec le premier).

maintenant à vos questions spécifiques:

1) Le système d'exploitation permet généralement d'au moins donner des indications sur le noyau qui vous voulez exécuter certains threads. Ce que fait OpenMP est de générer du code qui engendre une certaine quantité de threads pour distribuer le travail de calcul partagé à partir des boucles de votre programme dans plusieurs threads. Il peut utiliser le mécanisme d'indication du système d'exploitation (voir: Affinité de thread) pour le faire. Toutefois, les applications OpenMP continueront d'être exécutées en même temps que les autres et le système d'exploitation est donc libre d'interrompre l'un des threads et de planifier d'autres tâches (potentiellement non liées) sur un CPU. En réalité, il existe de nombreux schémas d'ordonnancement différents que vous pouvez appliquer en fonction de votre situation, mais ceci est très spécifique et la plupart du temps, vous devriez être capable de faire confiance à votre système d'exploitation pour vous.

2) Même si vous exécutez une application monothread sur un processeur multi-cœurs, vous remarquez que d'autres processeurs fonctionnent également. Cela vient a) du système d'exploitation faisant son travail entre-temps et b) du fait que votre application ne fonctionne jamais seule - chaque système en cours d'exécution consiste en un tas de tâches en cours d'exécution. 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.

4

Oui, les fils et les processus peuvent être exécutés simultanément sur les processeurs multi-core, donc cela fonctionne comme vous décrivez (quelle que soit la façon dont vous créez les fils et les processus, OpenMP ou autrement). 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 le temps CPU que de cœurs disponibles (généralement le cas), le planificateur du système d'exploitation déplacera les threads sur et en dehors des cœurs si nécessaire.

La raison pour laquelle les processus monothread s'exécutent sur plusieurs processeurs ou processeurs est liée à votre système d'exploitation, et pas spécifiquement à toute fonctionnalité du matériel. Certains systèmes d'exploitation n'ont aucun sens de «l'affinité du fil» - ils se fichent du processeur sur lequel tourne un thread - alors quand vient le temps de réévaluer quelles ressources sont utilisées (plusieurs fois par seconde, au moins), ils ' Déplacez un thread/processus d'un core/CPU à un autre. En dehors des erreurs de cache, cela n'affecte généralement pas les performances de votre processus.

9

Notez également que le système d'exploitation ne se soucie pas de savoir de quel processus proviennent les threads. Il planifie généralement les threads sur les processeurs/cœurs, quel que soit le processus utilisé par le thread. Cela peut conduire à ce que quatre threads d'un même processus s'exécutent en même temps, aussi facilement qu'un thread de quatre processus s'exécutant en même temps.

+0

Cela dépend vraiment du schéma de planification. Certains d'entre eux, tels que la planification de groupes (http://en.wikipedia.org/wiki/Gang_scheduling), intègrent des informations sur les threads qui appartiennent ensemble. – BjoernD

+0

Vous avez la réponse que je voulais..Très concis – TheRumboJumbo

6

@BjoernD, vous avez dit que ..

.. Si votre application ne se compose que d'un seul fil, votre ensemble multi-système CPU ne vous aidera pas autant que ce sera encore que utiliser un CPU pour votre application ...

Je pense que même si son application mono-thread, ce thread d'application peut être exécutée sur différents noyaux pendant sa durée de vie. A chaque préemption et assignation ultérieure à une CPU, un noyau différent peut être assigné à ce thread.

+0

C'est correct. – BjoernD

+2

Picky mais correct :) Mais il est toujours malheureusement impossible pour le système de diviser le travail de votre processus ... –

+0

Oui, cela rend la situation pire qu'un système monocœur, car les caches sur le nouveau noyau seront froids après une migration artificielle . (Bien sûr, s'il y a d'autres tâches en arrière-plan, elles peuvent être programmées sur d'autres cœurs au lieu de voler des cycles à partir du programme à un seul thread). De toute façon, c'est une chicane inutile; BjoernD signifiait évidemment "un processeur à la fois". –

0

S'il y a une application de thread qui a 10 threads, initialement elle démarrera sur le même CPU/core. Au cours d'une période, les threads multiples seront distribués aux autres cœurs/processeurs en raison de l'équilibreur de charge sous Linux . S'il y a plusieurs applications de threads de ce type, je pense que tous les threads de l'application fonctionnent sur le même core/cpu que les locals/globals des threads sont facilement disponibles dans le cache l1/l2 du core dans lequel ils s'exécutent. Si les threads doivent être exécutés dans un noyau différent, je pense que l'on doit fournir les informations d'affinité pour le fil.

Questions connexes