memoria máxima que malloc puede asignar


Estaba tratando de averiguar cuánta memoria puedo malloc al máximo en mi máquina (1 Gb RAM 160 Gb HD plataforma Windows).

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

También cuando un programa excede el consumo de memoria a un cierto nivel, el equipo deja de funcionar porque otras aplicaciones no obtienen la suficiente memoria que requieren.

Así que para confirmar, escribí un pequeño programa en C:

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

Estaba con la esperanza de que habría un momento en que la asignación de memoria fallaría y el bucle se rompería, pero mi computadora colgó ya que era un bucle infinito.

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

Algunas preguntas:

  • ¿Malloc también asigna memoria de HD?
  • ¿Cuál fue la razón de este comportamiento?
  • ¿Por qué no se rompió el bucle en ningún momento?
  • ¿Por qué no hubo ningún error de asignación?
Author: LittleBobbyTables, 2010-05-09

7 answers

He leído 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/OSs admiten memoria virtual, respaldada por espacio en disco.

Algunas preguntas: ¿malloc también asigna memoria desde el disco duro?

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

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

¿Por qué no había ninguna ¿falla en la asignación?

Usted acaba de pedir demasiado poco a la vez: el bucle se habría roto eventualmente (mucho después de que su máquina se ralentizó a un arrastre debido al gran exceso de memoria virtual vs física y el consiguiente acceso al disco súper frecuente, un problema conocido como "thrashing"), pero agotó su paciencia mucho antes de eso. Trate de obtener, por ejemplo, un megabyte a la vez en su lugar.

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

Una parada total es poco probable, pero cuando una operación que normalmente tomaría unos pocos microsegundos termina tomando (por ejemplo) decenas de milisegundos, esos cuatro órdenes de magnitud ciertamente pueden hacer que se sienta como si la computadora básicamente se hubiera detenido, y lo que normalmente tomaría un minuto podría tomar una semana.

 45
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-17 18:07:07

Sé que este hilo es viejo, pero para cualquiera que quiera probarlo uno mismo, use este código recortado

#include <stdlib.h>

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

Ejecutar

$ gcc memtest.c
$ ./a.out

Al ejecutarse, este código llena una RAM hasta que el núcleo la mata. Usar calloc en lugar de malloc para prevenir la "evaluación perezosa". Ideas tomadas de este hilo: Preguntas de Memoria Malloc

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

 23
Author: Sebastian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:21

malloc hace su propia gestión de memoria, gestionando pequeños bloques de memoria por sí mismo, pero en última instancia utiliza las funciones de montón de Win32 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 de la memoria física a la memoria virtual en el disco duro. Windows hace esto de forma transparente.

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

 5
Author: mdma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-17 19:50:09

Prueba esto

#include <stdlib.h>
#include <stdio.h>

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

Incluya stdlib y stdio para ello.
Este extracto está tomado de deep c secrets .

 5
Author: human.js,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 14:13:59

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

Encontré esto en mi pregunta aquí.

Por ejemplo, cuando declaras 4 bytes de memoria, el espacio directamente antes de tu memoria podría contener el entero 4, como una indicación al núcleo de cuánta memoria pediste.

 3
Author: Chris Cooper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:56

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

Además, el argumento de malloc es un size_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 en la implementación y se define en <limits.h>.

 2
Author: mav_2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-17 13:11:37

La primera vez que asigne cualquier tamaño a *p, la próxima vez que deje esa memoria sin referencia. Eso significa

A la vez su programa está asignando memoria de 4 bytes solamente

. entonces, ¿cómo puede usted cosa que ha utilizado toda la RAM, por eso dispositivo de intercambio( espacio temporal en el disco duro) está fuera de discusión. Conozco un algoritmo de gestión de memoria en el que cuando ningún programa hace referencia al bloque de memoria, ese bloque es elegible para asignar programas petición de memoria. Es por eso que solo se mantiene ocupado con RAM Driver y es por eso que no puede dar la oportunidad de dar servicio a otros programas. También este es un problema de referencia colgando.

Ans : Como mucho puede asignar la memoria de su tamaño de RAM. Porque ningún programa tiene acceso al dispositivo de intercambio.

Espero que todas sus preguntas tengan respuestas satisfactorias.

 -1
Author: Swapnil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-07 13:36:39