Question

ma question est quelque peu conceptuelle, comment les données de processus parent partagé avec le processus de l'enfant créé par un appel fork() ou avec un fil créé par pthread_create()

par exemple, sont des variables globales directement transmises dans le processus de l'enfant et si oui, est-modification à cette variable de fait par la valeur de l'effet de processus enfant dans le processus parent?

J'apprécie des réponses partielles et complètes à l'avance, si je manque une ressource existante, je suis désolé, je l'ai fait une recherche sur google mais n'a pas pu trouver de bons résultats

Merci encore pour votre temps et réponses

Était-ce utile?

La solution

La sémantique de fork () et pthread_create () sont un peu différentes.

fork () va créer un nouveau processus, où les variables globales seront séparés entre les parents et les enfants. La plupart des implémentations OS utilisent la sémantique de copie en écriture, ce qui signifie que le parent et le processus de l'enfant utiliseront les mêmes pages de mémoire physique pour toutes les variables globales jusqu'à ce qu'un des processus tente de modifier la mémoire physique, à quel point une copie de cette page est faite, de sorte que maintenant chaque processus obtient sa propre copie et ne voit pas de l'autre processus, de sorte que les processus sont isolés.

pthread_create () d'autre part, crée un nouveau thread dans le même processus. Le nouveau fil aura un espace de pile séparé des autres fils en cours d'exécution du même processus, mais les variables globales et un espace de segment de mémoire sont partagés entre tous les fils d'un même processus. Ceci est la raison pour laquelle vous avez souvent besoin d'un mutex pour coordonner l'accès à un morceau partagé de mémoire entre plusieurs threads du même processus.

TL; DR Version: avec fork (), vous ne voyez pas les changements de l'autre gars; avec pthread_create () que vous faites.

Autres conseils

Une fourchette crée une copie presque exacte du processus d'appel, y compris les descripteurs de mémoire et de fichiers. Les variables globales sont copiées avec tout le reste, mais ils ne sont en aucune façon liée au processus parent. Étant donné que les descripteurs de fichiers sont également copiés, parents et enfants peuvent interagir via ces (aussi longtemps qu'ils sont correctement configurés, habituellement par la conduite ou socketpair).

Il y a une grande différence entre les processus créés par fork et entre les fils créés avec pthread_create. Les processus ne partagent pas les variables globales et doivent communiquer à travers des tuyaux, des prises, ou d'autres outils fournis par le système d'exploitation. Une bonne solution est MPI - qui est une bibliothèque de passage de messages pour la communication inter-processus

.

Les threads sont tout à fait différents. Un fil créé avec pthread_create partage toutes les variables globales avec son interlocuteur. De plus, l'appelant peut transmettre une structure arbitraire dans le filet, et cette structure sera également partagée. Cela signifie qu'il faut être extrêmement prudent lors de la programmation avec des fils - les montants de partage sont dangereuses et sujette aux erreurs. L'API pthread fournit des mutex et des conditions pour la synchronisation entre les threads robuste (même si elle nécessite encore la pratique et l'expertise pour mettre en œuvre correctement).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top