¿Cómo se mapea la memoria cuando se usa la horquilla?

Soy nuevo en “fork ()”, leo en todas partes que cuando se inicia una fork () se inicia una copia exacta del proceso actual (de llamada). Ahora, cuando ejecuto el siguiente código, debe haber dos procesos diferentes, con dos procesos diferentes. Ubicaciones de memoria asignadas a sus vars y funciones.

#include int i=10; int pid; int main(){ if((pid=fork())==0){ i++;//somewhere I read that separate memory space for child is created when write is needed printf("parent address= %p\n",&i);// this should return the address from parent's memory space }else{ i++; i++; printf("child address= %p\n",&i);// this should return the address of child's memory space } wait(0); return(0); } 
 Por qué la salida se ve como: 
 Dirección del niño :: 804a01c 
 Dirección del padre: 804a01c

¿Por qué tanto la dirección es la misma para padres como para hijos?

teniendo dos ubicaciones de memoria diferentes asignadas a sus funciones y vars.

No Linux implementa memoria virtual , lo que significa que cada proceso tiene su propio espacio de direcciones completo. Como resultado, después de una fork , ambos procesos ven las mismas direcciones para sus copias de objetos en memoria.

(Aparte de esto: la VM también hace que el código se comparta entre el proceso en la memoria física y todos los datos solo se copiarán en la escritura ).

Las direcciones son de proceso local. 804a01c en un proceso no es lo mismo que 804a01c en otro proceso.

Debido a la memoria virtual : ambos espacios de direcciones parecen idénticos a los procesos respectivos. La memoria física en la que están almacenados es diferente. Sin embargo, esto es, en la práctica, complicado por una optimización de memoria (implementada por la mayoría de los kernels) que mapea las páginas virtuales diferentes correspondientes a las mismas páginas físicas hasta que uno de esos procesos escribe en esa página de la memoria, momento en el cual la página se duplica físicamente. a otra dirección física (y la página virtual se vuelve a asignar para el proceso).

También hay muchas otras complicaciones: la más reconocida es que el valor de retorno de fork() difiere entre los procesos, aunque generalmente es una diferencia en un valor de registro, no en la memoria. Sin embargo, los archivos abiertos y algunos otros recursos se pueden marcar como no heredables, por lo que podría haber otras diferencias, menores pero a veces útiles.

Intereting Posts