2011-09-01 17 views
9

Dado el siguiente código:¿Cómo se libera el espacio asignado dinámicamente cuando se interrumpe un programa con Ctrl-C?

#include <stdio.h> 

int main() 
{ 
    int *p; 
    p = (int *)malloc(10 * sizeof(int)); 

    while(1); 
    return 0; 
} 

Cuando el código anterior se compila y ejecuta, y se interrumpe mientras está en ejecución pulsando Ctrl + C , ¿cómo es la memoria asignada a p liberado? ¿Cuál es el papel del sistema operativo aquí? ¿Y cómo es diferente de eso en el caso de C++, hecho usando el operador new?

+7

El sistema operativo recupera todo cuando un proceso finaliza, sin importar cómo finaliza. –

+0

¿Qué tiene de especial 'Ctrl + C'? –

+0

¿Cómo recupera el sistema operativo la memoria? Más específicamente, ¿qué componente del sistema operativo es responsable de hacer eso? – 4sh1sh

Respuesta

13

Cuando finaliza un proceso, el sistema operativo recupera toda la memoria que el proceso estaba utilizando.

La razón por la que las personas hacen una gran pérdida de memoria incluso cuando el sistema operativo recupera la memoria que su aplicación estaba utilizando cuando termina es que las aplicaciones no triviales usualmente se ejecutarán durante mucho tiempo devorando lentamente toda la memoria el sistema. Es menos problemático para programas de vida muy corta. (. Pero nunca se sabe cuando una sola línea se convertirá en un programa enorme, por lo que no tiene ningún pérdidas de memoria, incluso en pequeños programas)

+0

¿Puede explicar un poco más sobre cómo el sistema operativo recupera la memoria que el proceso estaba usando? ¿Algún proceso específico que hace esto para el sistema operativo? – 4sh1sh

+0

@ 4sh1sh cada programa obtiene su propia pila y tienda gratuita (montón). Cuando un programa llama a 'new' /' delete', comienza a usar su tienda gratuita.Cuando sale un programa, el sistema operativo recupera toda esa memoria, incluida la pila y todo lo demás. No importa qué bloques específicos de memoria en la tienda libre se estaban utilizando (por ejemplo, lo que había sido 'new'd o' delete'd, etc.). Simplemente recupera todo. –

+0

¿Hay algún proceso específico en el sistema operativo, específicamente UNIX, que hace esto para el sistema operativo? – 4sh1sh

3

Por cierto (además de Seth Carnegie dijo):

el uso de las rutinas en <signal.h> se puede coger la señal SIGINT (interrupción) para manejar Ctrl + C de ninguna manera, por ejemplo, para limpiar cualquier recurso importante, no sólo la memoria (como archivos de cierre, evitando así la pérdida de de cualquier contenido almacenado y aún no escrito, o cierre de conexiones de red suavemente).

0

la memoria no es realmente "libre()" d en absoluto.

memoria adquirida por el sistema operativo es el tamaño de página (4kbytes de memoria por lo general). cada vez que un proceso se queda sin memoria adquiere páginas adicionales, este es el espacio que usa malloc(). cuando un proceso finaliza, todas las páginas se devuelven al sistema operativo, haciendo que las llamadas gratuitas realmente innecesarias. si su programa es un servidor o similar, cada pieza de memoria que nunca se libere solo se devolverá cuando el programa realmente muera, lo que hará que cada vez tenga más memoria.

Cuestiones relacionadas