Sin memoria - Out of memory

Pantalla sin memoria en el sistema que ejecuta Linux Mint 9 (kernel 2.6.32)

La memoria insuficiente ( OOM ) es un estado de funcionamiento de la computadora a menudo no deseado en el que no se puede asignar memoria adicional para que la utilicen los programas o el sistema operativo. Dicho sistema no podrá cargar ningún programa adicional y, dado que muchos programas pueden cargar datos adicionales en la memoria durante la ejecución, estos dejarán de funcionar correctamente. Esto suele ocurrir porque se ha asignado toda la memoria disponible, incluido el espacio de intercambio de disco .

Historia

Históricamente, la condición de falta de memoria era más común de lo que es ahora, ya que las primeras computadoras y sistemas operativos estaban limitados a pequeñas cantidades de memoria física de acceso aleatorio (RAM) debido a la incapacidad de los primeros procesadores para manejar grandes cantidades de memoria, como así como consideraciones de costos. Dado que la llegada de la memoria virtual abrió la puerta para el uso del espacio de intercambio, la condición es menos frecuente. Casi todos los programas modernos esperan poder asignar y desasignar memoria libremente en tiempo de ejecución, y tienden a fallar de forma incontrolada (bloqueos) cuando esa expectativa no se cumple; los más antiguos a menudo asignaban memoria solo una vez, verificaban si tenían suficiente para hacer todo su trabajo y luego no esperaban más. Por lo tanto, fallarían inmediatamente con un mensaje de error de "memoria insuficiente" o funcionarían como se esperaba.

Los primeros sistemas operativos, como MS-DOS, carecían de compatibilidad con la multitarea . A los programas se les asignó memoria física que podían usar cuando lo necesitaban. La memoria física era a menudo un recurso escaso, y cuando se agotaba con aplicaciones como aquellas con funcionalidad Terminate y Stay Resident , no se podían iniciar más aplicaciones hasta que se cerraran las aplicaciones en ejecución.

Los sistemas operativos modernos proporcionan memoria virtual, en la que los procesos reciben un rango de memoria, pero donde la memoria no se corresponde directamente con la RAM física real. La memoria virtual puede estar respaldada por RAM física, un archivo de disco a través de mmap (en derivados de Unix ) o MapViewOfFile (en Windows), o espacio de intercambio, y el sistema operativo puede mover páginas de memoria virtual según sea necesario. Debido a que la memoria virtual no necesita estar respaldada por una memoria física, el agotamiento de la misma es poco común y, por lo general, el sistema operativo impone otros límites al consumo de recursos.

Como predijo la ley de Moore , la cantidad de memoria física en todas las computadoras ha crecido casi exponencialmente, aunque esto se compensa en cierto grado con los programas y archivos que se hacen más grandes. En algunos casos, una computadora con soporte de memoria virtual donde la mayoría de los datos cargados residen en el disco duro puede quedarse sin memoria física pero no con memoria virtual, causando así una paginación excesiva . Esta condición, conocida como paliza , generalmente deja la computadora inutilizable hasta que se cierran algunos programas o se reinicia la máquina. Debido a estas razones, las aplicaciones con computadoras modernas rara vez encuentran un mensaje de memoria insuficiente.

Sin embargo, todavía es posible encontrar una condición OOM con una computadora moderna. El caso típico de OOM en las computadoras modernas ocurre cuando el sistema operativo no puede crear más memoria virtual, porque todos sus dispositivos de respaldo potenciales se han llenado o el usuario final los ha desactivado. La condición puede surgir debido a copy-on-write después de fork ().

Gestión de memoria insuficiente

Los núcleos de sistemas operativos como Linux intentarán recuperarse de este tipo de condición OOM al finalizar uno o más procesos, un mecanismo conocido como OOM Killer . Linux 4.6 (lanzado en mayo de 2016) introdujo cambios en situaciones de OOM, mejorando la detección y confiabilidad. El conocimiento de cgroup en OOM killer se implementó en el kernel de Linux 4.19 lanzado en octubre de 2018, que agrega la capacidad de eliminar un cgroup como una sola unidad.

Debido a la activación tardía de OOM Killer en algunos sistemas Linux, existen varios demonios y parches del kernel que ayudan a recuperar la memoria de la condición OOM antes de que sea demasiado tarde.

  • earlyoom
  • nohang
  • Los parches del kernel de PSI (información de bloqueo de presión) y el oomddemonio que los acompaña , los parches se fusionan en el kernel de Linux 4.20.

Límites de memoria por proceso

Aparte de los límites de memoria física de todo el sistema, algunos sistemas limitan la cantidad de memoria que puede usar cada proceso. Por lo general, una cuestión de política, tal limitación también puede ocurrir cuando el sistema operativo tiene un espacio de direcciones más grande que el disponible a nivel de proceso. Algunos sistemas de 32 bits de gama alta (como los que tienen habilitada la Extensión de dirección física ) vienen con 8 gigabytes o más de memoria del sistema, aunque cualquier proceso solo puede acceder a 4 GB en un modelo de memoria plana de 32 bits .

Un proceso que exceda su límite por proceso y luego intente asignar más memoria encontrará una condición de error. Por ejemplo, la función estándar de C para asignar memoria, malloc()devolverá NULL y una aplicación con buen comportamiento debería manejar esta situación.

Referencias

enlaces externos