33

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

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, la computadora deja de funcionar porque otras aplicaciones no obtienen la memoria suficiente que requieren.

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

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

Tenía 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 equipo colgado como lo fue un bucle infinito

Esperé durante aproximadamente una hora y finalmente tuve que forzar apagar mi computadora.

Algunas preguntas:

  • ¿Se malloc asignar memoria del HD también?
  • ¿Cuál fue el motivo del comportamiento anterior?
  • ¿Por qué no se rompió el lazo en algún punto del tiempo?
  • ¿Por qué no hubo ninguna falla de asignación?
+3

De todos modos, ¿por qué malloc (4), y por qué no malloc (4096), o malloc (8192), o más? –

+1

por supuesto puede ser cualquier cosa que sea múltiple de sizeof int. ¿No es así? – Vikas

+1

[no arroje el resultado de malloc en C] (http://stackoverflow.com/q/605845/995714) –

Respuesta

44

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

incorrecto: la mayoría de las computadoras/sistemas operativos virtuales apoyo memoria, el respaldo de espacio en disco.

Algunas preguntas: ¿malloc también asigna memoria de HDD?

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

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

¿Por qué no hubo ningún error de asignación?

Acabas de preguntar por muy poco a la vez: el bucle habría roto con el tiempo (bien después de su máquina se desaceleró a un rastreo debido al gran exceso de Virtual vs memoria física y el consiguiente acceso a disco súper frecuente, un problema conocido como "golpear") pero agotó tu paciencia mucho antes. Intente obtener, p. un megabyte a la vez en su lugar.

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

una parada total es poco probable, pero cuando una operación que normalmente llevaría unos pocos microsegundos acaba de tomar (por ejemplo) decenas de milisegundos, esos cuatro órdenes de magnitud sin duda puede hacer que sea siente como si el equipo se había detenido, básicamente, , y lo que normalmente tomaría un minuto podría tomar una semana.

+2

¿Quisiste decir "golpear"? – RichieHindle

+0

Gracias por la información sobre malloc asignar espacio en disco. Lo sospechaba, pero en muchos artículos no se mencionó el espacio en disco y se escribió que malloc asigna información sobre el montón y la memoria física. :) – Vikas

+0

@Richie También supongo que Alex quería decir 'golpear' allí. – Vikas

3

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

me encontré con esto hacia fuera de mi pregunta here.

Por ejemplo, cuando se declara 4 bytes de memoria, el espacio inmediatamente antes de su memoria podría contener el número entero 4, como una indicación de que el núcleo de la cantidad de memoria que solicitó.

+0

de hecho, malloc suele dar un múltiplo de 16 bytes. Hay dos razones Una es que el estándar dice que malloc debería devolver un puntero compatible con cualquier alineación de datos. Por lo tanto, las direcciones separadas por menos de 16 bytes no pueden devolverse. La otra razón es que los bloques liberados generalmente almacenan algunos datos utilizados para la administración de la memoria interna y un bloque demasiado corto (digamos 4 bytes) no pudo almacenarlo. – kriss

+0

@kriss [i] bloques liberados suelen almacenar algunos datos utilizados para la gestión de la memoria interna y un bloque demasiado corto, digamos 4 bytes, no pudieron almacenarlo. [/ I] ¿Puede mencionar qué tipo de datos? – Vikas

+0

@Vikas: mira la actualización de mi respuesta. –

5

malloc hace su propia gestión de memoria, gestionando bloques de memoria pequeños, pero finalmente utiliza el Win32 Heap functions 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.

De forma predeterminada, la memoria virtual está habilitada y consumirá el espacio disponible en la 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.

22

Sé que este hilo es viejo, pero para cualquiera que esté dispuesto a darle una oportunidad a sí mismo, utilizar el código cortó

#include <stdlib.h> 

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

plazo

$ gcc memtest.c 
$ ./a.out 

en funcionamiento, este código se llena las RAM hasta que el kernel lo mate Usar calloc en lugar de malloc para evitar la "evaluación perezosa". Ideas tomadas de este tema: Malloc Memory Questions

Este código llenan rápidamente mi memoria RAM (4 GB) y luego en unos 2 minutos mi partición de intercambio 20Gb antes de morir. 64bit Linux por supuesto.

+0

+1 Buena respuesta. –

+2

Acabo de probar el mismo programa en una máquina con 192 GB de memoria/4 Gb de intercambio. En un minuto consumió hasta 175 Gb, luego el intercambio se llenó lentamente. Cuando solo quedaban 24kb de intercambio, fue asesinado. – Sebastian

+1

Lo que usted llama "evaluación diferida" presumiblemente permite que el kernel use una página cero para cada página de memoria asignada pero no escrita. La compresión (especialmente para el intercambio) e incluso la deduplicación (como lo hacen actualmente algunos hipervisores) pueden reducir la memoria real requerida.Por supuesto, malloc tiene una sobrecarga de almacenamiento, tablas de páginas agregan sobrecarga, el programa tiene memoria que no es de montón, el sistema operativo usa memoria, etc. –

2

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 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 solicitud es SIZE_MAX, cuyo valor varía de acuerdo a la aplicación y se define en <limits.h>.

4

probar este

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

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

+0

Maldita sea ... con un intercambio de 100Gb, esperarás bastante tiempo antes de obtener el resultado. ¡Y mejor no tener nada más funcionando en su computadora en ese momento! –

+1

En Linux, con la configuración de memoria virtual predeterminada, su programa eventualmente será eliminado (con SIGKILL), en lugar de que 'malloc' realmente devuelva NULL. –

+0

Como otros han notado, esto no funcionará como se esperaba. (Supongo que alguien tiene que escribir Secretos de Deep 'Deep C Secrets'). Se eliminará en lugar de devolver un puntero nulo. También puede usar swap o incluso espacio en disco dependiendo de su sistema. Y si su sistema utiliza la sobrecarga de memoria junto con la evaluación diferida de la memoria asignada, puede parecer que admite decenas de miles de * gigabytes *, etc., antes de activar la lógica del sistema operativo que dice que se debe matar el proceso por razones de falta de memoria. . – ely

-1

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

en un momento en que su programa es la asignación de memoria de sólo

4 bytes. Entonces, ¿cómo se puede pensar que ha utilizado toda la memoria RAM? Es por eso que SWAP (espacio temporal en HDD) 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 asignarlo a la solicitud de memoria de programas. Es por eso que usted está ocupado con el Controlador de RAM y es por eso que no puede dar la oportunidad de dar servicio a otros programas. También este es un problema de referencia pendiente.

Respuestas: 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.

+2

Eso es simplemente incorrecto. Traté de ejecutar asignaciones de 8 Gb en un bucle, se las arregló para ejecutar 16382 asignaciones, eso es 128 TB - No tengo tanta RAM al menos. De hecho, ni siquiera ese intercambio (ver mi comentario a la respuesta aceptada). – skyking

+0

¿Debido a la memoria comprimida? –

Cuestiones relacionadas