Как может программа иметь большое количество виртуальных байтов, в то время как частные байты относительно низки в 32-битной Windows? - PullRequest
2 голосов
/ 22 декабря 2008

Я пытаюсь лучше понять, как 32-разрядная ОС Windows вычисляет виртуальные байты для программы. У меня сложилось впечатление, что виртуальные байты (VB) - это мера того, сколько пользовательского адресного пространства используется, а частные байты (PB) - это мера фактической выделенной и зарезервированной памяти в системе.

В частности, у меня есть серверная программа, которую я отслеживаю, и которая при интенсивной работе поднимется до предела 3 ГБ для VB. Примерно в то же самое время PB увеличивается, но затем быстро уменьшается до 1 ГБ по мере снижения использования. Значение PB обычно остается низким, около отметки 1 ГБ, но значение VB остается около отметки 3 ГБ. У меня нет доступа к исходному коду, поэтому я просто использую основные счетчики производительности Windows для мониторинга всего этого. С точки зрения программирования, какую концепцию памяти я не понимаю, которая делает все это возможным? Есть хорошая ссылка, чтобы узнать больше об этом?

Ответы [ 5 ]

3 голосов
/ 23 декабря 2008

Скорее всего, ваши отчеты вызваны кучей процессов. В Windows есть две части выделения памяти. Первая часть - это непрерывное адресное пространство в вашем приложении, через которое осуществляется доступ к памяти. В 32-битной системе, не использующей ключ / 3GB, все ваши ресурсы должны выделяться из нижних 2 ГБ адресного пространства пользователя. Вторая часть выделения памяти - это фактически память для выделения. Это может быть либо ОЗУ, либо часть файловой системы на жестком диске. ОС обрабатывает перемещение между оперативной памятью и файловой системой подкачки в фоновом режиме.

Скорее всего, ваше приложение использует кучу Windows для обработки всех выделений памяти. При создании кучи резервируется 1 МБ адресного пространства для памяти, которую он выделит. Пока ему фактически не понадобится память, связанная с этим адресным пространством, физическая память фактически не используется. Если куче требуется больше памяти, чем 1 МБ, она использует алгоритм удвоения для резервирования большего адресного пространства, а затем фиксирует физическую память, когда это необходимо. Важно отметить, что, как только куча резервирует адресное пространство, она никогда не освобождает его.

Лично я нашел следующие книги и главы полезными при попытке понять управление памятью.

Расширенная отладка Windows - Глава 6 В этой книге дан самый подробный обзор кучи, которую я видел.

Внутренние компоненты Windows - Глава 7 В этой книге добавлено немного информации, отсутствующей в Advanced Windows Debugging; однако, это не дает такого хорошего обзора.

0 голосов
/ 23 декабря 2008

Хорошим и актуальным справочником по этой теме является книга Джеффри Рихтера под названием Windows Via C / C ++, вам следует обратиться к главе 13 «Архитектура памяти Windows».

0 голосов
/ 22 декабря 2008

Существует такая вещь, как «Виртуальная память». Это довольно не специфичная для ОС концепция в информатике. Microsoft также написала о реализации Windows.

Короче говоря, в Windows вы можете попросить зарезервировать часть памяти, фактически не выделяя физической памяти. Это как зарезервировать некоторые адреса памяти для будущего использования. Когда вам действительно нужна память, вы выделяете ее физически (она же «коммит»).

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

0 голосов
/ 22 декабря 2008

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

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

0 голосов
/ 22 декабря 2008

Мне кажется, что у вас есть сборщик мусора, который включается только после того, как давление памяти достигнет 1/3 (1 ГБ из 3 ГБ).

Что касается VB - не волнуйтесь! Это виртуально! Честно говоря, ничего не выделено, ничего не совершено. Сосредоточьтесь на ваших личных байтах - ваших реальных распределениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...