17

Так что у меня есть небольшая дискуссия с моим боссом об управлении памятью.

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

Мы говорим и о Windows, и о OS X здесь.

4 ответа4

8

Операционные системы, перечисленные в тегах вопроса (Windows и OS X), реализуют виртуальную память, где каждому процессу предоставляется свое собственное адресное пространство, которое ОС затем сопоставляет с физической памятью. Эти таблицы сопоставления используются для очистки выделения памяти при завершении процесса, поэтому память полностью освобождается. Физические страницы могут совместно использоваться несколькими процессами, и в этом случае они освобождаются, когда больше нет пользователей.

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

Существуют специальные ресурсы, которые выживают в процессе, который их создал, например, можно создавать постоянные именованные выделенные ресурсы общей памяти, которые можно использовать в межпроцессном взаимодействии. Они редко используются именно потому, что ОС не может определить, требуются ли они по-прежнему.

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

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

8

Нет проблем в моем опыте, убить прочь.

Например, если у вас есть 4 ГБ оперативной памяти, из которых 3 ГБ используется игрой, и вы убиваете игровой процесс, вы можете без проблем перезапустить игру, и у нее снова будет 3 ГБ оперативной памяти.

6

Прошло много времени с тех пор, как я изучил этот материал, но здесь идет.

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

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

Высоко спекулятивный:

Если .NET работает как виртуальная машина с несколькими приложениями .NET на одной и той же виртуальной машине, тогда .NET может удерживать память, которая еще не является GCd, до тех пор, пока не будет запущена GC, и Windows подумает, что .NET используя больше, чем на самом деле. (И если бы MS была очень ловкой, Windows могла бы затем сообщить .NET GC в ситуациях с нехваткой памяти, но это почти бессмысленно, потому что именно для этого и используется пространство подкачки.)

Если бы .NET действительно работал таким образом, то ОС все равно считала бы его одним процессом для целей ОС, который берет на себя ответственность за решение о том, что оставить, а что выбросить, и, как правило, не проблема Windows сообщить процессу, что ему нужно начать освобождение памяти. В этот момент вполне возможно, что MS создаст специальный API только для .NET, чтобы процессы .NET выглядели как процессы Windows, за исключением того, что это не так, поэтому люди могут подумать, что память процесса не освобождается. Это правда; просто вы смотрите на неправильный процесс.

Я не знаю достаточно о .NET, чтобы сказать, что он действительно работает таким образом; Java VM, конечно, нет.

Конец спекуляции.

РЕДАКТИРОВАТЬ: поскольку убийство процесса плохо для управления памятью, это требует, чтобы несколько процессов выделялись из одного и того же пула (т. Е. Они больше похожи на потоки, чем реальные процессы) и чтобы память не была освобождена после того, как процесс убит. Для этого почти потребовалась бы совместная многозадачная система, поскольку, насколько мне известно, виртуальная память и упреждающая многозадачность обычно реализовывались вместе (виртуальная память позволяла изолировать процессы друг от друга и не давить им вытеснять память друг друга). Наличие виртуальной памяти упрощает очистку после процесса на уровне ОС; Вы просто перемещаете все страницы из пула процесса в свободный пул.

5

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .