GNU/Linux >> Tutoriales Linux >  >> Linux

Cuando un proceso se bifurca, ¿se copia su memoria virtual o residente?

En los sistemas modernos, nada de la memoria se copia realmente solo porque se usa una llamada al sistema de bifurcación. Todo está marcado como de solo lectura en la tabla de páginas, de modo que en el primer intento de escribir una trampa en el código del kernel ocurrirá. Solo una vez que el primer proceso intente escribir, se realizará la copia.

Esto se conoce como copia en escritura.

Sin embargo, también puede ser necesario realizar un seguimiento del espacio de direcciones asignado. Si no hay memoria o espacio de intercambio disponible en el momento en que el kernel tiene que copiar una página, tiene que eliminar algún proceso para liberar memoria. Esto no siempre es deseable, por lo que es posible realizar un seguimiento de cuánta memoria se ha comprometido el kernel.

Si el núcleo se comprometiera con más de la memoria disponible + intercambio, puede dar un código de error al intentar llamar a la bifurcación. Si hay suficiente disponible, el kernel se comprometerá con el tamaño virtual completo del padre para ambos procesos después de la bifurcación.


No te preocupes, hace una copia diferida (copy-on-write). Las direcciones de memoria virtual de ambos procesos apuntan inicialmente a las mismas páginas, 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 reportadas realmente le dice cuánta RAM está usando el proceso. Debido al intercambio, el uso compartido de la memoria y otros problemas con la memoria virtual, es imposible saberlo con seguridad. Algunas partes del espacio de la memoria son bibliotecas compartidas (¿dónde contarlas?), algunas se refieren a memoria que no es RAM (otros dispositivos de hardware), algunas están intercambiadas actualmente, algunas aún no se han copiado (copia en escritura) y pronto. Lee esto:

https://lwn.net/Articles/642202/


Hay una configuración del kernel

/proc/sys/vm/overcommit_memory

Cita de un artículo excelente:

Since 2.5.30 the values are: 0 (default): as before: guess about how much  
overcommitment is reasonable, 1: never refuse any malloc(), 2: be precise 
about the overcommit - never commit a virtual address space larger than swap 
space plus a fraction overcommit_ratio of the physical memory. Here 
/proc/sys/vm/overcommit_ratio (by default 50) is another user-settable 
parameter. It is possible to set overcommit_ratio to values larger than 100. 
(See also Documentation/vm/overcommit-accounting.)

Esto se aplica tanto a las horquillas como a los malloc normales. 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 páginas de memoria hasta que el niño o el original comiencen 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 una alta presión de memoria serán más estables, pero algunos programas (Me enfrenté a gitk) que dependen en sobrecompromisos fallará.


Linux
  1. ¿Nuevo proceso principal cuando muere el proceso principal?

  2. Linux:¿necesita una explicación sobre el tamaño del conjunto residente/tamaño virtual?

  3. ¿Cómo puedo eliminar un usuario en Linux cuando el sistema dice que actualmente se usa en un proceso?

  4. ¿Qué sucede cuando un hilo se bifurca?

  5. Cómo limitar los recursos totales (memoria) de un proceso y sus hijos

¿Cómo iniciar un proceso en su propio grupo de procesos?

Creciente uso de memoria residente (RSS) de Java Process

¿Qué hacer cuando Ctrl + C no puede matar un proceso?

¿Cuándo no debo matar -9 un proceso?

Necesita explicación sobre el tamaño del conjunto residente/tamaño virtual

Volcar la memoria de un proceso de Linux en un archivo