Как процесс справляется с ситуацией, когда не находит памяти для использования?

Как процесс справляется с ситуацией, когда не находит памяти для использования?

Что происходит, когда определенный процесс обнаруживает, что памяти для использования недостаточно?

Будет ли этот процесс завершать/перезапускать другой процесс для продолжения своей задачи?

Или что будет делать в этой ситуации процесс (требующий больше памяти)?

Если возможно, не могли бы вы дать хорошую ссылку по этому поводу?

решение1

В некоторых системах виртуальной памяти с подкачкой по требованию операционная система отказывается выделять анонимные страницы (т. е. страницы, содержащие данные без источника файловой системы, такие как данные времени выполнения, программный стек и т. д.), если нет достаточного пространства подкачки для выгрузки страниц с целью освобождения физической памяти. Этот строгий учет имеет то преимущество, что каждому процессу гарантирован доступ к такому объему виртуальной памяти, который он выделяет, но это также означает, что объем доступной виртуальной памяти по сути ограничен размером пространства подкачки.

Учет памяти в ядре Linux пытается компенсировать программы, которые имеют тенденцию выделять больше памяти, чем они используют, отслеживая объем памяти, фактически используемый процессами, ипереобязываетобъем виртуальной памяти. Другими словами, объем виртуальной памяти, выделенной ядром, может превышать объем физической памяти и пространства подкачки, объединенных в системе. На практике это означает, что выделение памяти через нее malloc()никогда не будет неудачным. Хотя это приводит к лучшему использованию физической памяти и пространства подкачки, недостатком является то, что когда объем используемой памяти превышает объем доступной физической памяти и пространства подкачки, ядро ​​должно каким-то образом освободить ресурсы памяти, чтобы выполнить обязательство по выделению памяти.

Механизм ядра, который используется для освобождения памяти с целью заполнения избыточного объема, называетсяубийца нехватки памяти(OOM-killer). Обычно механизм начинает убивать загружающие память "мошеннические" процессы, чтобы освободить память для других процессов. Поведение OOM-killer и алгоритма учета памяти можно настроить с помощью sysctlнастроек или/proc/sys/vm. Если vm.panic_on_oomпараметр не равен нулю, ядро ​​вместо этого перейдет в режим паники, когда системе не хватит памяти.

Эвристика, используемая OOM-killer, может быть изменена через vm.oom_kill_allocating_taskнастройку. По умолчанию OOM-killer будет сканировать список задач и выбирать задачу-мошенничество, использующую много памяти, для завершения. OOM-killer также может быть настроен на завершение задачи, которая вызвала состояние нехватки памяти.

Алгоритм учета памяти ядра можно настроить с помощью vm.overcommit_memoryнастройки. По умолчанию выполняется несколько слабых эвристических проверок перед перераспределением, но алгоритм учета памяти также можно настроить на строгий режим, в котором ограничение виртуального адресного пространства определяется значением настроек vm.overcommit_ratioв соответствии со следующей формулой:

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

При использовании строгого учета памяти ядро ​​больше не будет выделять анонимные страницы, если у него нет достаточно свободной физической памяти или пространства подкачки для хранения страниц. Это означает, что важно, чтобы система быланастроено с достаточным пространством подкачки. Если нет достаточного количества физической памяти или пространства подкачки для удовлетворения выделенной памяти, вызовы malloc()могут потерпеть неудачу. В этих случаях сама программа должна определить подходящий курс действий. Некоторые могут просто сдаться и сразу потерпеть неудачу, но они также могут вернуться к более медленному, но более эффективному по памяти алгоритму для выполнения действия, для которого им потребовалось бы выделение памяти.

решение2

Это зависит от того, на что настроена программа. Простые программы просто выводят сообщение об ошибке и завершаются, когда не могут выделить достаточно памяти. Некоторые программы пытаются освободить часть памяти самостоятельно и повторяют попытку. Некоторые программы выполняют аварийное сохранение состояния перед выходом. Некоторые программы каким-то образом продолжают работать и обходятся без дополнительной памяти, возможно, сообщив пользователю, что некоторая команда не может быть выполнена.

Хотя процесс в принципе может убить другой процесс, это было бы крайне странным поведением. Процесс не будет знать, какие процессы убивать, и не будет никакой гарантии, что он сможет захватить их память.

Еслинедостаток памяти определяется ядромВместо приложения ядро ​​может завершить некоторые процессы, основываясь на сложной эвристике (например, «не завершать sshd»).

Связанный контент