Quelqu'un peut-il expliquer la différence entre une fourche et un fil ?
Vous voulez probablement désigner la "copie du processus actuel" comme un processus enfant.
Quelqu'un peut-il expliquer la différence entre une fourche et un fil ?
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.
Cependant, le segment de texte est souvent partagé (virtuellement) et même le segment de données peut être copié sur l'écriture.
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 :
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 :
Pour plus de détails, voir ici .
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 ?
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.
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.
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.
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.