Почему доступна физическая память (dwAvailPhys)> Доступная виртуальная память (dwAvailVirtual) при вызове GlobalMemoryStatus в Windows Vista x64 - PullRequest
2 голосов
/ 17 марта 2010

Я играю с образцом MSDN, чтобы провести стресс-тестирование памяти (см .: http://msdn.microsoft.com/en-us/magazine/cc163613.aspx) и расширение этого инструмента, специально предназначенного для потребления физической памяти (см. http://www.donationcoder.com/Forums/bb/index.php?topic=14895.0;prev_next=next).). Различия между виртуальной и физической памятью. Я думал, что каждый процесс имеет 2 ГБ виртуальной памяти (хотя я также считал 1,5 ГБ из-за «накладных расходов». Насколько я понимаю, некоторые / все / никакие из этой виртуальной памяти могут быть физической памятью, объем физической памяти, используемой процессом, может со временем меняться (память может быть выгружена на диск и т. д.). Далее я подумал, что, в общем случае, когда вы выделяете память, операционная система может использовать физическую память или виртуальную память. Я пришел к выводу, что dwAvailVirtual всегда должен быть равен или больше, чем dwAvailPhys в вызове GlobalMemoryStatus. Однако я часто (всегда?) Вижу обратное. Чего мне не хватает.

Я заранее прошу прощения, если мой вопрос не был правильно сформулирован. Я все еще пытаюсь разобраться во всей системе управления памятью в Windows. Учебные пособия / Пояснения / Книжные рекорды приветствуются!

Andrew

Ответы [ 3 ]

2 голосов
/ 17 марта 2010

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

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

Больше оперативной памяти означает меньший доступ к диску. Существует очень мало причин не использовать 3 или 4 ГБ оперативной памяти в 32-разрядной операционной системе, это дешево. Даже если вам не удастся использовать все 4 ГБ, не все они будут адресуемыми из-за аппаратных устройств, занимающих место на адресной шине (в основном видео). Но это не изменит размер виртуальной памяти, доступной для пользовательского кода, он по-прежнему составляет 2 гигабайта.

Windows Internals - хорошая книга.

1 голос
/ 17 марта 2010

Объем виртуальной памяти ограничен размером адресного пространства - 4 ГБ на процесс в 32-разрядной системе. И вы должны вычесть из этого размер областей, зарезервированных для использования системой, и количество виртуальных машин, уже используемых вашим процессом (включая все библиотеки, сопоставленные с его адресным пространством).

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

Это означает, что если у вас больше ~ 2 ГБ или ОЗУ, вы не можете использовать всю физическую память в одном процессе (так как недостаточно виртуальной памяти, чтобы отобразить ее), но она может использоваться многими процессами , Обратите внимание, что это ограничение снято в 64-битной системе.

1 голос
/ 17 марта 2010

Я не знаю, является ли это вашей проблемой, но страница MSDN для функции GlobalMemoryStatus содержит следующее предупреждение:

На компьютерах с более чем 4 ГБпамяти, функция GlobalMemoryStatus может возвращать неверную информацию, сообщая значение –1, чтобы указать переполнение.По этой причине приложения должны использовать вместо этого функцию GlobalMemoryStatusEx .

Кроме того, на этой странице написано:

В IntelНа компьютерах x86 с объемом памяти более 2 ГБ и менее 4 ГБ функция GlobalMemoryStatus всегда возвращает 2 ГБ в элементе dwTotalPhys структуры MEMORYSTATUS .Аналогичным образом, если общий объем доступной памяти составляет от 2 до 4 ГБ, элемент dwAvailPhys структуры MEMORYSTATUS будет округлен до 2 ГБ.Если исполняемый файл связан с помощью опции компоновщика / LARGEADDRESSAWARE , то функция GlobalMemoryStatus вернет правильный объем физической памяти в обоих членах.

, посколькувы имеете в виду членов типа dwAvailPhys вместо ullAvailPhys, похоже, вы используете структуру MEMORYSTATUS вместо MEMORYSTATUSEX.Я не знаю последствий этого на 64-битной платформе, но на 32-битной платформе, которая определенно может привести к неправильным объемам памяти.

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