Что происходит при переполнении оперативной памяти?

Представим ситуацию: некоторая программа начала загружать оперативу больше, чем её имеется физически. Причина любая - забыли освобождать память, грузим мультимедиа целиком, а возможно данных правда настолько много и это нормально для определённых мега-вычислений.
Вопрос: что произойдёт в этом случае?
В первую очередь интересует Linux, но хотелось бы вместе с этим узнать, как дела обстоят на других операционных системах.
  • Вопрос задан
  • 4231 просмотр
Решения вопроса 1
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
В первую очередь интересует Linux, но хотелось бы вместе с этим узнать, как дела обстоят на других операционных системах.

Начнёт заполняться свой (swap), в других ОС (windows) примерно такая же система, про "совсем другие ОС" - я не в курсе.

И в Linux и в Windows и в других ОС, для которых есть компиляторы языка Си, есть функция, если посмотреть описание, например, такой функции, как malloc, то мы увидим оттуда, что:
Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель.


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

Про SWAP можно немного почитать тут.

Некоторые программы, такие как Photoshop например, будучи заранее зная, что оперативной памяти не хватит наверняка, имеют свои механизмы "свопинга", т.е. создание некоего подобия "подкачки" на диске. У меня например, при открытии одного шаблона (макета) Photoshop может легко "откусить" 100Гб с диска, а если ещё и история изменений большая - может и больше.

Отдельно хочу обратить Ваше внимание, что в Linux'е есть некий механизм "самосохранения" в ядре, который при определенных условиях начинает "убивать" процессы, вышедшие из под контроля. В какой именно момент времени это происходит - точно я к сожалению сказать не могу, т.к. ещё только в процессе изучения подобных механизмов, но подозреваю, что "выход из под контроля" - это когда процесс и его потомки (форки) начинают потреблять чрезмерное кол-во процессорного времени и возможно памяти. Я наблюдал такую картину во время DDoS атаки на сервер, в этот момент Linux начал "крошить" всё подряд, в т.ч. и веб-сервер попал под раздачу. Среди прочего, помню, что где-то в документации читал, что процессу можно установить соотв. "флаг" или "приоритет" влияющий на этот механизм.

*ещё раз раз обращаю Ваше внимание, касательно абзаца выше - я детально не изучал данный механизм и в документации "по быстрому" информации не нашел, по этому, в последнем абзаце - информация может быть не совсем точной.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Frankenstine
@Frankenstine
Сисадмин
Конкретно по линуксам:
1) Программа выдаёт запрос на выделение дополнительной памяти
2) Операционная система проверяет, может ли она выделить эту память.
3) Если память доступна, она выделяется и положительный ответ возвращается программе.
Тонкость на этом этапе: на самом деле памяти может и не быть достаточно. Физически память пока не занимается.
4) Программа записывает данные в выделенную память. Именно на этом этапе может кончиться свободная память.
5) Операционная система обрабатывает состояние ООМ (out of memory). Для начала она пытается освободить память такими "бескровными" действиями, как сокращение размера файлового кэша, буферов ввода-вывода, вытеснением неактивных страниц в раздел/файл подкачки и т.п.
6) Если "бескровно" память высвободить не удалось, вызывается OOM Killer - "судья", который принудительно завершает один из работающих процессов (руководствуясь несколькими критериями), пока состояние ООМ не будет преодолено. У вызвавшей ОММ состояние программы шансы быть пристреленной выше, чем у других.

Подробнее:
https://habrahabr.ru/company/yandex/blog/250753/
https://www.insight-it.ru/linux/2015/chto-stoit-zn...
Ответ написан
Комментировать
Vincent1
@Vincent1
Будет грузить данные в своп. Если и он закончится, то программа выдаст что то вроде "can not allocate memory"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы