2011-12-17 17 views
7

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?

+2

No es un problema en los sistemas operativos de 64 bits. –

+0

¿No debería este comentario ser una respuesta? Las respuestas existentes parecen implicar que ES un problema en 64bit – paulm

Respuesta

5

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.

+0

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

+0

Lea más atentamente: explica por qué las páginas * físicas * se desperdician cuando tiene fragmentación. –

+0

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

0

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.

+0

¿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 ... –

+0

@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). –

Cuestiones relacionadas