studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones c++ linux memory-management new-operator overcommit

c++ - programacion - new[] no disminuye la memoria disponible hasta que se rellena



manual de programacion android pdf (3)

Acerca de la segunda mitad de su pregunta:

El estándar de idioma no permite demoras en lanzar un bad_alloc. Eso debe suceder como una alternativa a un nuevo [] devolver un puntero. ¡No puede suceder más tarde!

Algunos sistemas operativos podrían intentar comprometer en exceso las asignaciones de memoria y fallar más tarde. Eso no se ajusta al estándar de lenguaje C ++.

Esto está en C ++ en CentOS 64bit usando G ++ 4.1.2.

Estamos escribiendo una aplicación de prueba para cargar el uso de memoria en un sistema en n Gigabytes. La idea es que la carga general del sistema sea monitoreada a través de SNMP, etc. Así que esta es solo una forma de ejercitar la monitorización.

Lo que hemos visto sin embargo es que simplemente haciendo:

char* p = new char[1000000000];

no afecta la memoria utilizada como se muestra en la parte superior o libre

La asignación de memoria solo parece convertirse en "real" una vez que la memoria se escribe en:

memcpy(p, ''a'', 1000000000); //shows an increase in mem usage of 1GB

Pero tenemos que escribir en toda la memoria, simplemente escribir en el primer elemento no muestra un aumento en la memoria utilizada:

p[0] = ''a''; //does not show an increase of 1GB.

¿Es esto normal, la memoria realmente se ha asignado por completo? No estoy seguro de si son las herramientas que estamos usando (arriba y gratis -m) las que muestran valores incorrectos o si hay algo inteligente en el compilador o en el tiempo de ejecución y / o kernel.

Este comportamiento se ve incluso en una compilación de depuración con optimizaciones desactivadas.

Tenía entendido que un nuevo [] asignó la memoria de inmediato. ¿El tiempo de ejecución de C ++ demora esta asignación real hasta más tarde cuando se acceda a ella? En ese caso, ¿puede diferirse una excepción de falta de memoria hasta mucho después de la asignación real de la memoria hasta que se acceda a la memoria?

Tal como está, no es un problema para nosotros, pero sería bueno saber por qué está ocurriendo de esta manera.

¡Aclamaciones!

Editar:

No quiero saber cómo deberíamos usar vectores, esto no es OO / C ++ / la forma actual de hacer las cosas, etc. Solo quiero saber por qué está sucediendo así, en lugar de tener sugerencias para formas alternativas de probarlo.


Cuando su biblioteca asigna memoria desde el sistema operativo, el sistema operativo simplemente reservará un rango de direcciones en el espacio de direcciones virtuales del proceso. No hay ninguna razón para que el SO proporcione realmente esta memoria hasta que la use, como lo demostró.

Si miras eg /proc/self/maps verás el rango de direcciones. Si miras el uso de la memoria de top, no lo verás; aún no lo estás usando.


Por favor, busque exceso de compromiso. Linux por defecto no reserva memoria hasta que se acceda. Y si termina necesitando más memoria que la disponible, no obtendrá un error, pero se matará un proceso aleatorio. Puede controlar este comportamiento con /proc/sys/vm/* .

OMI, el compromiso excesivo debe ser una configuración por proceso, no global. Y el valor predeterminado no debe ser overcommit.