2012-05-23 11 views
5

Considere el siguiente fragmento de código.Por qué la dirección de la variable permanece igual en la llamada al sistema fork() después de haber sido modificada

if (fork() == 0) 
{ 
    a = a + 5; 
    printf("%d, %d \n", a, &a); 
} 
else 
{ 
    a = a - 5; 
    printf ("%d, %d \n", a,& a); 
} 

yo sepa, cuando se hace tenedor(), el espacio de direcciones virtuales de la matriz se copia en el niño y ambos padres del niño & cuota de las mismas páginas físicas hasta que uno de ellos trata de modificar. En el momento en que uno de los elementos secundarios & padre modifica una variable, la página física del elemento primario se copia en otra página para el elemento secundario y las páginas físicas permanecen privadas. Entonces, aquí el valor de 'a' es diferente en el elemento secundario &. Pero cuando se trata de las direcciones de 'a' en el elemento primario &, el resultado es el mismo. No soy capaz de descubrir por qué la dirección permanece igual incluso si las páginas físicas son diferentes.

Respuesta

7

La dirección de a no es la dirección física real.

Es una dirección virtual.
La capa de hardware/sistema operativo asigna direcciones virtuales a direcciones físicas (de forma invisible para su aplicación).

Por lo tanto, aunque las direcciones tienen el mismo number, no se asignan a la misma memoria física en su chip ram.

PS. Al imprimir la dirección (es decir, puntero) utilizando printf() es mejor utilizar "% p"

+0

Significa que lo que sea que veamos es la dirección virtual. ¿Podemos ver la dirección física real a través de nuestro programa? –

+0

Si obtiene las herramientas correctas (SO). Pero en circunstancias normales, no. –

+0

Gracias por la respuesta .. –

3

La respuesta casi está en su pregunta: se copia la página física de a (y por lo tanto no es la misma que en el proceso principal) después de modificar a, pero la dirección virtual (lo que ve su programa, a través de &a) no cambia.

De hecho, sería muy incómodo cambiar la dirección virtual de a al asignarle un nuevo valor. Considere lo que sucede si se hubiera almacenado previamente un puntero a a:

int *p = &a; 
a = a - 5; 
printf("%d", *p) 

Después de la segunda línea de p no apuntaría más a a, un comportamiento que ningún programador podría esperar.

El uso de copy-on-write para páginas físicas es una optimización del sistema operativo que es irrelevante para el comportamiento de su programa: puede considerar que todo el espacio de direcciones se copia cuando se bifurca.

+0

Gracias, fue útil. –

Cuestiones relacionadas