En una máquina de 32 bits, cada proceso obtiene un espacio virtual de 4 GB. En este caso, uno puede preocuparse de que podamos enfrentar problemas debido a la fragmentación. Pero en el caso de una máquina de 64 bits teóricamente tenemos una gran memoria virtual direccionable, entonces ¿por qué la fragmentación de la memoria sigue siendo un problema (si es que lo es) en una máquina de 64 bits?¿Por qué la fragmentación de memoria es un problema en una máquina de 64 bits?
Respuesta
Cada dirección virtual a la que intenta acceder es asignada por el sistema operativo a la memoria física. La memoria física se asigna en páginas (por ejemplo, 4K de tamaño). Si logras asignar un byte en offset 1000000 * n y hacerlo para n de 1 a 1000000 (creo que podría hacer eso con mmap), entonces el sistema operativo tendrá que respaldar eso con un millón páginas de física memoria, que es algo así como 4G. Esa memoria física no estará disponible para nada más. Si hubiera asignado los bytes contiguamente, solo necesitaría aproximadamente 1 millón de memoria física (256 páginas) para sus millones de bytes.
Puede obtener una mala situación similar si asigna 4G por motivos legítimos, y luego desasignar partes de él, manteniendo un poco de cada página asignada. El sistema operativo no podrá reutilizar la memoria liberada para nada más porque no hay páginas físicas que sean totalmente gratuitas. Entonces ese es un problema de fragmentación.
En teoría, podría imaginar que las direcciones virtuales 1000000 y 2000000 se asignarían a la misma página de memoria física, evitando la fragmentación. Pero en la práctica, y por buenas razones, la asignación de memoria virtual se realiza página por página. Puede leer más sobre esto aquí: http://en.wikipedia.org/wiki/Page_table.
Dado que 64 bits tiene un espacio de direcciones virtual loco, nada de esto importa? ¿A menos que tengas TB de ram y sigas haciendo esto con 50TB? – paulm
Lea más atentamente: explica por qué las páginas * físicas * se desperdician cuando tiene fragmentación. –
Sí, pero la pregunta es "¿Por qué la fragmentación de la memoria es un problema en una máquina de 64 bits?" ¿Entonces seguramente el comienzo de la respuesta debería ser "No es"? – paulm
Como toda esa memoria está "desperdiciada", considere una aplicación en la que tenga mucha fragmentación interna. Ese proceso requiere más páginas en memoria porque el conjunto de trabajo ahora está disperso en la memoria y eso significa que su huella de memoria es mucho mayor. Si esta aplicación compite por las ranuras físicas en la RAM (las máquinas todavía solo tienen entre 4 y 8 GB de RAM para una configuración de hogar típica), ocasiona más intercambio de páginas. En general, desea reducir la huella de memoria de sus aplicaciones para evitar la presión de la memoria y la contención con otras aplicaciones.
Hay casos en los que realmente no importa, no te matará utilizar un megabyte adicional aquí o allá, pero todo se suma en aplicaciones más grandes. Depende de la situación de si es o no importante tener la menor fragmentación posible según lo que esté codificando o cuál sea el objetivo de su proyecto.
¿Pero qué pasa con la "fragmentación de la memoria"? Una respuesta a esto debería cubrir cómo malloc, el sistema operativo y los factores de hardware asignan y mapean la memoria virtual ... –
@pst La pregunta de lo que entendí solo me preguntó acerca de las consecuencias, no cómo sucedió en primer lugar (aunque podría haberlo leído mal). –
- 1. ¿Qué es fragmentación de memoria?
- 2. La máquina virtual de 32 o 64 bits es más rápida en la máquina de 64 bits (vmware)
- 3. ¿Cómo compilar un programa C++ como de 64 bits en una máquina de 64 bits?
- 4. Fragmentación del montón en tierra de 64 bits
- 5. ¿Es posible resolver el problema de fragmentación de memoria CUDA?
- 6. Detección de problema de fragmentación de memoria en un proceso
- 7. lua Problema de transición de 64 bits
- 8. ¿Cómo ejecuto un VBScript en modo de 32 bits en una máquina de 64 bits?
- 9. Consulte 'Archivos de programa' en una máquina de 64 bits
- 10. ¿Cuál es la memoria anterior a 0x08048000 utilizada en una máquina de 32 bits?
- 11. puntero C++ en la máquina de 64 bits
- 12. ¿Puedo ejecutar una imagen de VMware de 64 bits en una máquina de 32 bits?
- 13. ejecutando un binario de 32 bits en una máquina de 64 bits
- 14. ¿Por qué __sync_add_and_fetch funciona para una variable de 64 bits en un sistema de 32 bits?
- 15. Aplicaciones Java de 64 bits: ¿Se requiere un SO de 64 bits, un JRE de 64 bits y una Aplicación de 64 bits?
- 16. Qué causa la fragmentación de la memoria en .NET
- 17. ¿Qué es int.MaxValue en una PC de 64 bits?
- 18. Ejecución de una aplicación C# de 32 bits en una máquina de 64 bits
- 19. tamaño de la máquina 64 o 32 bits
- 20. ¿Por qué cmd.exe tiene un comportamiento de nivel de error diferente en una máquina de 64 bits?
- 21. Java Accesibilidad de 32 bits en una máquina de 64 bits
- 22. ¿Cómo ejecutar una API hecha para 32 bits en una máquina de 64 bits?
- 23. Compilación de la aplicación matlab de 32 bits en la máquina de 64 bits (C++)
- 24. 64 bits por división de 32 bits
- 25. ¿Por qué 2 GB de límite de memoria cuando se ejecuta en Windows de 64 bits?
- 26. Volcado de depuración del proceso de 32 bits capturado en la máquina de 64 bits
- 27. ¿Por qué el PrintDialog no se muestra (en 64 bits)?
- 28. ¿Pueden mis componentes COM de 32 bits y 64 bits co-residir en la misma máquina?
- 29. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 30. Crear exe de 32 bits del código python en la máquina de 64 bits
No es un problema en los sistemas operativos de 64 bits. –
¿No debería este comentario ser una respuesta? Las respuestas existentes parecen implicar que ES un problema en 64bit – paulm