В онлайновом учебнике OSTEP для бакалавриата по операционным системам есть раздел, в котором обсуждается именно ваш вопрос.
Соответствующий раздел называется «Забыть на освобождение памяти» в главе API памяти *1006* на стр. 6, в которой содержится следующее объяснение:
В некоторых случаях может показаться, что не вызывать free () разумно. За
Например, ваша программа недолговечна и скоро завершится; в этом случае,
когда процесс умирает, ОС очистит все свои выделенные страницы и
таким образом, утечка памяти сама по себе не произойдет. Хотя это, безусловно, «работает»
(см. в стороне на странице 7), это, вероятно, плохая привычка, поэтому будьте осторожны
выбора такой стратегии
Этот отрывок в контексте введения концепции виртуальной памяти. По сути, в этой точке книги авторы объясняют, что одной из целей операционной системы является «виртуализация памяти», то есть, чтобы каждая программа поверила, что у нее есть доступ к очень большому адресному пространству памяти.
За кулисами операционная система преобразует «виртуальные адреса», которые видит пользователь, в реальные адреса, указывающие на физическую память.
Однако для совместного использования ресурсов, таких как физическая память, операционная система должна отслеживать, какие процессы ее используют. Таким образом, если процесс завершается, то в рамках возможностей и целей разработки операционной системы можно восстановить память процесса, чтобы он мог перераспределять память и делиться ею с другими процессами.
РЕДАКТИРОВАТЬ: Сторона, упомянутая в выдержке, скопирована ниже.
В сторону: ПОЧЕМУ НЕ УТЕЧИВАЕТСЯ ПАМЯТЬ, ВЫХОДИТ ИЗ ВАШЕГО ПРОЦЕССА
Когда вы пишете недолговечную программу, вы можете выделить некоторое пространство
используя malloc()
. Программа запускается и собирается завершить: есть ли
нужно позвонить free()
кучу раз перед выходом? Пока кажется
неправильно, нет, никакая память не будет «потеряна» в любом реальном смысле. Причина в
все просто: в системе действительно два уровня управления памятью.
Первый уровень управления памятью осуществляется ОС, которая
раздает память процессам, когда они работают, и возвращает их, когда
процессы выходят (или иным образом умирают). Второй уровень управления
находится в каждом процессе, например, в куче, когда вы вызываете
malloc()
и free()
. Даже если вам не удается позвонить free()
(и, следовательно, утечка
памяти в куче), операционная система вернет всю память
процесс (включая эти страницы для кода, стека и, в зависимости от ситуации,
куча) когда программа закончит работу. Неважно, в каком состоянии
вашей кучи в вашем адресном пространстве, ОС забирает все эти страницы
когда процесс умирает, таким образом гарантируя, что память не будет потеряна, несмотря на
тот факт, что вы не освободили его.
Таким образом, для недолговечных программ утечка памяти часто не вызывает каких-либо
эксплуатационные проблемы (хотя это можно считать плохой формой). когда
вы пишете долго работающий сервер (например, веб-сервер или управление базой данных
система, которая никогда не выходит), утечка памяти является гораздо большей проблемой,
и в конечном итоге приведет к сбою, когда приложение заканчивается
объем памяти. И, конечно, утечка памяти - еще большая проблема внутри
одна конкретная программа: сама операционная система. Показывать нам один раз
еще раз: те, кто пишет код ядра, имеют самую сложную работу из всех ...
со страницы 7 Память API глава
Операционные системы: Three Easy Pieces
Ремзи Х. Арпачи-Дюссо и Андреа С. Арпачи-Дюссо
Книги Арпачи-Дюссо
Март 2015 (версия 0.90)