memoria máxima que malloc puede asignar

Estaba intentando averiguar cuánta memoria puedo malloc en su máquina (plataforma de 1 Gb RAM 160 Gb HD Windows).

Leí que la memoria máxima que malloc puede asignar está limitada a la memoria física (en el montón).

Además, cuando un progtwig excede el consumo de memoria a un cierto nivel, la computadora deja de funcionar porque otras aplicaciones no obtienen la memoria suficiente que requieren.

Entonces para confirmar, escribí un pequeño progtwig en C:

int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } } 

Esperaba que hubiera un momento en que la asignación de memoria fallaría y el ciclo se rompería, pero mi computadora se colgó porque era un ciclo infinito.

Esperé alrededor de una hora y finalmente tuve que forzar el cierre de mi computadora.

Algunas preguntas:

  • ¿Malloc también asigna memoria de HD?
  • ¿Cuál fue el motivo del comportamiento anterior?
  • ¿Por qué el bucle no se rompió en ningún momento?
  • ¿Por qué no hubo ninguna falla de asignación?

Leí que la memoria máxima que malloc puede asignar está limitada a la memoria física (en el montón).

Incorrecto: la mayoría de las computadoras / sistemas operativos admiten memoria virtual , respaldada por espacio en disco.

Algunas preguntas: ¿ malloc asigna memoria de HDD?

malloc pregunta al sistema operativo, que a su vez puede usar algo de espacio en el disco.

¿Cuál fue el motivo del comportamiento anterior? ¿Por qué el lazo no se rompió en ningún momento?

¿Por qué no hubo ninguna falla de asignación?

Usted acaba de pedir muy poco a la vez: el bucle se habría roto finalmente (bastante después de que su máquina se ralentizara debido al gran exceso de memoria virtual vs física y el consecuente acceso a disco super-frecuente, un problema conocido como “golpeteo”). “) pero agotó tu paciencia mucho antes de eso. Intente obtener, por ejemplo, un megabyte a la vez.

Cuando un progtwig excede el consumo de memoria a un cierto nivel, la computadora deja de funcionar porque otras aplicaciones no obtienen la memoria suficiente que requieren.

No es probable una detención total, pero cuando una operación que normalmente tomaría unos pocos microsegundos acaba tomando (por ejemplo) decenas de milisegundos, esos cuatro órdenes de magnitud pueden ciertamente hacer que parezca que la computadora se detuvo, y lo que normalmente tomaría un minuto podría tomar una semana.

Sé que este hilo es antiguo, pero para cualquiera que quiera probarlo, use este código cortado

 #include  int main() { int *p; while(1) { int inc=1024*1024*sizeof(char); p=(int*) calloc(1,inc); if(!p) break; } } 

correr

 $ gcc memtest.c $ ./a.out 

al ejecutarse, este código llena los RAM hasta que el kernel los mate. Usar calloc en lugar de malloc para evitar la “evaluación perezosa”. Ideas tomadas de este hilo: Preguntas sobre la memoria de Malloc

Este código llenó rápidamente mi RAM (4Gb) y luego en aproximadamente 2 minutos mi partición de intercambio de 20Gb antes de que muriera. 64bit Linux por supuesto.

malloc hace su propia gestión de memoria, administrando pequeños bloques de memoria, pero finalmente utiliza las funciones Win32 Heap para asignar memoria. Puede pensar en malloc como un “revendedor de memoria”.

El subsistema de memoria de Windows comprende la memoria física (RAM) y la memoria virtual (HD). Cuando la memoria física se vuelve escasa, algunas de las páginas se pueden copiar desde la memoria física a la memoria virtual en el disco duro. Windows lo hace de forma transparente.

Por defecto, la memoria virtual está habilitada y consumirá el espacio disponible en HD. Por lo tanto, la prueba continuará ejecutándose hasta que haya asignado la cantidad completa de memoria virtual para el proceso (2 GB en ventanas de 32 bits) o haya llenado el disco duro.

Prueba esto

 #include  #include  main() { int Mb = 0; while (malloc(1<<20)) ++Mb; printf("Allocated %d Mb total\n", Mb); } 

Incluye stdlib y stdio por ello.
Este extracto está tomado de secretos c profundos .

En realidad, no sé por qué falló, pero una cosa a tener en cuenta es que `malloc (4)” puede no proporcionarle 4 bytes, por lo que esta técnica no es realmente una manera precisa de encontrar su tamaño máximo de almacenamiento dynamic.

Descubrí esto de mi pregunta aquí .

Por ejemplo, cuando declara 4 bytes de memoria, el espacio directamente anterior a su memoria podría contener el número entero 4, como una indicación para el kernel de la cantidad de memoria que solicitó.

Según el estándar C90, garantiza que puede obtener al menos un objeto de 32 kBytes de tamaño, y esto puede ser una memoria estática, dinámica o automática. C99 garantiza al menos 64 kBytes. Para cualquier límite superior, consulte la documentación de su comstackdor.

Además, el argumento de malloc es un tamaño_t y el rango de ese tipo es [0, SIZE_MAX], por lo que el máximo que puede solicitar es SIZE_MAX, cuyo valor varía con la implementación y se define en .

la primera vez que asigne cualquier tamaño a * p, cada vez que salga de esa memoria no se hará referencia. Eso significa

a la vez, su progtwig asigna memoria de 4 bytes solamente

. entonces, ¿cómo crees que has utilizado toda la memoria RAM? Es por eso que el dispositivo SWAP (espacio temporal en el HDD) está fuera de discusión. Conozco un algoritmo de gestión de memoria en el que cuando ningún progtwig hace referencia al bloque de memoria, ese bloque es elegible para asignarlo a la solicitud de memoria de progtwigs. Es por eso que estás ocupado con RAM Driver y es por eso que no puede dar la oportunidad de dar servicio a otros progtwigs. También este es un problema de referencia pendiente.

Resp .: como máximo, puede asignar la memoria de su tamaño de RAM. Porque ningún progtwig tiene acceso al dispositivo de intercambio.

Espero que todas sus preguntas tengan respuestas satisfactorias.