web-dev-qa-db-fra.com

Différence entre pthread et fork sur gnu / Linux

Quelle est la différence de base entre un filetage et une fourche w.r.t. Linux en termes de différences d'implémentation et de variation de l'ordonnancement (varie-t-il?)

J'ai exécuté strace sur deux programmes similaires, l'un utilisant pthreads et l'autre utilisant fork, tous deux à la fin font syscall avec clone () avec des arguments différents, donc je suppose que les deux sont essentiellement les mêmes sur un système linux mais avec pthreads étant plus facile à gérer dans du code.

Quelqu'un peut-il donner une explication approfondie?

EDIT: voir aussi une question connexe question

35
srinathhs

En C, il y a cependant quelques différences:

fork ()

  • Le but est de créer un nouveau processus, qui devient le processus enfant de l'appelant

  • Les deux processus exécuteront l'instruction suivante après l'appel système fork ()

  • Deux copies identiques de l'espace d'adressage, du code et de la pile de l'ordinateur sont créées, une pour le parent et l'enfant.

Penser à la fourchette comme à une personne; Le fork crée un clone de votre programme (processus), qui exécute le code qu'il a copié.


pthread_create ()

  • Le but est de créer un nouveau thread dans le programme qui reçoit le même processus que l'appelant

  • Les threads d'un même processus peuvent communiquer à l'aide de la mémoire partagée. (Faites attention!)

  • Le deuxième thread partagera les données, les fichiers ouverts, les gestionnaires de signaux et les dispositions des signaux, le répertoire de travail actuel, les ID d'utilisateur et de groupe. Le nouveau thread obtiendra sa propre pile, son ID de thread et ses registres.

Poursuivant l'analogie; votre programme (processus) développe un deuxième bras lorsqu'il crée un nouveau fil, connecté au même cerveau.

63
Gabriel Fair

Vous devriez regarder la page de manuel clone .

En particulier, il répertorie tous les modes de clonage possibles et comment ils affectent le processus/thread, l'espace de mémoire virtuelle, etc.

Vous dites "les threads plus faciles à manipuler dans le code": c'est très discutable. L'écriture de code multi-threads sans bogue et sans blocage peut être un véritable défi. Parfois, avoir deux processus distincts rend les choses beaucoup plus simples.

6
Mat

Sous Linux, l'appel système clone clone une tâche, avec un niveau de partage configurable. fork() appelle clone(least sharing) et pthread_create() appelle clone(most sharing). bifurquer coûte un tout petit peu plus que pthread_createing à cause de la copie des tables et de la création de mappages COW pour la mémoire.

6
Davood Hanifi