Какие операционные системы не будут свободная память на выходе программы?

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

Это - что-то, что было зафиксировано назад в возрасте динозавров (80-е)?

8
задан Community 23 May 2017 в 11:44
поделиться

3 ответа

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

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

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

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

10
ответ дан 5 December 2019 в 12:07
поделиться

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

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

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

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

3
ответ дан 5 December 2019 в 12:07
поделиться

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

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

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

1
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

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