10 votes

Comment puis-je avoir 1805 threads alors que je n'ai que 4 CPU virtuels ?

Je me demandais si quelqu'un pouvait m'expliquer comment, dans mon moniteur d'activité, il est indiqué que j'ai actuellement 1805 fils de discussion. Screen shot of OS X Activity Monitor

Mais je n'ai que 4 cœurs virtuels sur mon ordinateur (ce qui signifie que je ne devrais pouvoir avoir que 4 threads). Le nombre de threads correspond-il à tous les threads qui sont gérés par les CPU lorsqu'ils décident quel thread exécuter ?

EDIT : La raison pour laquelle je pense qu'il ne peut y avoir que 4 threads sur ma machine provient de ceci réponse . Je crois que mon malentendu vient du fait que le mot "fil" est utilisé dans un contexte différent.

26voto

Basil Bourque Points 9801

Programmation

Vos 1 805 les fils ne fonctionnent pas simultanément . Ils font un compromis. Un cœur exécute un bout du fil, puis le met de côté pour exécuter un bout d'un autre fil. Les autres cœurs font de même. Tour à tour, les threads exécutent un petit bout à la fois, et non pas tous en même temps.

L'une des principales responsabilités du système d'exploitation (Darwin et MacOS) est l'ordonnancement de l'exécution d'un thread sur un cœur et pendant combien de temps.

De nombreux fils n'ont pas de travail à faire, et sont donc laissés en sommeil et non programmés. De même, de nombreux threads peuvent être en attente d'une ressource quelconque, comme des données à extraire du stockage, une connexion réseau à terminer ou des données à charger depuis une base de données. N'ayant rien d'autre à faire que de vérifier l'état de la ressource attendue, ces threads sont programmés assez brièvement, voire pas du tout.

Le programmeur de l'application peut faciliter cette opération d'ordonnancement en mettant son thread en sommeil pendant un certain temps lorsqu'il sait que l'attente de la ressource externe prendra un certain temps. Et s'il s'agit d'une boucle "serrée" qui consomme beaucoup de CPU sans qu'il soit nécessaire d'attendre des ressources externes, le programmeur peut insérer un appel au volontaire pour qu'il se mette brièvement de côté afin de ne pas monopoliser le cœur et de permettre ainsi aux autres threads de s'exécuter.

Pour plus de détails, voir le Page Wikipedia sur le multithreading .

Multithreading simultané

Quant à votre Question liée Les fils de discussion y sont en effet les mêmes qu'ici.

L'un des problèmes qui se posent est le surcoût lié au passage d'un thread à l'autre lors de la programmation par le système d'exploitation. Il y a un coût significatif en temps pour décharger les instructions et les données du thread actuel du noyau et ensuite charger les instructions et les données du prochain thread programmé. Une partie du travail du système d'exploitation consiste à essayer d'être intelligent dans l'ordonnancement des threads afin d'optimiser ce surcoût.

Certains fabricants de processeurs ont mis au point une technologie permettant de réduire ce temps afin de rendre le passage d'une paire de threads beaucoup plus rapide. Intel appelle sa technologie Hyper-Threading . Connu sous le nom générique de multithreading simultané (SMT) .

Bien que la paire de threads ne s'exécute pas réellement simultanément, la commutation est si fluide et rapide que les deux threads semblent être virtuellement simultanés. Cela fonctionne si bien que chaque cœur se présente au système d'exploitation comme une paire de cœurs virtuels. Ainsi, un processeur SMT doté de quatre cœurs physiques, par exemple, se présentera au système d'exploitation comme un processeur à huit cœurs.

Malgré cette optimisation, il y a toujours un peu de Les frais de commutation entre ces cœurs virtuels. Un trop grand nombre de fils d'exécution intensifs pour le processeur, qui réclament tous un temps d'exécution sur un cœur, peut rendre le système inefficace, car aucun fil d'exécution n'accomplit beaucoup de travail. C'est comme si trois balles sur un terrain de jeu étaient partagées entre neuf enfants, par opposition à un partage entre neuf autres enfants. cent où aucun enfant n'a vraiment le droit de jouer sérieusement avec un ballon.

Il existe donc une option dans le microprogramme du processeur qui permet à l'administrateur système de désactiver SMT s'il décide que cela serait bénéfique pour les utilisateurs qui exécutent une application dont le processeur est exceptionnellement sollicité et qui offre très peu de possibilités de pause.

Dans ce cas, nous en revenons à votre question initiale : Dans cette situation particulière, vous voudriez en effet contraindre les opérations à ne pas avoir plus de ces threads hyperactifs que vous n'avez de cœurs physiques. Mais permettez-moi de le répéter : il s'agit d'une situation extrêmement inhabituelle qui pourrait se produire dans le cadre d'un projet scientifique spécialisé dans le traitement des données, mais qui ne s'appliquerait presque jamais à des scénarios communs d'entreprise.

7voto

Oskar Points 1242

Autrefois, la mémoire n'était pas virtualisée ou protégée et n'importe quel code pouvait écrire n'importe où. À l'époque, une conception de type "un thread pour un CPU" avait du sens. Au cours des décennies qui ont suivi, la mémoire a d'abord été protégée, puis virtualisée. Considérez les threads comme des cœurs virtuels - une sorte de promesse qu'à un moment donné, lorsque vos données et votre code seront prêts, ce thread sera poussé ( ou programmé, comme l'appellent les ingénieurs et les mathématiciens qui font des recherches sur les algorithmes de programmation. ) sur un processeur réel pour effectuer un travail réel.

enter image description here

En raison de l'ampleur de la différence de temps, le processeur et la mémoire cache fonctionnent si rapidement par rapport à l'obtention de données à partir du stockage ou du réseau, que des milliers de threads peuvent aller et venir pendant qu'un thread attend que www.google.com lui livre un ou deux paquets de données.

Si vous convertissez les opérations de fil qui se produisent sur l'échelle de temps noir/bleu et les convertissez en une seconde = 1 ns, les choses dont nous nous soucions sont plus comme les IO de disque prennent 100 microsecondes sont comme 4 jours et un aller-retour internet de 200 ms est un retard de 20 ans si vous comptez les secondes sur l'échelle de temps du CPU. Comme plusieurs exercices de puissances de dix Dans la plupart des cas, l'unité centrale reste inactive pendant des mois en attendant un travail significatif de la part d'un monde extérieur très, très lent.

Rien ne semble anormal dans l'image que vous avez postée. Nous ne comprenons peut-être pas où vous voulez en venir en vous interrogeant sur les fils.

Si vous cliquez avec le bouton droit de la souris sur le mot "threads" dans la ligne d'en-tête en haut, ajoutez le statut de l'application et vous verrez que la plupart des threads sont probablement inactifs, en sommeil, non exécutés à un moment donné.

1voto

David Richerby Points 2685

Vous ne posez pas la question, sans doute plus fondamentale, "Comment puis-je avoir 290 processus alors que mon processeur n'a que quatre cœurs ?". Cette réponse est un peu d'histoire, qui pourrait vous aider à comprendre la vue d'ensemble, même si la question spécifique a déjà été répondue. En tant que tel, je ne vais pas donner une version TL;DR.

Il fut un temps (pensez aux années 50 et 60) où les ordinateurs ne pouvaient faire qu'une seule chose à la fois. Ils étaient très chers, remplissaient des pièces entières, et il fallait trouver un moyen de les utiliser efficacement en les partageant entre plusieurs personnes. La première façon de le faire était traitement par lot Les utilisateurs soumettent des tâches à l'ordinateur, qui les met en file d'attente, les exécute les unes après les autres et renvoie les résultats à l'utilisateur. C'était bien, mais cela signifiait que, si vous vouliez faire un calcul qui allait prendre quelques jours, personne d'autre ne pouvait utiliser l'ordinateur pendant ce temps.

L'innovation suivante (pensez aux années 60-70) était Partage du temps de travail . Maintenant, au lieu d'exécuter la totalité d'une tâche, puis la totalité de la tâche suivante, l'ordinateur exécuterait une partie d'une tâche, puis ferait une pause et exécuterait une partie de la tâche suivante, et ainsi de suite. Ainsi, l'ordinateur donne l'impression qu'il exécute plusieurs processus simultanément. Le grand avantage de ce système est que vous pouvez maintenant effectuer un calcul qui prendra quelques jours et, bien qu'il prenne encore plus de temps, parce qu'il est constamment interrompu, d'autres personnes peuvent toujours utiliser la machine pendant ce temps.

Tout cela pour d'énormes ordinateurs de type mainframe. Lorsque les ordinateurs personnels ont commencé à devenir populaires, ils n'étaient pas très puissants au départ et, comme ils étaient personnel il semblait normal qu'ils ne puissent faire qu'une seule chose&nbdp;- exécuter une application - à la fois (pensez aux années 1980). Mais, au fur et à mesure qu'ils devenaient plus puissants (des années 1990 à aujourd'hui), les gens ont voulu que leurs ordinateurs personnels puissent aussi partager leur temps.

Nous nous sommes donc retrouvés avec des ordinateurs personnels qui donnaient l'illusion d'exécuter plusieurs processus simultanément en les exécutant un par un pendant de brèves périodes, puis en les mettant en pause. Les threads sont essentiellement la même chose : finalement, les gens ont voulu que même les processus individuels donnent l'illusion de faire plusieurs choses en même temps. Au début, l'auteur de l'application devait s'en charger lui-même : il devait passer un peu de temps à mettre à jour les graphiques, mettre cela en pause, passer un peu de temps à calculer, mettre cela en pause, passer un peu de temps à faire autre chose, ...

Cependant, le système d'exploitation étant déjà bon pour gérer des processus multiples, il était logique de l'étendre pour gérer ces sous-processus, qui sont appelés threads. Ainsi, nous avons maintenant un modèle où chaque processus (ou application) contient au moins un thread, mais certains en contiennent plusieurs ou beaucoup. Chacun de ces threads correspond à une sous-tâche quelque peu indépendante.

Mais, au niveau supérieur, le CPU ne fait que donner l'illusion que ces threads fonctionnent tous en même temps. En réalité, il en exécute un pendant un petit moment, le met en pause, en choisit un autre à exécuter pendant un petit moment, et ainsi de suite. Sauf que les CPU modernes peuvent faire tourner plus d'un thread à la fois. Ainsi, dans le réel En réalité, le système d'exploitation joue le jeu de "exécuter un peu, faire une pause, exécuter autre chose un peu, faire une pause" sur tous les cœurs simultanément. Vous pouvez donc avoir autant de threads que vous (et les concepteurs de votre application) le souhaitez mais, à tout moment, tous les threads sauf quelques-uns seront en pause.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X