2011-02-01 16 views
5

Noté algo bastante extraño al tratar de asignar mucha memoria a mi iPhone 3G con iOS 4.2.1.Extraño comportamiento de asignación de memoria iOS

Cuando llamo malloc(512 * 1024) en un bucle que devuelve un puntero válido durante alrededor de 1.500 veces después de lo cual me sale un NULL y

app(2032,0x3e7518b8) malloc: *** mmap(size=524288) failed (error code=12) 
*** error: can't allocate region 

Me sorprendió, ya que creo que mi iPhone no 750 MB de RAM . Luego agregué un memset después del malloc y redujo el número de asignaciones a 120, lo que tiene mucho más sentido.

Aquí está el código súper simple que he utilizado:

for (int i = 1; ; ++i) 
{ 
    void *p = malloc(512 * 1024); 
    NSLog(@"%d %p", i, p); 
    memset(p, 0, 512 * 1024); 
} 

pensé iPhone no tenía ningún sistema de memoria virtual que podría explicar el comportamiento similar a este. ¿Cuál sería una explicación razonable para esto?

Respuesta

5

En iOS (y muchos otros sistemas), una llamada a malloc() en realidad no asigna memoria. Solicita memoria del SO/kernel, pero la solicitud no se satisface hasta que se escribe en la memoria (por ejemplo, con memset()). Esto permite una mayor eficiencia en la administración de la memoria del sistema, pero puede dar lugar a un comportamiento engañoso de malloc().

2

El iPhone definitivamente tiene un sistema de memoria virtual. Lo que falta es la capacidad de sacar la memoria de la página al disco. En otras palabras, falta espacio de intercambio.