c++ 64bit heap-fragmentation

c++ - La fragmentación del montón en tierra de 64 bits



64bit heap-fragmentation (3)

La fragmentación del montón es un problema tanto por debajo de 64 bits como por debajo de 32 bits. Si haces muchas solicitudes con distintas vidas, entonces obtendrás un montón fragmentado. Desafortunadamente, los sistemas operativos de 64 bits realmente no ayudan con esto, ya que todavía no pueden mezclar los pequeños bits de memoria libre para crear bloques contiguos más grandes.

Si quieres lidiar con la fragmentación del montón, igual tienes que usar los mismos trucos antiguos.

La única forma en que un sistema operativo de 64 bits podría ayudar es si hay alguna cantidad de memoria que sea lo suficientemente grande para que nunca la fragmente.

En el pasado, cuando trabajaba en demonios C ++ de larga ejecución, tuve que lidiar con problemas de fragmentación del montón. Trucos como mantener un grupo de mis grandes asignaciones eran necesarios para evitar quedarse sin espacio contiguo.

¿Sigue siendo un problema con un espacio de direcciones de 64 bits? El rendimiento no es una preocupación para mí, por lo que preferiría simplificar mi código y no ocuparme de cosas como las agrupaciones de almacenamiento intermedio. ¿Alguien tiene alguna experiencia o historias sobre este tema? Estoy usando Linux, pero imagino que muchos de los mismos problemas se aplican a Windows.


Si su proceso realmente necesita gigabytes de espacio de direcciones virtuales, entonces la actualización a 64 bits realmente elimina instantáneamente la necesidad de soluciones temporales.

Pero vale la pena calcular cuánta memoria esperas que use tu proceso. Si solo está en la región de un gigabyte o menos, no hay forma de que incluso una fragmentación loca le haga quedarse sin el espacio de direcciones de 32 bits; las pérdidas de memoria podrían ser el problema.

(Por cierto, Windows es más restrictivo, ya que reserva una cantidad descortés de espacio de direcciones en cada proceso para el SO).


¿Sigue siendo un problema con un espacio de direcciones de 64 bits?

No, todavía no es un problema.

Tiene razón en que era un problema en los sistemas de 32 bits, pero ya no es un problema en los sistemas de 64 bits.

El espacio de direcciones virtuales es tan grande en los sistemas de 64 bits (actualmente, 2 ^ 48 bytes en los procesadores x86_64 de hoy y configurado para aumentar gradualmente a 2 ^ 64 a medida que salen nuevos procesadores x86_64), que se agota el espacio de direcciones virtuales contiguos debido a la fragmentación es prácticamente imposible (para todos menos algunos casos de esquina muy artificiales).

(Es un error común de intuición causado por el hecho de que 64 es "solo" doble 32, lo que hace que la gente piense que un espacio de direcciones de 64 bits es de alguna manera aproximadamente el doble de 32 bits. De hecho, un 64 bits completo el espacio de direcciones es 4 mil millones de veces más grande que un espacio de direcciones de 32 bits).

Dicho de otra manera, si tu daemon de 32 bits tardó una semana en fragmentarse en una etapa en la que no podía asignar un bloque de bytes x, tardará como mínimo mil años en fragmentar los espacios de direcciones de 48 bits de los procesadores x86_64 de hoy en día. tomaría 80 millones de años fragmentar el futuro espacio de direcciones planificado completo de 64 bits.