¿Cómo maneja un proceso la situación cuando no encuentra memoria para usar?

¿Cómo maneja un proceso la situación cuando no encuentra memoria para usar?

¿Qué sucede cuando un proceso particular descubre que no hay memoria para usar?

¿Ese proceso eliminará/reiniciará otro proceso para continuar con su tarea?

¿O qué hará el proceso (que requiere más memoria) en esta situación?

Si es posible, ¿alguien puede proporcionar un buen enlace al respecto?

Respuesta1

En algunos sistemas de memoria virtual paginados bajo demanda, el sistema operativo se niega a asignar páginas anónimas (es decir, páginas que contienen datos sin una fuente de sistema de archivos, como datos de tiempo de ejecución, pila de programas, etc.) a menos que haya suficiente espacio de intercambio para intercambiar las páginas con el fin de liberar memoria física. Esta contabilidad estricta tiene la ventaja de que cada proceso tiene garantizado el acceso a tanta memoria virtual como asigne, pero también significa que la cantidad de memoria virtual disponible está esencialmente limitada por el tamaño del espacio de intercambio.

La contabilidad de memoria en el kernel de Linux intenta compensar los programas que tienden a asignar más memoria de la que utilizan mediante el seguimiento de la cantidad de memoria que realmente utilizan los procesos, yse compromete demasiadola cantidad de memoria virtual. En otras palabras, la cantidad de memoria virtual asignada por el kernel puede exceder la cantidad de memoria física y espacio de intercambio combinados en el sistema. En la práctica, esto significa que la asignación de memoria malloc()nunca fallará. Si bien esto conduce a una mejor utilización de la memoria física y el espacio de intercambio, la desventaja es que cuando la cantidad de memoria en uso excede la cantidad de memoria física y espacio de intercambio disponible, el núcleo debe de alguna manera liberar recursos de memoria para cumplir con la asignación de memoria. compromiso.

El mecanismo del núcleo que se utiliza para recuperar memoria para llenar el compromiso excesivo se llamaasesino sin memoria(OOM-asesino). Normalmente, el mecanismo comenzará a eliminar los procesos "deshonestos" que acaparan la memoria para liberar memoria para otros procesos. El comportamiento del OOM-killer y el algoritmo de contabilidad de memoria se pueden ajustar mediante sysctlla configuración o/proc/sys/vm. Si la vm.panic_on_oomconfiguración es distinta de cero, el kernel entrará en pánico cuando el sistema se quede sin memoria.

La heurística utilizada por el OOM-killer se puede modificar a través de la vm.oom_kill_allocating_taskconfiguración. De forma predeterminada, el OOM-killer escaneará la lista de tareas y seleccionará una tarea no autorizada que utilice mucha memoria para eliminar. El OOM-killer también se puede configurar para finalizar la tarea que desencadenó la condición de falta de memoria.

El algoritmo de contabilidad de la memoria del kernel se puede ajustar con la vm.overcommit_memoryconfiguración. El valor predeterminado es realizar algunas comprobaciones heurísticas débiles antes de realizar una sobrecompromiso, pero el algoritmo de contabilidad de memoria también se puede configurar en un modo estricto, en el que el límite del espacio de direcciones virtuales está determinado por el valor de la vm.overcommit_ratioconfiguración de acuerdo con la siguiente fórmula:

    virtual memory = (swap + physical memory * (overcommit_ratio / 100))

Cuando se utiliza una contabilidad de memoria estricta, el kernel ya no asignará páginas anónimas a menos que tenga suficiente memoria física libre o espacio de intercambio para almacenar las páginas. Esto significa que es esencial que el sistema estéconfigurado con suficiente espacio de intercambio. A menos que haya suficiente memoria física o espacio de intercambio para satisfacer el compromiso de memoria, las llamadas a malloc()pueden fallar. En estos casos, corresponde al propio programa determinar un curso de acción apropiado. Algunos podrían simplemente darse por vencidos y fallar rotundamente, pero también podrían recurrir a un algoritmo más lento, pero más eficiente en memoria, para realizar la acción para la que habrían necesitado la asignación de memoria.

Respuesta2

Eso depende de para qué esté configurado el programa. Los programas simples simplemente imprimen un mensaje de error y mueren cuando no pueden asignar suficiente memoria. Algunos programas intentan liberar algo de memoria por sí solos y lo vuelven a intentar. Algunos programas guardan algún estado de emergencia antes de salir. Algunos programas continúan de alguna manera y se las arreglan sin la memoria adicional, tal vez después de informar al usuario que algún comando no se pudo ejecutar.

Si bien un proceso podría, en principio, matar a otro proceso, ese sería un comportamiento extremadamente extraño. El proceso no tendría forma de saber qué procesos eliminar ni garantía de que pueda apoderarse de su memoria.

Si elEl kernel detecta la falta de memoria.En lugar de hacerlo la aplicación, el kernel puede eliminar algunos procesos, basándose en heurísticas complejas (como "no eliminar sshd").

información relacionada