Je suis confus à propos de quelque chose. J'ai lu que lorsqu'un enfant est créé par un processus parent, l'enfant reçoit une copie de l'espace d'adressage de son parent. Qu'est-ce que cela signifie par copie?
Si j'utilise le code ci-dessous, il imprime la même valeur pour la variable 'A' qui se trouve sur le tas à la fois à l'enfant et à la mère. Alors qu'est-ce qui se passe ici?
5 Réponses :
une copie signifie exactement que, une copie bit-idée de l'espace d'adresses em>. À toutes fins utiles, les deux copies sont indiscernables, jusqu'à ce que vous commenciez à écrire en un (les modifications ne sont pas visibles dans l'autre copie). P>
avec Cela signifie que si vous modifiez Fourchette () Code> Le processus d'enfant reçoit un nouvel espace d'adressage où tout le contenu de l'espace d'adressage parent est copié (en fait, les noyaux modernes utilisent copie-écriture em >). p>
a code> ou la valeur pointée par elle dans un processus, l'autre processus voit toujours l'ancienne valeur. P>
Vous obtenez deux tas, et puisque les adresses de mémoire sont traduites dans différentes parties de la mémoire physique, les deux ont la même adresse de mémoire virtuelle. P>
L'enfant reçoit une copie exacte de l'espace d'adresses des parents, ce qui est susceptible d'être présenté dans le même format que l'espace d'adressage parent. Je dois souligner que chacun aura son propre espace d'adressage virtuel pour sa mémoire, de sorte que chacun pouvait avoir les mêmes données à la même adresse, mais dans différents espaces d'adresses. En outre, Linux utilise la copie sur l'écriture lors de la création de processus d'enfants. Cela signifie que le parent et l'enfant partageront l'espace d'adressage parent jusqu'à ce que l'un d'entre eux soit une écriture, à laquelle la mémoire sera copiée physiquement à l'enfant. Cela élimine des copies inutiles lorsque EXEC code> Un nouveau processus. Puisque vous allez simplement écraser la mémoire avec un nouvel exécutable, pourquoi la supporter la copie? P>
Oui, vous obtiendrez la même adresse virtuelle, mais rappelez-vous que chacun est de son propre processus d'espaces d'adresse virtuelle. Jusqu'à ce qu'il y ait une opération de copie sur écriture effectuée, tout est partagé. Ainsi, lorsque vous essayez de travailler Strcpy ou de toute opération d'écriture, la copie-écriture a lieu, ce qui signifie que l'adresse virtuelle de processus d'enfant du pointeur A sera mise à jour pour le processus d'enfant, mais pas pour le processus parent. P>
Notez que, à la fois parent et enfant, vous faites pas b> Imprimer l'adresse B> de variable
A code>. Vous imprimez la valeur b> de la variableA code> (qui est de type pointeur).Avez-vous vu une réponse que vous avez aimé?