Как операционная система знает, сколько памяти мое приложение использует? (И почему это не делает сборки "мусора"?)

Видят Википедию Singleton_pattern

, Это также считают антишаблоном некоторые люди, которые чувствуют, что это чрезмерно используется, представляя ненужные ограничения в ситуациях, где единственный экземпляр класса на самом деле не требуется. [1] [2] [3] [4]

Ссылки (только соответствующие ссылки от статьи)

  1. ^ Alex Miller. Шаблоны я ненавижу № 1: Singleton, июль 2007
  2. ^ Scott Densmore. , Почему одиночные элементы злые , май 2004
  3. ^ Steve Yegge. Singletons считал глупым , сентябрь 2004
  4. ^ J.B. Rainsberger, IBM. Использование Ваши одиночные элементы мудро , июль 2001

5
задан Jeff Meatball Yang 8 July 2009 в 03:25
поделиться

3 ответа

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

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

То, что процесс использует в соответствии с этими инструментами, на самом деле может означать одно из нескольких - это может быть общее выделенное адресное пространство, общий объем выделенной памяти (файл подкачки + физическая память) или память, которая фактически используется процессом, которая находится в памяти. В диспетчере задач есть отдельный столбец для каждой из этих возможностей.

ОС не может выполнять сборку мусора, поскольку не понимает, что на самом деле содержит эта память - она ​​просто видит выделенные страницы памяти, она не видит объекты, которые можно или не ссылаться.

Принимая во внимание, что ОС обрабатывает выделение на уровне виртуального адреса, В самом процессе есть другие менеджеры памяти, которые берут эти большие куски размером со страницу и разбивают их на что-то полезное для использования приложением. Windows вернет память, выделенную в границах 64 КБ, но затем диспетчер кучи разбивает ее на более мелкие части для использования каждым отдельным выделением, выполняемым программой через new . В приложениях .Net среда CLR будет передавать новые объекты из кучи со сборщиком мусора и, когда эта куча достигает своих пределов, выполняет сборку мусора.

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

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

4
ответ дан 14 December 2019 в 04:45
поделиться

Я не могу ответить на ваш вопрос о различиях в том, как выглядит память в C ++ и виртуальных машинах и т. Д., Но могу сказать, что приложениям обычно предоставляется определенный диапазон памяти для использования при инициализации. Затем, если приложению потребуется больше, оно запросит его у операционной системы, и операционная система (как правило) предоставит его. Есть много реализаций этого - в некоторых операционных системах память других приложений перемещена, чтобы предоставить вам более крупный непрерывный блок, а в других ваше приложение получает различные фрагменты памяти. Может быть даже задействована некоторая обработка виртуальной памяти. Все дело в абстрактной реализации. В любом случае память по-прежнему рассматривается как непрерывная изнутри вашей программы - по крайней мере, операционная система справится с этим.

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

2
ответ дан 14 December 2019 в 04:45
поделиться

Основное отличие заключается в управлении приложениями. Microsoft различает это как управляемое и неуправляемое. Когда объекты размещаются в памяти, они сохраняются по определенному адресу. Это верно как для управляемых, так и для неуправляемых приложений. В управляемом мире «адрес» заключен в дескриптор объекта или «ссылку».

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

В приложении в стиле Win32 указатели указатели. У ОС нет способа узнать, является ли это объектом, произвольным блоком данных, старым 32-битным значением и т. Д. Таким образом, она не может делать никаких выводов относительно указателей между объектами, поэтому может ' • перемещать их в памяти или обновлять указатели между объектами.

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

2
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

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