La forma estándar de hacer nuevos procesos en Linux es que la huella de memoria del proceso padre se copia y se convierte en el entorno del proceso hijo hasta que execv
se llama.
¿De qué huella de memoria estamos hablando, el virtual (lo que solicitó el proceso) o el residente (lo que realmente se está utilizando)?
Motivación: tengo un dispositivo con espacio de intercambio limitado y una aplicación con una gran diferencia entre la huella de memoria virtual y residente. La aplicación no se puede bifurcar debido a la falta de memoria y le gustaría ver si ayudar a reducir el tamaño de la huella virtual.
fuente
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.
Si, gracias. Esto significa que la reducción de la huella virtual del proceso en un entorno con memoria limitada (RAM e intercambio) podría resolver el problema de no poder bifurcar.fork
falla con un mensaje de error que indica que la memoria es insuficiente. Luego, reducir el uso de memoria virtual del proceso antes de bifurcar podría ayudar.No te preocupes, hace una copia perezosa (copia en escritura). Las direcciones de memoria virtual de ambos procesos apuntan a las mismas páginas inicialmente, pero cuando el proceso bifurcado intenta modificarlo, en realidad hace una copia física de la página (a partir de ese momento, esa página reside en dos lugares en su RAM).
Tenga cuidado, ninguna de las huellas de memoria informadas en realidad le dice qué cantidad de RAM está usando el proceso. Debido al intercambio, el intercambio de memoria y otros problemas con la memoria virtual, es imposible saberlo con certeza. Algunas partes del espacio de la memoria son bibliotecas compartidas (¿dónde contarlas?), Algunas se refieren a la memoria que no es RAM (otros dispositivos de hardware), algunas están actualmente intercambiadas, algunas todavía no se han copiado (copiar en escritura) y pronto. Lee esto:
https://lwn.net/Articles/642202/
fuente
Hay configuración del núcleo
/ proc / sys / vm / overcommit_memory
Cita de excelente artículo :
Esto se aplica tanto a las horquillas como a los malloc regulares. Es decir, si lo establece en 0, la bifurcación se copiará al escribir. Copiar al escribir significa que una vez que la aplicación se bifurca, ambas copias compartirán las páginas de memoria del niño o del original y comenzarán a cambiar la memoria.
En la mayoría de las distribuciones, sé que el exceso de compromiso es 0. Pero si lo configura en 2, todas las páginas de memoria estarán completamente respaldadas por memoria real y, en algunos casos, bajo presión de memoria alta, serán más estables, pero algunos programas (me enfrenté a gitk) que dependen en sobrecompromisos fallará.
fuente