2016 votes

Quelle est la différence entre un processus et un fil?

Quelle est la différence technique entre un processus et un thread?

J'ai l'impression qu'un mot comme 'processus' est surutilisé et il y a aussi des threads matériels et logiciels. Que dire des processus légers dans des langages comme Erlang? Y a-t-il une raison définitive d'utiliser un terme plutôt que l'autre?

2 votes

10 votes

Il est probablement utile de dire que chaque système d'exploitation a une définition différente de ce qu'est un 'thread' ou un 'processus'. Certains systèmes d'exploitation grand public n'ont pas de concept de 'thread', il y a aussi des systèmes d'exploitation embarqués qui n'ont que des 'threads'.

6 votes

TLDR: Les "threads" frères (dans la plupart des systèmes d'exploitation) partagent le même espace d'adressage virtuel, les mêmes sockets et fichiers ouverts, toutes les mêmes ressources. Les "processus," en revanche, sont isolés/protégés les uns des autres et ne partagent rien sauf s'ils demandent explicitement à partager quelque chose de spécifique. Dans un système d'exploitation qui a à la fois des "processus" et des "threads," un processus peut souvent être considéré comme un conteneur pour un ou plusieurs threads et pour toutes les ressources qu'ils partagent.

1764voto

Greg Hewgill Points 356191

Les processus et les threads sont des séquences d'exécution indépendantes. La différence typique est que les threads (du même processus) s'exécutent dans un espace mémoire partagé, tandis que les processus s'exécutent dans des espaces mémoire séparés.

Je ne suis pas sûr de ce que vous entendez par "threads" matériels versus "threads" logiciels. Les threads sont une fonctionnalité de l'environnement d'exploitation, plutôt qu'une fonctionnalité du processeur (bien que le processeur ait généralement des opérations qui rendent les threads efficaces).

Erlang utilise le terme "processus" car il n'expose pas de modèle de multiprogrammation en mémoire partagée. Les appeler "threads" impliquerait qu'ils ont une mémoire partagée.

96 votes

Les threads matériels font probablement référence à de multiples contextes de thread au sein d'un cœur (par exemple, HyperThreading, SMT, Niagara/Rock de Sun). Cela signifie des fichiers de registres dupliqués, des bits supplémentaires transportés avec l'instruction à travers les pipelines, et une logique de contournement/avancement plus complexe, entre autres choses.

7 votes

@greg, un doute que j'ai en fil. Imaginons que j'ai un processus A, qui occupe de l'espace dans la RAM. Si le processus A crée un fil, le fil a également besoin d'un espace pour s'exécuter. Est-ce que cela augmentera la taille de l'espace créé pour le processus A, ou l'espace pour le fil sera créé ailleurs ? Donc, quel est cet espace virtuel que le processus crée ? Veuillez me corriger si ma question est erronée. Merci.

12 votes

@JeshwanthKumarNK : La création d'un nouveau thread alloue au moins suffisamment de mémoire pour une nouvelle pile. Cette mémoire est allouée par le système d'exploitation dans le processus A.

984voto

Scott Langham Points 17447

Ces informations ont été trouvées sur Microsoft Learn ici : À propos des processus et des threads

Processus
Chaque processus fournit les ressources nécessaires pour exécuter un programme. Un processus a un espace d'adresses virtuelles, du code exécutable, des poignées ouvertes vers des objets système, un contexte de sécurité, un identifiant de processus unique, des variables d'environnement, une classe de priorité, des tailles minimale et maximale d'ensemble de travail, et au moins un thread d'exécution. Chaque processus commence avec un seul thread, souvent appelé le thread principal, mais peut créer des threads supplémentaires à partir de n'importe lequel de ses threads.

Thread
Un thread est une entité au sein d'un processus qui peut être planifiée pour l'exécution. Tous les threads d'un processus partagent son espace d'adresses virtuelles et ses ressources système. De plus, chaque thread maintient des gestionnaires d'exceptions, une priorité de planification, du stockage local au thread, un identifiant de thread unique, et un ensemble de structures que le système utilisera pour enregistrer le contexte du thread jusqu'à ce qu'il soit planifié. Le contexte du thread inclut l'ensemble de registres machine du thread, la pile du noyau, un bloc d'environnement du thread, et une pile utilisateur dans l'espace d'adresses du processus du thread. Les threads peuvent également avoir leur propre contexte de sécurité, qui peut être utilisé pour l'impersonation des clients.

Microsoft Windows prend en charge le multitâche préemptif, qui crée l'effet d'exécution simultanée de plusieurs threads à partir de plusieurs processus. Sur un ordinateur multiprocesseur, le système peut exécuter simultanément autant de threads qu'il y a de processeurs sur l'ordinateur.

0 votes

Ajoutons un thread principalement utilisé par les programmeurs dans l'environnement de la mémoire de la machine virtuelle. mais le domaine du processus est le système d'exploitation.

24 votes

Pour les personnes qui veulent savoir pourquoi vous ne pouvez pas formater une disquette en même temps : stackoverflow.com/questions/20708707/…

1 votes

Pourquoi chaque processus a-t-il toujours besoin d'au moins 1 thread ? Théoriquement, que se passerait-il si un processus n'avait aucun thread ?

350voto

Kumar Points 621

J'ai copié ces informations du blog Knowledge Quest! :

Processus :

  • Une instance exécutant un programme est appelée un processus.
  • Certains systèmes d'exploitation utilisent le terme "tâche" pour désigner un programme en cours d'exécution.
  • Un processus est toujours stocké dans la mémoire principale également appelée mémoire primaire ou mémoire vive.
  • Par conséquent, un processus est considéré comme une entité active. Il disparaît si la machine est redémarrée.
  • Plusieurs processus peuvent être associés à un même programme.
  • Sur un système multiprocesseur, plusieurs processus peuvent être exécutés en parallèle.
  • Sur un système monoprocesseur, bien que le vrai parallélisme ne soit pas atteint, un algorithme d'ordonnancement des processus est appliqué et le processeur est programmé pour exécuter chaque processus un par un donnant l'illusion de la concurrence.
  • Exemple : Exécution de plusieurs instances du programme "Calculatrice". Chacune des instances est considérée comme un processus.

Thread :

  • Un thread est un sous-ensemble du processus.
  • Il est appelé un "thread léger", car il est similaire à un vrai processus mais s'exécute dans le contexte d'un processus et partage les mêmes ressources allouées au processus par le noyau.
  • En général, un processus a un seul thread de contrôle - un ensemble d'instructions machine s'exécutant à la fois.
  • Un processus peut également être composé de plusieurs threads d'exécution qui exécutent des instructions simultanément.
  • Plusieurs threads de contrôle peuvent exploiter le vrai parallélisme possible sur les systèmes multiprocesseurs.
  • Sur un système monoprocesseur, un algorithme d'ordonnancement des threads est appliqué et le processeur est programmé pour exécuter chaque thread un par un.
  • Tous les threads s'exécutant au sein d'un processus partagent le même espace d'adressage, des descripteurs de fichier, une pile et d'autres attributs liés au processus.
  • Étant donné que les threads d'un processus partagent la même mémoire, synchroniser l'accès aux données partagées au sein du processus revêt une importance sans précédent.

115 votes

Kumar: D'après mes connaissances, les threads ne partagent pas la même pile. Sinon, il ne serait pas possible d'exécuter un code différent sur chacun d'eux.

39 votes

Oui, je pense que @MihaiNeacsu a raison. Les threads partagent "code, données et fichiers" et ont leur propre "registres et stack". Diapositive de mon cours sur les OS : i.imgur.com/Iq1Qprv.png

0 votes

Ceci est assez utile, car cela élargit sur ce que sont les threads et les processus et comment ils se rapportent les uns aux autres. Je suggérerais d'ajouter un exemple d'un Thread, surtout qu'il y en a un pour un Process. Bonne chose!

197voto

Robert S. Barnes Points 17244

Tout d'abord, regardons l'aspect théorique. Vous devez comprendre ce qu'est un processus conceptuellement pour comprendre la différence entre un processus et un thread et ce qui est partagé entre eux.

Nous avons ce qui suit dans la section 2.2.2 Le Modèle de Thread Classique de Systèmes d'exploitation modernes 3e par Tanenbaum:

Le modèle de processus est basé sur deux concepts indépendants: regroupement des ressources et l'exécution. Parfois, il est utile de les séparer; c'est là que les threads interviennent...

Il continue:

Une façon de voir un processus est que c'est une manière de regrouper des ressources connexes. Un processus a un espace d'adressage contenant un texte de programme et des données, ainsi que d'autres ressources. Ces ressources peuvent inclure des fichiers ouverts, des processus enfants, des alarmes en attente, des gestionnaires de signaux, des informations comptables, et plus encore. En les regroupant sous la forme d'un processus, ils peuvent être gérés plus facilement. L'autre concept qu'un processus a est un fil d’exécution, généralement abrégé en fil. Le fil possède un compteur de programme qui garde trace de l'instruction à exécuter ensuite. Il possède des registres, qui contiennent ses variables de travail actuelles. Il a une pile, qui contient l'historique d'exécution, avec un cadre pour chaque procédure appelée mais pas encore revenue. Bien qu'un fil doive s'exécuter dans un processus, le fil et son processus sont des concepts différents et peuvent être traités séparément. Les processus sont utilisés pour regrouper des ressources; les threads sont les entités planifiées pour l'exécution sur l'UC.

Plus bas, il fournit le tableau suivant:

Objets par processus             | Objets par fil
------------------------------|-----------------
Espace d'adressage                 | Compteur de programme
Variables globales              | Registres
Fichiers ouverts                    | Pile
Processus enfants                  | État
A...

Maintenant, regardons le côté logiciel. Il existe essentiellement trois façons d'implémenter des threads du côté logiciel.

Les threads dans l'espace utilisateur
Les threads du noyau
Une combinaison des deux

Tout ce dont vous avez besoin pour implémenter des threads est la capacité à sauvegarder l'état du CPU et à maintenir plusieurs piles, ce qui peut souvent être fait dans l'espace utilisateur. L'avantage des threads dans l'espace utilisateur est le changement de thread ultra-rapide car vous n'avez pas à piéger dans le noyau et la capacité de planifier vos threads comme vous le souhaitez. Le plus gros inconvénient est l'incapacité à effectuer des E/S bloquantes (ce qui bloquerait l'ensemble du processus et tous ses threads utilisateur), ce qui est l'une des principales raisons pour lesquelles on utilise des threads en premier lieu. L'utilisation de threads pour les E/S bloquantes simplifie grandement la conception des programmes dans de nombreux cas.
Les threads du noyau ont l'avantage de pouvoir utiliser des E/S bloquantes, en plus de laisser tous les problèmes de planification au système d'exploitation. Mais chaque changement de thread nécessite un piégeage dans le noyau qui est potentiellement relativement lent. Cependant, si vous changez de threads en raison d'une E/S bloquée, ce n'est pas vraiment un problème car l'opération d'E/S vous a probablement déjà piégé dans le noyau de toute façon.
Une autre approche est de combiner les deux, avec plusieurs threads kernel ayant chacun plusieurs threads utilisateur.
Revenons à votre question de terminologie, vous pouvez voir qu'un processus et un fil d'exécution sont deux concepts différents et le choix du terme à utiliser dépend de ce dont vous parlez. En ce qui concerne le terme "processus léger", je ne vois pas vraiment l'intérêt car il ne rend pas aussi bien compte de ce qui se passe que le terme "fil d'exécution".

12 votes

Réponse exceptionnelle! Elle explique clairement beaucoup de jargon et d'assumptions. Cela rend cependant cette phrase un peu délicate : "Alors quelqu'un a eu l'idée d'avoir essentiellement deux ensembles d'états de thread ( PC + registres )" -- à quoi renvoie le "PC" ici?

7 votes

@Smithers Le PC est le compteur de programme ou compteur d'instructions, qui donne l'adresse de la prochaine instruction à exécuter: fr.wikipedia.org/wiki/Program_counter

1 votes

127voto

hardy Points 491

Quelle est la différence entre un thread et un processus?

La principale différence entre les threads et les processus est :

  1. Les threads partagent l'espace d'adressage du processus qui les a créés; les processus ont leur propre espace d'adressage.
  2. Les threads ont un accès direct au segment de données de leur processus; les processus ont leur propre copie du segment de données du processus parent.
  3. Les threads peuvent communiquer directement avec d'autres threads de leur processus; les processus doivent utiliser la communication interprocessus pour communiquer avec les processus frères.
  4. Les threads ont presque aucun surcoût; les processus ont un surcoût considérable.
  5. Il est facile de créer de nouveaux threads; la création de nouveaux processus nécessite la duplication du processus parent.
  6. Les threads peuvent exercer un contrôle considérable sur les threads du même processus; les processus ne peuvent exercer de contrôle que sur les processus enfants.
  7. Les modifications apportées au thread principal (annulation, modification de priorité, etc.) peuvent affecter le comportement des autres threads du processus; les modifications apportées au processus parent ne touchent pas les processus enfants.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X