Введение
Состояние работы компьютера, при котором невозможно выделить дополнительную память.
Нехватка памяти (OOM) – часто нежелательное состояние работы компьютера, когда невозможно выделить дополнительную память для использования программами или операционной системой. Такая система не сможет загрузить какие-либо дополнительные программы, и поскольку многие программы могут загружать дополнительные данные в память во время выполнения, они перестанут функционировать корректно. Обычно это происходит из-за того, что вся доступная память, включая пространство подкачки, уже выделена.
История
Исторически, ситуация нехватки памяти возникала чаще, чем сейчас, поскольку ранние компьютеры и операционные системы были ограничены небольшим объемом физической оперативной памяти (RAM) из-за неспособности ранних процессоров адресовать большие объемы памяти, а также из-за соображений стоимости. С появлением виртуальной памяти и использованием файла подкачки эта ситуация стала менее распространенной. Почти все современные программы предполагают возможность свободного выделения и освобождения памяти во время выполнения и, как правило, аварийно завершают работу (сбой), если это предположение не выполняется; более старые программы часто выделяли память только один раз, проверяли, достаточно ли её для выполнения всех задач, и затем не ожидали дальнейшего выделения. Поэтому они либо сразу же выдавали сообщение об ошибке "не хватает памяти" (OOME), либо работали как ожидалось. Ранние операционные системы, такие как MS DOS, не поддерживали многозадачность. Программам выделялась физическая память, которую они могли использовать по мере необходимости. Физическая память часто была дефицитным ресурсом, и когда она исчерпывалась приложениями, например, с функциями "завершить работу и остаться в памяти", запуск новых приложений был невозможен до закрытия работающих. Современные операционные системы предоставляют виртуальную память, в которой процессам выделяется диапазон памяти, не соответствующий напрямую физической оперативной памяти. Виртуальная память может быть обеспечена физической оперативной памятью, дисковым файлом через mmap (в производных Unix) или MapViewOfFile (в Windows), либо файлом подкачки, и операционная система может перемещать страницы виртуальной памяти по мере необходимости. Поскольку виртуальная память не обязательно должна быть обеспечена физической памятью, её исчерпание встречается редко, и обычно операционная система накладывает другие ограничения на потребление ресурсов. Как и предсказывал закон Мура, объем физической памяти во всех компьютерах рос почти экспоненциально, хотя это в некоторой степени компенсируется увеличением размеров самих программ и файлов. В некоторых случаях компьютер с поддержкой виртуальной памяти, где большая часть загруженных данных находится на жестком диске, может исчерпать физическую память, но не виртуальную, что приводит к чрезмерной подкачке. Это состояние, известное как "thrashing", обычно делает компьютер непригодным для использования, пока не будут закрыты некоторые программы или не будет выполнена перезагрузка. По этим причинам сообщение о нехватке памяти редко встречается в приложениях на современных компьютерах. Однако, всё ещё возможно столкнуться с ситуацией OOM на современном компьютере. Типичный случай OOM на современных компьютерах возникает, когда операционная система не может создать дополнительную виртуальную память, поскольку все потенциальные носители для её поддержки заполнены или отключены пользователем. Эта ситуация может возникнуть из-за механизма copy-on-write после вызова fork.
Ограничения памяти на процесс
Помимо ограничений физической памяти всей системы, некоторые системы ограничивают объем памяти, который может использовать каждый процесс. Как правило, это вопрос политики, но такое ограничение может возникнуть и в случае, когда операционная система имеет большее адресное пространство, чем доступно на уровне процесса. Некоторые высокопроизводительные 32-битные системы (например, с включенным расширением физических адресов) оснащаются 8 гигабайтами системной памяти или более, хотя любой отдельный процесс может получить доступ только к 4 ГБ в 32-битной плоской модели памяти. Процесс, превысивший установленный для него лимит памяти и затем попытавшийся выделить дополнительную память, столкнется с ошибкой. Например, стандартная функция C для выделения памяти, `malloc`, вернет `NULL`, и корректно работающее приложение должно обработать эту ситуацию.