101 votes

Quelle est la différence entre une fourche et un fil ?

Quelqu'un peut-il expliquer la différence entre une fourche et un fil ?

104voto

Dacav Points 2536

Un fork vous donne un tout nouveau processus, qui est une copie du processus actuel, avec les mêmes segments de code. Lorsque l'image mémoire change (généralement en raison du comportement différent des deux processus), vous obtenez une séparation des images mémoire (Copy On Write), mais le code exécutable reste le même. Les tâches ne partagent pas la mémoire, à moins qu'elles n'utilisent une méthode de partage de la mémoire. Communication interprocessus (IPC) primitif.

Un processus peut avoir plusieurs threads, chacun s'exécutant en parallèle dans le même contexte du processus. La mémoire et les autres ressources sont partagées entre les threads, par conséquent, les données partagées doivent être accédées par le biais de certains objets primitifs et de synchronisation (tels que mutex , variables de condition et sémaphores ) qui vous permettent d'éviter la corruption des données.

3 votes

Vous voulez probablement désigner la "copie du processus actuel" comme un processus enfant.

1 votes

Cependant, le segment de texte est souvent partagé (virtuellement) et même le segment de données peut être copié sur l'écriture.

0 votes

87voto

GeekRide Points 281

Fourche

La bifurcation n'est rien d'autre qu'un nouveau processus qui ressemble exactement à l'ancien ou au processus parent, mais il s'agit tout de même d'un processus différent avec un ID de processus différent et possédant sa propre mémoire. Le processus parent crée un espace d'adressage distinct pour l'enfant. Les processus parent et enfant possèdent le même segment de code, mais s'exécutent indépendamment l'un de l'autre.

L'exemple le plus simple de bifurcation est l'exécution d'une commande sur le shell dans Unix/Linux. Chaque fois qu'un utilisateur lance une commande, le shell crée un processus enfant et la tâche est terminée.

Lorsqu'un appel système fork est émis, une copie de toutes les pages correspondant au processus parent est créée, chargée dans un emplacement mémoire séparé par le SE pour le processus enfant, mais dans certains cas, cela n'est pas nécessaire. Comme dans les appels système 'exec', il n'est pas nécessaire de copier les pages du processus parent, car execv remplace l'espace d'adressage du processus parent lui-même.

Quelques points à noter concernant la bifurcation :

  • Le processus enfant aura son propre ID de processus unique.
  • Le processus enfant doit avoir sa propre copie du descripteur de fichier du parent.
  • Les verrous de fichiers posés par le processus parent ne doivent pas être hérités par le processus enfant.
  • Tous les sémaphores qui sont ouverts dans le processus parent doivent également être ouverts dans le processus enfant.
  • Le processus enfant doit avoir sa propre copie des descripteurs de la file d'attente de messages du parent.
  • L'enfant aura son propre espace d'adressage et sa propre mémoire.

Les fils

Les threads sont des processus légers (LWP). Traditionnellement, un thread n'est qu'un état du CPU (et quelques autres états minimaux), le processus contenant le reste (données, pile, E/S, signaux). Les threads nécessitent moins de frais généraux que la "bifurcation" ou la création d'un nouveau processus, car le système n'initialise pas un nouvel espace mémoire virtuel et un nouvel environnement pour le processus. Bien qu'ils soient plus efficaces sur un système multiprocesseur où le flux de processus peut être programmé pour s'exécuter sur un autre processeur, ce qui permet de gagner en vitesse grâce au traitement parallèle ou distribué, des gains sont également constatés sur les systèmes uniprocesseurs qui exploitent la latence des E/S et d'autres fonctions du système susceptibles d'interrompre l'exécution du processus.

Les threads d'un même processus se partagent :

  • instructions de traitement
  • la plupart des données
  • fichiers ouverts (descripteurs)
  • signaux et gestionnaires de signaux
  • le répertoire de travail actuel
  • identifiant de l'utilisateur et du groupe

Pour plus de détails, voir ici .

2 votes

Un processus peut avoir plusieurs threads. Si l'un des threads d'un processus appelle fork, le processus bifurqué possède-t-il une mémoire entièrement dupliquée, mais seul le thread appelant se trouve dans le nouveau processus ?

0 votes

0 votes

Même si le processus enfant possède son propre espace d'adressage, il est une copie exacte de l'espace d'adressage du parent, ce qui implique que s'il existe une variable aléatoire int a = 10 dans le processus parent qui occupe la position mémoire 1000ème dans l'espace d'adressage parent, alors même dans le processus enfant int a = 10 occuperont la même adresse mémoire de 1000ème. Pourtant, la modification de a sera différent pour le processus parent et enfant, chacun d'entre eux peut modifier a sans affecter les autres puisqu'il s'agit d'une copie.

32voto

Sam Post Points 1812

La réponse de Dacav est excellente, je voulais juste ajouter que tous les modèles de threading ne vous donnent pas un vrai multi-processing.

Par exemple, l'implémentation par défaut du threading de Ruby n'utilise pas les véritables threads du système d'exploitation ou du noyau. Au lieu de cela, elle imite l'utilisation de plusieurs threads en passant d'un objet Thread à l'autre au sein d'un seul thread / processus du noyau.

Ceci est important sur les systèmes multiprocesseurs/multi-cœurs, car ces types de threads légers ne peuvent fonctionner que sur un seul cœur - vous n'obtiendrez pas beaucoup d'amélioration des performances en ayant plusieurs threads.

L'autre endroit où cela fait une différence est lorsqu'un thread se bloque (en attendant une E/S ou en appelant une IOCTL d'un pilote), tous les threads se bloquent.

Ce n'est pas très courant de nos jours - la plupart des implémentations de threads utilisent les threads du noyau qui ne souffrent pas de ces problèmes - mais cela vaut la peine de le mentionner pour être complet.

En revanche, le fork vous donne un autre processus qui peut être exécuté simultanément sur une autre unité centrale physique pendant que le processus original est en cours d'exécution. Certaines personnes trouvent l'IPC plus adapté à leur application, d'autres préfèrent le threading.

Bonne chance et amusez-vous bien ! Le multithreading est à la fois un défi et une source de satisfaction.

8 votes

+1 pour avoir touché un point sensible : "tous les threads ne vous donnent pas un vrai multiprocessing"

7voto

sergio Points 51

Les threads sont des fonctions exécutées en parallèle, le fork est un nouveau processus avec héritage des parents. Les threads permettent d'exécuter une tâche en parallèle, tandis que les forks sont des processus indépendants, qui fonctionnent également simultanément. Les threads ont des conditions de course et il y a des contrôles de sémaphores et de verrous ou de mutex, les pipes peuvent être utilisés dans les forks et les threads.

6voto

Varun Chhangani Points 152
  1. Les threads partagent l'espace d'adressage du processus qui les a créés ; les processus ont leur propre espace d'adressage. d'adresse.
  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. du segment de données du processus parent.
  3. Les threads peuvent communiquer directement avec les autres threads de leur processus. la communication interprocessus pour communiquer avec les processus frères.
  4. Les threads n'ont presque pas de frais généraux ; les processus ont des frais généraux considérables.
  5. Les nouveaux fils sont facilement créés ; les nouveaux processus nécessitent la duplication du processus parent.
  6. Les threads peuvent exercer un contrôle considérable sur les threads d'un même processus ; les processus peuvent seulement exercer un contrôle sur les processus fils.
  7. Les modifications apportées au thread principal (annulation, changement de priorité, etc.) peuvent affecter le comportement des autres threads du processus ; les modifications apportées au processus parent n'affectent 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