Pourquoi les threads sont-ils appelés processus légers?
Un thread est "léger" car la majeure partie de la surcharge a déjà été accomplie grâce à la création de son processus.
J'ai trouvé cela dans l'un des tutoriels.
Quelqu'un peut-il élaborer ce que cela signifie exactement?
6 réponses
L'affirmation selon laquelle les threads sont "légers" n'est pas nécessairement fiable, selon la plate - forme.
Un thread du système d'exploitation doit prendre en charge l'exécution de code natif, par exemple écrit en C. Il doit donc fournir une pile de taille décente, généralement mesurée en mégaoctets. Donc, si vous démarrez 1000 threads (peut - être pour tenter de prendre en charge 1000 connexions simultanées à votre serveur), vous aurez une exigence de mémoire de 1 GO dans votre processus avant même de commencer à faire de la vraie travail.
C'est un vrai problème dans les serveurs hautement évolutifs, donc ils n'utilisent pas de threads comme s'ils étaient légers du tout. Ils les traitent comme des ressources lourdes. Ils peuvent plutôt créer un nombre limité de threads dans un pool et les laisser prendre des éléments de travail à partir d'une file d'attente.
Comme cela signifie que les threads sont de longue durée et en petit nombre, il pourrait être préférable d'utiliser des processus à la place. De cette façon vous obtenez l'isolement de l'espace d'adressage et il n'y a pas vraiment de problème avec le manque de ressources.
En résumé: méfiez-vous des réclamations "marketing" faites au nom des threads. Le traitement parallèle est génial (de plus en plus, il sera essentiel), mais les threads ne sont qu'une façon de l'atteindre.
La création du processus est "coûteuse", car elle doit configurer un nouvel espace mémoire virtuel complet pour le processus avec son propre espace d'adressage. "cher" signifie prend beaucoup de temps CPU.
Les Threads n'ont pas besoin de faire cela, il suffit de changer quelques pointeurs, donc c'est beaucoup plus "moins cher" que de créer un processus. La raison pour laquelle les threads n'en ont pas besoin est qu'ils s'exécutent dans l'espace d'adressage et la mémoire virtuelle du processus parent.
Chaque processus doit avoir au moins un fil. Si si vous y réfléchissez, créer un processus signifie créer le processus et créer un thread. Évidemment, créer seulement un thread prendra moins de temps et fonctionnera par l'ordinateur.
En outre, les threads sont "légers" parce que les threads peuvent interagir sans avoir besoin de communication inter-processus. La commutation entre les threads est "moins chère" que la commutation entre les processus (encore une fois, il suffit de déplacer quelques pointeurs). Et la communication inter-processus nécessite une communication plus coûteuse que threads.
Les Threads d'un processus partagent le même espace de mémoire virtuelle, mais chacun a une pile séparée, et éventuellement "thread-local storage" s'il est implémenté. Ils sont lightweight car un commutateur de contexte est simplement un cas de commutation du pointeur de pile et du compteur de programme et de restauration d'autres registres, où un commutateur de contexte implique également de changer le contexte MMU.
De plus, la communication entre threads au sein d'un processus est légère car ils partager un espace d'adressage.
Processus:
- ID de processus
- environnement
- dossier
- registres
- pile
- tas
- descripteur de fichier
- bibliothèques partagées
- instruments de communication interprocess (pipes, sémaphores, Files d'attente, mémoire partagée, etc.)
- sources D'exploitation spécifiques
Fil:
- pile
- registres
- attributs (pour sheduler, comme priorité, stratégie, etc.)
- fil spécifique données
- sources D'exploitation spécifiques
Un processus contient un ou plusieurs threads et un thread peut faire tout ce qu'un processus peut faire. De plus, les threads d'un processus partagent le même espace d'adressage en raison du coût de la communication entre les threads étant faible car ils utilisent la même section de code, la même section de données et les mêmes ressources OS, de sorte que toutes ces fonctionnalités de thread en font un "processus léger".
Juste parce que les threads partagent l'espace mémoire commun . La mémoire allouée au thread principal sera partagée par tous les autres threads enfants. Alors qu'en cas de processus, les processus enfants ont besoin d'allouer l'espace mémoire séparé.