Какие операционные системы не освобождают память при выходе из программы? - PullRequest
8 голосов
/ 27 июня 2010

Этот вопрос вызвал у меня любопытство.На подобные вопросы всегда приходят ответы типа «Обычно это безопасно, но вы не должны предполагать, что ОС сделает это за вас», что звучит как хороший совет для меня, но я задаюсь вопросом: есть ли активно разработанные (выпущенные)операционные системы, которые этого не делают?

Это было исправлено еще в эпоху динозавров (80-х годов)?

Ответы [ 3 ]

10 голосов
/ 27 июня 2010

Краткий ответ - «нет».Даже программа в DOS много лет назад освобождала память при завершении программы (просто потому, что ничто не управляло памятью, когда программа остановилась).Я уверен, что кто-то может заметить, что код режима ядра не обязательно освобождает его память при выходе из приложения, или они могут сослаться на неясную встроенную ОС .... но вы можете предположить, что app-exit возвращает всю память, которую приобрел код режима пользователя,(Windows 3.x могла иметь эту проблему в зависимости от того, какой распределитель использовался ...)

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

Подумайте об этом так.Допустим, вы разрабатываете некоторый класс, который разработан как одноэлементный (создается только один раз за время жизни приложения).Таким образом, вы решаете не беспокоиться об очистке памяти, когда ваш компонент разрушается или завершается.Это идеальное решение на тот момент.Спустя годы, после того как вы ушли на более зеленые пастбища, кто-то другой может прийти и решить, что ему нужно использовать ваш класс в нескольких местах, так что многие экземпляры будут приходить и уходить в течение жизни приложения.Ваша утечка памяти станет их проблемой.

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

3 голосов
/ 27 июня 2010

В CP / M это не было проблемой освобождения памяти, так как у вас была статическая область ОЗУ для вашей программы, и каждая программа работала в одном и том же пространстве.Таким образом, когда программа A выходила и программа B запускалась, B просто загружался поверх A.

Теперь были механизмы для резервирования памяти вне ОС, но обычно это была не куча памяти (вклассический случай, который мы рассматриваем сегодня), это был специальный дизайн зарезервированных областей для различных задач.

Например, в DOS была эта процедура выхода, называемая «Завершить и остаться резидентом».Это «вышло» из программы, но не освободило место после выхода из программы.Обычно эти программы загружают векторы прерываний (например, прерывания клавиатуры) для запуска подпрограмм.Borland Sidekick был очень популярным "TSR" в те времена и предлагал такие вещи, как калькулятор и список контактов.

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

1 голос
/ 27 июня 2010

Ни одна из последних Unix-подобных операционных систем не может освободить всю память процесса при выходе из процесса, где недавний, вероятно, означает «с 1970 года или около того».Я вполне уверен, что очень старые операционные системы ПК, такие как DOS и CP / M, имели эту проблему, а также некоторые старые версии Windows.Я не знаю достаточно о недавней Windows, чтобы быть уверенным, но я был бы очень удивлен, если бы какая-либо из Windows XP, Vista или Windows 7 имела проблемы с освобождением памяти процесса.

Как правило,Я бы предположил, что любая операционная система, которая не использует виртуальную память для предоставления процессам отдельных адресных пространств, вероятно, подвержена утечке памяти, когда процессы в большинстве случаев дают сбой.После того, как ОС внедрила виртуальные адресные пространства для каждого процесса, она уже должна отслеживать всю физическую память, выделенную для процесса, так что ее надежное освобождение является простым.

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

...