web-dev-qa-db-fra.com

Threads & Processus vs MultiThreading et Multi-Core / MultiProcessor: Comment sont-ils mappés?

J'étais très confus mais le fil suivant a dissipé mes doutes:

Multiprocessing, Multithreading, HyperThreading, Multi-core

Mais il répond aux requêtes du point de vue matériel. Je veux savoir comment ces fonctionnalités matérielles sont associées aux logiciels?

Une chose qui est évidente est qu'il n'y a pas de différence entre MultiProcessor (= Mutlicpu) et MultiCore autre que celle en multicœur tous les processeurs résident sur une seule puce (die) où comme dans Multiprocessor tous les processeurs sont sur leurs propres puces et connectés ensemble.

Ainsi, les systèmes multi-processeurs/multi-processeurs sont capables d'exécuter plusieurs processus (firefox, mediaplayer, googletalk) en même temps (contrairement au changement de contexte de ces processus sur un système à processeur unique).

Si c'est correct. Je suis clair jusqu'à présent. Mais la confusion survient lorsque le multithreading entre en scène.

  1. MultiThreading "est pour" le traitement parallèle. droite?

  2. Quels sont les éléments impliqués dans le multithreading à l'intérieur du processeur? diagramme? Pour moi d'exploiter la puissance du traitement parallèle de deux tâches indépendantes, quelles devraient être les exigences du CPU?

  3. Quand les gens disent le changement de contexte des threads. Je ne comprends pas vraiment. parce que si son changement de contexte de threads alors son traitement non parallèle. les threads doivent être exécutés "scrictly simultanément". droite?

    Ma notion de multithreading est la suivante: considérer un système avec un seul processeur. lorsque le processus passe du contexte à Firefox. (supposez) chaque onglet de firefox est un thread et tous les threads s'exécutent strictement en même temps. Pas comme si un thread s'était exécuté pendant un certain temps, puis un autre thread a pris jusqu'à ce que l'heure de changement de contexte soit arrivée.

  4. Que se passe-t-il si j'exécute un logiciel multithread sur un processeur qui ne peut pas gérer les threads? Je veux dire, comment le processeur gère-t-il ces logiciels?

  5. Si tout va bien jusqu'à présent, la question est maintenant COMBIEN DE FILS? Elle doit être limitée par le matériel, je suppose? Si le matériel ne peut prendre en charge que 2 threads et que je démarre 10 threads dans mon processus. Comment le processeur le gérerait-il? Avantages/inconvénients? Du point de vue de l'ingénierie logicielle, tout en développant un logiciel qui sera utilisé par les utilisateurs dans une grande variété de systèmes, comment puis-je décider si je dois opter pour le multithreading? si oui, combien de fils?

43
claws

Tout d'abord, essayez de comprendre le concept de "processus" et de "fil". Un thread est une unité de base pour l'exécution: un thread est planifié par le système d'exploitation et exécuté par le CPU. Un processus est une sorte de conteneur qui contient plusieurs threads.

  1. Oui, le multi-traitement ou le multi-threading est destiné au traitement parallèle. Plus précisément, pour exploiter le parallélisme au niveau du thread.

  2. D'accord, le multi-thread peut signifier multi-thread matériel (un exemple est HyperThreading). Mais, je suppose que vous dites simplement le multithreading dans le logiciel. En ce sens, le processeur doit prendre en charge le changement de contexte.

  3. La commutation de contexte est nécessaire pour implémenter multitâche même dans un cœur physiquement unique par division temporelle.

  4. Supposons qu'il existe deux cœurs physiques et quatre threads très occupés. Dans ce cas, deux threads n'attendent que d'avoir la possibilité d'utiliser le CPU. Lisez quelques articles liés à la planification préemptive du système d'exploitation.

  5. Le nombre de threads pouvant s'exécuter physiquement en simultané est juste identique à # of processeurs logiques. Vous posez un problème général de planification des threads dans la littérature sur les systèmes d'exploitation, comme le round-robin.

Je fortement vous suggère d'étudier d'abord les bases du système d'exploitation. Passez ensuite aux problèmes de multithreading. Il semble que vous ne connaissiez toujours pas les concepts clés tels que le changement de contexte et la planification. Cela prendra quelques mois, mais si vous voulez vraiment être un expert en logiciels informatiques, vous devez connaître ces concepts très basiques. Veuillez prendre tous les livres OS et les diapositives de la conférence.

43
minjang

Les threads s'exécutant sur le même noyau ne sont pas techniquement parallèles. Ils ne semblent être exécutés qu'en parallèle, car le processeur bascule entre eux très rapidement (pour nous, les humains). Ce commutateur est ce qu'on appelle un changement de contexte. Désormais, les threads s'exécutant sur différents cœurs sont exécutés en parallèle. La plupart des processeurs modernes ont un certain nombre de cœurs, cependant, la plupart des systèmes d'exploitation modernes (windows, linux et amis) exécutent généralement un nombre beaucoup plus important de threads, ce qui provoque toujours des changements de contexte. Même si aucun programme utilisateur n'est exécuté, le système d'exploitation lui-même effectue des changements de contexte pour le travail de maintenance.
Cela devrait répondre à 1-3.

Environ 4: fondamentalement, chaque processeur peut fonctionner avec des threads. c'est beaucoup plus une caractéristique du système d'exploitation. Le thread est essentiellement: la mémoire (facultative), la pile et les registres, une fois ceux-ci remplacés, vous êtes dans un autre thread.

5: le nombre de threads est assez élevé et limité par le système d'exploitation. Habituellement, il est supérieur à ce que le programmeur ordinaire peut gérer avec succès :) Le nombre de threads est dicté par votre programme:

est-ce IO lié?

  • la tâche peut-elle être divisée en un certain nombre de tâches plus petites?
  • quelle est la tâche? la tâche peut être trop petite pour que cela vaille la peine de générer des threads.
  • synchronisation: si une synchronisation étendue est requise, la pénalité peut être trop lourde et vous devez réduire le nombre de threads.
12
Philip Derbeko

Plusieurs threads sont des "chaînes" de commandes distinctes au sein d'un même processus. Du point de vue du CPU, les threads sont plus ou moins comme des processus. Chaque thread a son propre ensemble de registres et sa propre pile.

La raison pour laquelle vous pouvez avoir plus de threads que de CPU est que la plupart des threads n'ont pas besoin de CPU tout le temps. Le thread peut attendre l'entrée de l'utilisateur, télécharger quelque chose à partir du Web ou écrire sur le disque. Pendant ce temps, il n'a pas besoin de CPU, donc le CPU est libre d'exécuter d'autres threads.

Dans votre exemple, chaque onglet de Firefox peut même avoir plusieurs threads. Ou ils peuvent partager certains fils. Vous en avez besoin pour le téléchargement, un pour le rendu, un pour la boucle de message (entrée utilisateur) et peut-être un pour exécuter Javascript. Vous ne pouvez pas les combiner facilement, car pendant le téléchargement, vous devez toujours réagir à l'entrée de l'utilisateur. Cependant, le thread de téléchargement dort la plupart du temps, et même lorsqu'il est en cours de téléchargement, il n'a besoin que d'un processeur de temps en temps, et le thread de boucle de message ne se réveille que lorsque vous appuyez sur un bouton.

Si vous allez dans le gestionnaire de tâches, vous verrez que malgré tous ces threads, votre utilisation du processeur est encore assez faible.

Bien sûr, si tous vos threads effectuent des tâches de calcul, vous ne devez pas en créer trop car vous n'obtenez aucun avantage en termes de performances (bien qu'il puisse y avoir des avantages architecturaux!).

Cependant, s'ils sont principalement liés aux E/S, créez autant de threads que votre architecture le requiert. Il est difficile de donner des conseils sans connaître votre tâche particulière.

3
yu_sha
  1. D'une manière générale, oui, mais "parallèle" peut signifier différentes choses.

  2. Cela dépend des tâches que vous souhaitez exécuter en parallèle.

  3. Pas nécessairement. Certains (en fait la plupart) des threads passent beaucoup de temps à ne rien faire. Autant s'en détourner vers un fil qui veut faire quelque chose.

  4. Le système d'exploitation gère la commutation des threads. Il déléguera à différents cœurs s'il le souhaite. S'il n'y a qu'un seul noyau, cela divisera le temps entre les différents threads et processus.

  5. Le nombre de threads est limité par les logiciels et le matériel. Les threads consomment le processeur et la mémoire à des degrés divers selon ce qu'ils font. Le logiciel de gestion des threads peut également imposer ses propres limites.

1
Moishe Lettvin

La chose clé à retenir est la séparation entre le parallélisme logique/virtuel et le parallélisme réel/matériel. Avec votre système d'exploitation moyen, un appel système est effectué pour générer un nouveau thread. Ce qui se passe réellement (qu'il soit mappé à un autre noyau, un thread matériel différent sur le même core ou mis en file d'attente dans le pool de threads logiciels) dépend du système d'exploitation.

  1. Le traitement parallèle utilise toutes les méthodes et pas seulement le multi-threading.
  2. D'une manière générale, si vous souhaitez avoir un véritable traitement parallèle, vous devez le réaliser en matériel. Prenons l'exemple de Niagara , il a jusqu'à 8 cœurs chacun capable d'exécuter 4 threads dans le matériel.
  3. La commutation de contexte est nécessaire lorsqu'il y a plus de threads que ce qui peut être exécuté en parallèle dans le matériel. Même alors, lorsqu'ils sont exécutés en série (basculement d'un thread à l'autre), ils sont considérés comme simultanés car il n'y a aucune garantie sur l'ordre de commutation. Ainsi, cela peut aller T0, T1, T2, T1, T3, T0, T2 et ainsi de suite. À toutes fins utiles, les threads sont parallèles.
  4. Tranche de temps.
  5. Ce serait à l'OS.
1
sybreon

Le multithreading est l'exécution de plusieurs threads à la fois. Cela peut se produire à la fois sur des processeurs monocœur et sur des systèmes de processeurs multicœurs. Pour les systèmes à processeur unique, le changement de contexte l'affecte. La commutation de contexte dans cet environnement de calcul fait référence au découpage temporel par le système d'exploitation. Ne vous trompez donc pas. Le système d'exploitation est celui qui contrôle l'exécution des autres programmes. Il permet à un programme de s'exécuter dans la CPU à la fois. Mais la fréquence à laquelle les threads sont commutés dans et hors du CPU détermine la transparence du parallélisme présenté par le système.

Pour un environnement multicœur, le multithreading se produit lorsque chaque cœur exécute un thread. Cependant, dans le multicœur à nouveau, le changement de contexte peut se produire dans les cœurs individuels.

1
Paul Davies

Je pense que les réponses jusqu'à présent sont à peu près au point et vous donnent un bon contexte de base. Essentiellement, disons que vous avez un processeur quad core, mais chaque coeur est capable d'exécuter 2 threads simultanés.

Notez qu'il n'y a qu'une légère (ou aucune) augmentation de vitesse si vous exécutez 2 threads simultanés sur 1 noyau par rapport au 1er thread puis au 2e thread verticalement. Cependant, chaque cœur physique ajoute de la vitesse à votre flux de travail général.

Supposons maintenant que vous avez un processus en cours d'exécution sur votre système d'exploitation qui a plusieurs threads (c'est-à-dire qui doit exécuter plusieurs choses en "parallèle") et qui a une sorte de pile de tâches dans une file d'attente (ou un autre système avec des règles de priorité). Ensuite, le logiciel envoie des tâches à une file d'attente et votre processeur tente de les exécuter aussi rapidement que possible. Maintenant, vous avez 2 cas:

  1. Si un logiciel prend en charge le multitraitement, les tâches seront envoyées à n'importe quel processeur disponible (qui ne fait rien ou qui a simplement terminé de faire un autre travail et l'envoi de travail à partir de votre logiciel est le premier dans une file d'attente).
  2. Si votre logiciel ne prend pas en charge le multitraitement, tous vos travaux seront effectués de la même manière, mais uniquement par l'un de vos cœurs.

Je suggère de lire page Wikipedia sur le fil. La toute première photo vous donne déjà un bon aperçu. :)

0
Dom Grey