Según Wikipedia (que podría estar equivocado)
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 cuando un niño ejecuta una "
exec
" llamada al sistema (que se usa para ejecutar cualquier archivo ejecutable desde un programa C) o sale muy pronto después delfork()
. Cuando se necesita el hijo solo para ejecutar un comando para el proceso padre, no hay necesidad de copiar las páginas del proceso padre, ya queexec
reemplaza el espacio de direcciones del proceso que lo invocó con el comando que se ejecutará.En tales casos, se utiliza una técnica llamada copia en escritura (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 cambio, las páginas se comparten entre el proceso secundario y el proceso primario. Cada vez que un proceso (padre o hijo) modifica una página, se realiza una copia separada de esa página en particular solo 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 utilizando 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.
Parece que cuando cualquiera de los procesos intenta escribir en la página, se asigna una nueva copia de la página y se le asigna al proceso que generó la falla de la página. La página original se marca como escribible luego.
Mi pregunta es: ¿qué sucede si fork()
se llama varias veces antes de que alguno de los procesos intente escribir en una página compartida?
pmap -XX PID
o cat /proc/PID/smap
.