2011-03-25 22 views
23

Sé que cuando llamo a una de las llamadas al sistema exec() en Linux, reemplazará el proceso en ejecución con una nueva imagen. Entonces cuando doblo un nuevo proceso y ejecuto exec(), el niño será reemplazado con el nuevo proceso.¿Qué sucede con la memoria malloc'ed después de que exec() cambie la imagen del programa?

¿Qué sucede con cualquier memoria que he asignado del montón? Supongamos que quiero analizar un número arbitrario de comandos y enviarlo al exec(). Para mantener este número arbitrario, probablemente tendré que asignar memoria en algún momento dado que no creo poder hacerlo correctamente con arreglos de tamaño estático, así que probablemente use malloc() o algo equivalente.

Necesito mantener esta memoria asignada hasta después de haber llamado al exec(), pero exec() nunca regresa.

¿La memoria es recuperada por el sistema operativo?

+0

Por cierto, aquí hay una pregunta muy similar http://stackoverflow.com/questions/3617332/what-happens-with-memory-usage-after-exec – sharptooth

Respuesta

18

Cuando llama al fork(), se crea una copia del proceso de llamada. Este proceso hijo es (casi) exactamente el mismo que el padre, es decir, la memoria asignada por malloc() se conserva y usted puede leerla o modificarla. Sin embargo, las modificaciones no serán visibles para el proceso principal, ya que los procesos padre e hijo están completamente separados.

Cuando llama al exec() en el elemento secundario, el proceso secundario se reemplaza por un proceso nuevo. De execve (2):

execve() does not return on success, and the text, data, bss, and stack 
of the calling process are overwritten by that of the program loaded. 

sobrescribiendo el segmento data, la llamada exec() recupera eficazmente la memoria que se asignó antes por malloc().

El proceso principal no se ve afectado por todo esto. Suponiendo que asignó la memoria en el proceso principal antes de llamar al fork(), la memoria aún está disponible en el proceso principal.

EDITAR: Las implementaciones modernas de malloc() usan asignaciones de memoria anónimas, consulte mmap (2). Según execve (2), las asignaciones de memoria no se conservan a través de una llamada exec(), por lo que esta memoria también se recupera.

+0

Eso no explica lo que le sucede al montón. De acuerdo, el segmento de datos se sobrescribe, pero eso implica que el montón se corrompe, no se restablece. – sharptooth

+0

Heap es el segmento de datos. En una implementación simple, 'malloc()' usaría 'brk()' para hacer crecer el segmento de datos y obtener más memoria. Cuando el segmento de datos se sobrescribe, su tamaño también se restablece y la memoria se libera de manera efectiva. –

+0

Creo que "corrupción de montón" normalmente significa que las estructuras de datos en el montón que 'malloc()' usa se corrompen (por ejemplo, cuando un puntero se libera dos veces). Cuando se sobrescribe el segmento de datos, ya no hay nada que pueda corromperse. –

3

Toda la memoria asignada en el montón, y toda la lógica malloc que se utiliza para administrarla, es parte de la imagen del proceso que se reemplaza por . Simplemente desaparece, en lo que concierne a su proceso . El sistema, por supuesto, lo recupera y lo recicla.

Cuestiones relacionadas