Ya no necesitas indagar más en otras webs porque has llegado al sitio exacto, tenemos la respuesta que necesitas recibir pero sin liarte.
Citándome de otro hilo.
-
Cuando se emite una llamada al sistema fork(), se crea una copia de todas las páginas correspondientes al proceso principal, que el sistema operativo carga en una ubicación de memoria separada para el proceso secundario. Pero esto no es necesario en ciertos casos. Considere el caso en que un niño ejecuta una llamada al sistema “exec” o sale muy pronto después de la bifurcación (). Cuando se necesita el hijo solo para ejecutar un comando para el proceso principal, no es necesario copiar las páginas del proceso principal, ya que exec reemplaza el espacio de direcciones del proceso que lo invocó con el comando a ejecutar.
En tales casos, se utiliza una técnica llamada copy-on-write (COW). Con esta técnica, cuando se produce una bifurcación, las páginas del proceso principal no se copian para el proceso secundario. En su lugar, las páginas se comparten entre el proceso secundario y el principal. Cada vez que un proceso (padre o hijo) modifica una página, se crea una copia separada de esa página en particular para ese proceso (padre o hijo) que realizó la modificación. Este proceso utilizará la página recién copiada en lugar de la compartida en todas las referencias futuras. El otro proceso (el que no modificó la página compartida) continúa usando la copia original de la página (que ahora ya no se comparte). Esta técnica se llama copia en escritura ya que la página se copia cuando algún proceso escribe en ella.
-
Además, para entender por qué estos programas parecen estar usando el mismo espacio de memoria (que no es el caso), me gustaría citar una parte del libro “Sistemas Operativos: Principios y Práctica”.
La mayoría de los procesadores modernos introducen un nivel de direccionamiento indirecto, llamado direcciones virtuales. Con direcciones virtuales, la memoria de cada proceso comienza en el “mismo” lugar, por ejemplo, cero. Cada proceso piensa que tiene toda la máquina para él solo, aunque obviamente no es así en la realidad.
Entonces, estas direcciones virtuales son traducciones de direcciones físicas y no representan el mismo espacio de memoria física, para dejar un ejemplo más práctico, podemos hacer una prueba, si compilamos y ejecutamos varias veces un programa que muestra la dirección de un static variable, como este programa.
#include
int main() static int a = 0; printf("%pn", &a); getchar(); return 0; Sería imposible obtener la misma dirección de memoria en dos programas diferentes si tratamos directamente con la memoria física.
Y los resultados obtenidos al ejecutar el programa varias veces son…
Sí, ambos procesos utilizan la misma dirección para esta variable, pero estas direcciones son utilizadas por diferentes procesos y, por lo tanto, no están en el mismo espacio de direcciones virtuales.
Esto significa que las direcciones son las mismas, pero no apuntan a la misma memoria física. Debería leer más sobre la memoria virtual para comprender esto.
La dirección es la misma, pero el espacio de direcciones no lo es. Cada proceso tiene su propio espacio de direcciones, por lo que el 0x1370010 del padre no es lo mismo que el 0x1370010 del hijo.
Te invitamos a auxiliar nuestro trabajo escribiendo un comentario o dejando una valoración te damos la bienvenida.