Para entender cómo puede suceder esto, debe comprender el proceso/modelo de subprocesos de Linux. Linux sigue el modelo fork-and-exec heredado de UNIX. El proceso generado por la llamada al sistema fork() en este modelo es una especie de cruce entre el hilo y el proceso de Windows.
Cuando se engendra el hilo (no importa en Linux o en Windows), el nuevo hilo comparte su espacio de direcciones con el padre. Ambos pueden encontrar los mismos objetos accediendo a las mismas direcciones. Pero estos hilos usan diferentes pilas.Como resultado, se garantiza que las variables locales de ambos hilos no tendrán las mismas direcciones.
Cuando se genera el proceso en el entorno de Windows, el sistema operativo construye un espacio de direcciones totalmente nuevo desde cero y lo rellena por la memoria y los datos necesarios. En teoría, la variable local de ambos procesos puede tener las mismas direcciones, pero en la práctica la probabilidad de esto será muy baja. E incluso en el caso en que ambas variables usen la misma dirección, estas dos variables seguirán siendo objetos diferentes.
Los procesos de UNIX tienen similitud con los subprocesos y con los procesos de Windows. Al igual que en el segundo caso, OS creará NUEVO espacio de direcciones para un proceso secundario, pero a diferencia de Windows, Linux lo crea mediante la copia diferida del espacio de direcciones del proceso principal con el uso del enfoque Copiar-Escribir-Escribir (COW). VACA significa que ambos procesos compartirán la misma memoria, pero hasta el momento en que uno de ellos la modifique. En el momento del intento de escribir en la memoria, el sistema operativo volverá a estar involucrado para copiar el fragmento de memoria que se va a cambiar y asignar una copia al padre y otra al hijo. A partir de este momento, cada proceso funcionará con su propia copia independiente de los objetos en el fragmento de memoria modificado, pero seguirán teniendo las mismas direcciones. Lo mismo es cierto para la pila y las variables locales almacenadas en él.
En su caso tiene dos hijos con dos copias de la misma pila en las que las variables locales se almacenan en las mismas direcciones pero en espacios de direcciones diferentes. Luego has ejecutado el mismo código en ambos hijos. En otras palabras, tiene el mismo estado inicial del diseño de pila y ejecuta el mismo código que modifica este diseño de la misma manera. Como resultado, tendrá las mismas variables locales ubicadas en las mismas direcciones.
En realidad, se correlacionará con las mismas direcciones físicas hasta que se produzca la copia por escritura. –
Gracias, lo entiendo ahora. – Asheron2332
@R, afirmaré que como parte del bit "y así sucesivamente" al final :-) – paxdiablo