¿Qué sucede cuando un programa de 32 bits (que se ejecuta en una máquina de 64 bits) alcanza el límite de memoria?

1

Por lo general, ejecuto un par de cientos de pestañas en mi navegador (Pale Moon x86), presionando con frecuencia el uso de la memoria del programa hasta 2-3 GB.

¿Qué sucede cuando un programa se está ejecutando contra el límite de memoria? ¿El sistema sigue alimentando su memoria, pero "ahora" en forma de intercambio de disco? ¿El programa "sabe" que ha alcanzado el límite de memoria del sistema?

Solo recientemente he tenido una visión rápida (simplista) de por qué el navegador no sigue creciendo en tamaño de memoria más allá de eso, y comienza a funcionar con un rendimiento horrible: ¡32/64 bits de espacio de memoria!

Así que ahora he comenzado a recurrir a Waterfox, una variante x64. ¿Seguirá creciendo un programa x64 en la cantidad de memoria utilizada, hasta que el sistema diga "no más"?

Coldblackice
fuente
Si el programa es "inteligente", evita (en la medida de lo posible) alcanzar el límite de memoria o "gestiona" los mensajes de error que recibe cuando se supera el límite. Si el programa no es "inteligente", se bloquea. Pero usar 2-3G en cualquier aplicación va a estresar a la mayoría de los sistemas, especialmente si instaló RAM es menos de aproximadamente 6G.
Daniel R Hicks

Respuestas:

6

¿Qué sucede cuando un programa de 32 bits (que se ejecuta en una máquina de 64 bits) alcanza el límite de memoria?

Lo mismo que sucede en un sistema de 32 bits: el programa falla de alguna manera.

En lo que respecta al programa de 32 bits, el "universo" consta de hasta 4 GB de datos. No sabe sobre el área más grande fuera de su propia pequeña caja (piense en la analogía de los peces que Michio Kaku usa en su libro Hyperspace ).

Si abre demasiadas pestañas y aumenta el uso de memoria, llenará el universo y, cuando se agote, se quejará de que no tiene suficiente memoria para abrir una nueva pestaña o mostrar una imagen o lo que sea. Bueno, se quejará si está bien escrito; si está mal escrito, simplemente se bloqueará.

Piénselo desde un punto de vista de programación de bajo nivel. El programa de 32 bits utiliza punteros de 32 bits para almacenar sus datos. Eso significa que puede apuntar a un máximo de 4 GB de datos. Si ya ha usado 4 GB, incluso si el sistema operativo puede darle más, ¿cuál sería el valor del nuevo puntero? La nueva dirección estaría demasiado lejos y el programa no podría colocar una dirección tan grande en un puntero de 32 bits.

Como analogía, piense en los números de teléfono. Digamos que en su ciudad, no hay demasiada gente, por lo que sus números de teléfono tienen 5 dígitos y permiten hasta 10,000 números, por lo que todas las libretas de direcciones tienen hasta 10,000 espacios para números de teléfono. Sin embargo, el país tiene mucha gente, por lo que utiliza números de 7 dígitos. A pesar de que el país puede darle el número de una persona muy lejos, no podrá almacenarlo en su libreta de direcciones porque solo tiene 5 dígitos de espacio para imprimir números, así que una vez que haya impreso 10,000 números, El libro está completamente lleno.

Synetech
fuente
2

Una aplicación de 32 bits solo tiene un espacio de direcciones de 32 bits, incluso en un sistema de 64 bits, por lo que no hay forma de que pueda usar más de 4 GB de memoria virtual (y probablemente significativamente menos que eso). Una aplicación de 64 bits tiene un espacio de direcciones mucho más grande y, por lo tanto, puede usar más memoria virtual. Pero solo hay tanta RAM y cuando está llena, los datos van al archivo de la página, lo que ralentiza todo el sistema (a menudo de manera dramática).

Fran
fuente
2

Cuando un programa de 32 bits comienza a acercarse al límite de la memoria virtual (espacio de direcciones), sus asignaciones de memoria comenzarán a fallar. Cada asignación de memoria que realiza el proceso requiere suficiente espacio de direcciones contiguo disponible en el espacio de memoria virtual del proceso, y para un proceso de 32 bits, eso es 4 GB. En Windows 7, los límites de 2 GB y 3 GB no se aplican a los programas de 32 bits en un sistema operativo de 64 bits, si tienen en cuenta las direcciones grandes. (Que debería ser todo programa moderno significativo).

Lo que hace el proceso cuando fallan las asignaciones de memoria depende de él. Por lo general, el programa intentará exprimir su uso de la memoria desechando todo lo que no necesita, desasignando archivos que no estaba usando, etc. Pero en última instancia, simplemente tendrá que negarse a hacer cosas.

Algunos programas implementan formas de paginación donde escriben estructuras en un archivo para leerlas más tarde. Permanecerán en la RAM todo el tiempo, pero esto seguirá siendo más lento debido a la necesidad de hacer malabarismos con las asignaciones.

David Schwartz
fuente