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

0
02.05.2018, 05:24
3 ответа

В ядре Linux есть компонент, называемый убийцей OOM (нехватки памяти ). Как указал Патрик в комментариях, убийцу OOM можно отключить, но по умолчанию разрешена избыточная фиксация (и, таким образом, включен убийца OOM ).

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

Ядро скорее убьет новые процессы, чем старые, особенно те, которые (вместе со своими потомками )потребляют много памяти. Таким образом, в вашем случае может начаться новый процесс, но, вероятно, он будет убит.

Вы можете использовать файлы

/proc/self/oom_adj
/proc/self/oom_score
/proc/self/oom_score_adj

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

1
28.01.2020, 02:43

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

0
28.01.2020, 02:43

Ответ Хауке Лагинга посвящен убийце процессов «недостаточно памяти», и почти не упоминает тот факт, что все может просто провалиться. Вы упоминаете сценарий, в котором «пользователь открывает новое приложение». Стандартный механизм открытия «нового приложения» для некоторого процесса (, как правило, оболочки или оконного менеджера )для «разветвления», создать новый процесс, который является копией существующего, и чтобы новый процесс вызывал «exec», заменить себя новой программой. Любой может выйти из строя из-за нехватки памяти.

От вилка (2):

ERRORS

(i.e., list of possible failure conditions)

       ︙

    ENOMEM

      fork() failed to allocate the necessary kernel structures because memory is tight.

       ︙

И аналогично execve (2):

       ︙

    ENOMEM

      Insufficient kernel memory was available.

       ︙

Этот поиск Google показывает другие системные функции который может возвращать ошибку «ENOMEM».

Так что вполне возможно, что вы (пользователь )просто получите сообщение об ошибке когда вы пытаетесь запустить новую программу, или иным образом инициировать новое действие, когда памяти мало.

0
28.01.2020, 02:43

Теги

Похожие вопросы