2017-09-22 3 views
2

lors d'un processus fork un enfant, l'enfant ne copiera pas la variable du père mais si le processus enfant change la valeur de la variable père, il créera une nouvelle variable, nous appelons cette copie sur écriture, maintenant s'il vous plaît code ci-dessous:copie python sur écrire, vraiment?

# coding=utf-8 
import os 
value = [] 
res = os.fork() 

if res == 0: 
    value = [324] 
    print 'child id={id} value={value}'.format(id=id(value), value=value) 
else: 
    value = [2] 
    print 'parent id={id} value={value}'.format(id=id(value), value=value) 

si vous l'exécutez, le résultat peut-être comme ceci:

parent id=4321407056 value=[2] 
child id=4321407056 value=[324] 

ma question est:

(1) l'adresse de mémoire de valeur variable est la même, il est 4321407056. mais j'ai changé la valeur, cela signifie que j'écris la nouvelle valeur à la variable, pourquoi pas l'adresse de mémoire n'est pas changé? 2) s'ils ont la même adresse mémoire, pourquoi ont-ils la valeur différente, l'un est [2], l'autre est [234]?

+2

https://en.wikipedia.org/wiki/Virtual_memory – user2357112

+0

La mémoire virtuelle explique la même adresse pour les deux processus, mais encore pourquoi l'adresse n'a pas changé après assignmet? – geckos

Répondre

1

Ce sont des processus différents. Puisque chaque système moderne utilise maintenant la mémoire virtuelle, l'adresse que vous voyez dans l'application ne correspond pas vraiment à l'endroit où l'information est physiquement stockée. La même adresse peut être pour différentes applications: quelque part dans le tas, mappée sur un fichier disque, mappée sur un périphérique d'affichage, inexistante ou quelque chose de complètement différent.

Lors du traitement des fourches, il conservera la carte mémoire logique du parent, sinon tous les pointeurs devront être mis à jour. Mais la carte pointe vers une région de mémoire physique complètement différente après un changement.