utiliza usar como c linux memory-management malloc

usar - ¿Por qué malloc no "agota" la memoria de mi computadora?



malloc en c++ (3)

Es posible que la memoria no esté realmente disponible, especialmente que no hiciste nada usando p en tu ejemplo, excepto que verifica si es NULL . Del hombre malloc

Por defecto, Linux sigue una estrategia de asignación de memoria optimista. Esto significa que cuando malloc() no devuelve NULL no hay garantía de que la memoria esté realmente disponible. En caso de que el sistema se quede sin memoria, uno o más procesos serán eliminados por el asesino OOM. Para obtener más información, consulte la descripción de /proc/sys/vm/overcommit_memory y /proc/sys/vm/oom_adj en proc(5) y el archivo fuente del kernel de Linux Documentation /vm/overcommit-accounting .

Así que tengo este programa que asigna 256 MB de memoria, y después de que el usuario presiona ENTRAR, libera la memoria y finaliza.

#include <stdio.h> #include <stdlib.h> int main(void) { char *p, s[2]; p = malloc(256 * 1024 * 1024); if ( p == NULL) exit(1); printf("Allocated"); fgets(s, 2, stdin); free(p); return 0; }

Ejecuté este programa varias veces y retrocedí a cada uno de ellos hasta que ya no haya memoria suficiente para asignar. Sin embargo, eso nunca sucede. Ejecuté un comando top Linux e incluso después de ejecutar este programa muchas veces, la memoria libre nunca baja tanto como 256 MB.

Sin embargo, por otro lado, si uso calloc lugar de malloc entonces hay una gran diferencia:

p = calloc(256 * 1024 * 1024, 1);

Ahora si ejecuto el programa y lo fondo, y repito, cada vez que lo ejecuto, la memoria libre se reduce en 256 MB. ¿Por qué es esto? ¿Por qué malloc no causa que cambie la memoria libre disponible, pero calloc sí?


El calloc en su sistema † realmente toca la memoria al despejarla, y en muchos sistemas la memoria no está realmente asignada (y por lo tanto "agotada") hasta que es tocada por el proceso al que está asignada. Entonces, solo hacer malloc no "usa" la memoria hasta que, bueno, la use.

† Ver comentarios


malloc() no usa memoria. Lo asigna.

Después de asignar la memoria, utilícela asignando algunos datos.

size_t Size = 256 * 1024 * 1024; p = malloc(Size); if (p != NULL) { memset(p, 123, Size); }

Algunas plataformas implementan malloc() es de tal manera que el consumo físico de la memoria no se produce hasta que se accede a ese byte (o más probablemente un byte dentro de un grupo o "página" de bytes).

calloc() puede o no usar realmente la memoria tampoco. Un sistema puede asignar mucha memoria a la misma memoria física puesta a cero, al menos hasta que los datos se vuelvan interesantes. Ver ¿Por qué Malloc + Memset es más lento que Calloc?