ver soporta saber pro para mid memoria macbook mac cuanta como apple ampliar c++ memory allocation

c++ - soporta - ¿Cuál es la mayor cantidad de memoria que puedo asignar a mi MacBook Pro?



memoria ram para macbook pro 13 (3)

Cuando solicita memoria, un sistema operativo se reserva el derecho de no proporcionarle esa memoria hasta que realmente la use.

Eso es lo que está sucediendo aquí: solo estás usando 5 bytes. Mi ZX81 de la década de 1980 podría manejar eso.

Esta pregunta ya tiene una respuesta aquí:

Intento averiguar cuánta memoria puedo asignar antes de que falle la asignación.

Este código simple de C ++ asigna un búfer (de 1024 bytes de tamaño), lo asigna a los últimos cinco caracteres del búfer, informa y luego elimina el búfer. Luego duplica el tamaño del búfer y se repite hasta que falla.

A menos que me falta algo, el código puede asignar hasta 65 terabytes de memoria antes de que falle en mi MacBook Pro. ¿Esto es posible? ¿Cómo puede asignar tanta memoria más que la que tengo en la máquina? Debo extrañar algo simple.

int main(int argc, char *argv[]) { long long size=1024; long cnt=0; while (true) { char *buffer = new char[size]; // Assume the alloc succeeded. We are looking for the failure after all. // Try to write to the allocated memory, may fail buffer[size-5] = ''T''; buffer[size-4] = ''e''; buffer[size-3] = ''s''; buffer[size-2] = ''t''; buffer[size-1] = ''/0''; // report if (cnt<10) cout << "size[" << cnt << "]: " << (size/1024.) << "Kb "; else if (cnt<20) cout << "size[" << cnt << "]: " << (size/1024./1024.) << "Mb "; else cout << "size[" << cnt << "]: " << (size/1024./1024./1024.) << "Gi "; cout << "addr: 0x" << (long)buffer << " "; cout << "str: " << &buffer[size-5] << "/n"; // cleanup delete [] buffer; // double size and continue size *= 2; cnt++; } return 0; }


MacOS X, como casi todos los sistemas operativos modernos, usa "asignación retrasada" para la memoria. Cuando llamas a new , el sistema operativo no asigna memoria. Simplemente nota que su programa quiere una cierta cantidad de memoria, y que el área de memoria que desea comienza en una dirección determinada. La memoria solo se asigna realmente cuando el programa intenta usarla.

Además, la memoria se asigna en unidades llamadas "páginas". Creo que MacOS X usa páginas de 4 kb, así que cuando su programa escribe hasta el final del búfer, el sistema operativo le da 4096 bytes allí, mientras conserva el resto del búfer como simplemente una nota de "su programa quiere esta memoria".

En cuanto a por qué está llegando al límite a 64 terabytes, es porque los procesadores x86-64 actuales usan el direccionamiento de 48 bits. Esto proporciona 256 TB de espacio de direcciones, que se divide de manera uniforme entre el sistema operativo y su programa. Duplicar la asignación de 64 TB encajaría exactamente en la mitad del espacio de direcciones de 128 TB de su programa, excepto que el programa ya está ocupando un poco de eso.


La memoria virtual es la clave para asignar más espacio de direcciones que el espacio físico de RAM + swap.

malloc usa la llamada al sistema mmap(MAP_ANONYMOUS) para obtener páginas del sistema operativo. (Suponiendo que OS X funciona como Linux, ya que ambos son sistemas operativos POSIX). Estas páginas son todas copiadas en escritura asignadas a una sola página física cero. es decir, todos leen como cero con solo un TLB perdido (sin error de página y sin asignación de RAM física). Una página x86 es 4kiB. (No estoy mencionando páginas enormes porque no son relevantes aquí).

Escribir en cualquiera de esas páginas desencadena un error de página suave para que el kernel maneje el copy-on-write. El kernel asigna una página cero de memoria física y vuelve a conectar esa página virtual para ser respaldada por la página física. A la vuelta del error de página, la tienda se vuelve a ejecutar y tiene éxito esta vez.

Entonces, después de asignar 64TiB y almacenar 5 bytes hasta el final, has usado una página adicional de memoria física . (Y agregó una entrada a los datos contables de Malloc, pero probablemente ya estaba asignada y en una página sucia. En una pregunta similar sobre múltiples asignaciones pequeñas, los datos contables de Malloc fueron los que finalmente agotaron todo el espacio ).

Si realmente ensuciaste más páginas de las que el sistema tenía RAM + swap, el kernel tendría un problema porque es demasiado tarde para que malloc devuelva NULL. Esto se denomina "overcommit" , y algunos sistemas operativos lo habilitan por defecto, mientras que otros no. En Linux, es configurable.

Como explica Mark, te quedas sin batería en 64TiB porque las implementaciones x86-64 actuales solo admiten direcciones virtuales de 48 bits. Los 16 bits superiores necesitan ser copias del bit 47 (es decir, una dirección solo es canónica si el valor de 64 bits es la extensión de signo de los 48 bits bajos).

Este requisito impide que los programas hagan algo "inteligente" con los bits altos, y luego rompe el hardware futuro que admite espacios de direcciones virtuales incluso más grandes.