Почему заблокированные страницы не учитываются в размере рабочего набора? - PullRequest
4 голосов
/ 13 апреля 2011

Цель вызова WinAPI VirtualLock - заблокировать страницы в рабочем наборе процесса. Однако API WorkingSet64 необъяснимым образом не считает эти страницы.

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

Что случилось с этим? Может ли кто-то, хорошо знакомый с виртуальной памятью в WinNT, пролить свет на это несоответствие, которое может привести к тому, что гигабайты используемой оперативной памяти останутся практически незамеченными? (подумайте о SQL Server или VirtualBox)

1 Ответ

3 голосов
/ 14 апреля 2011

Ах, это легко объяснить: вы используете неправильный API.GetProcessWorkingSetSize запрашивает минимальный и максимальный размеры рабочего набора.Это квоты , а не фактические значения.

Минимальный размер рабочего набора - это то, что Windows гарантирует для сохранения в ОЗУ до тех пор, пока мир не закончится.Максимальный размер рабочего набора - это объем памяти, который Windows разрешит вашему процессу до того, как страницы будут перемещены в пул (они не обязательно удалены, но доступ к ним вызывает ошибку и повторное отображение).

Вы хотите GetProcessMemoryInfo

РЕДАКТИРОВАТЬ :
Так как теперь ясно, что вы не использовали неправильный API (только назвал неправильную функцию)Я провел некоторое тестирование (VirtualAlloc и файлы с отображением в памяти, оба в сочетании с VirtualLock) в моей системе XP.На первый взгляд, выглядело, как будто вы совершенно правы.Выделение 512 МБ или отображение памяти 512 МБ из файла 650 МБ добавили 512 МБ к виртуальному размеру, но не увеличили рабочий набор.Следование VirtualLock(512MB) никак не повлияло на рабочий набор!

Тогда мне пришло в голову, что VirtualLock занимает ровно ноль времени в каждом случае, что не представляется правдоподобным, например, для того, чтобы получить половинугигабайт с диска.Итак, я проверил код возврата и угадаю, что.Windows не считает блокировку 512 МБ хорошей идеей и откажется это делать.

Повторил эксперимент только с 64 МБ, и вот, рабочий набор сразу увеличился на 64 МБ, как и должно быть.Итак, одним словом: «работает для меня».

Просто чтобы быть уверенным, вы проверяли код возврата?

На второй взгляд, это поведение даже хорошо определено и хорошо-documented.Документы на VirtualLock явно указывают:

Максимальное количество страниц, которые может заблокировать процесс, равно числу страниц в его минимальном рабочем наборе за вычетом небольших накладных расходов.

С блокировкой и без нее после соответствующей установки квот WS:

VirtualBox - это другое дело, то, что вы видите в диспетчере задач, - это только рабочий набор программы "Интерфейс" иИнтерфейс «Менеджер», оба из которых всегда поддерживают размеры рабочих наборов ниже 64M.Хотя я не уверен, какая память может быть выделена в некоторых драйверах, или они вообще блокируют память.

В настоящее время я использую 2 виртуальные машины с 1,6 ГБ основной памяти каждая.Видя, как моя 32-битная Windows видит только 3,25 ГБ, осталось бы всего 50 МБ, если память, принадлежащая виртуальным машинам, заблокирована.Кроме того, Process Explorer сообщает мне, что только у Firefox есть рабочий набор 474 МБ и он увеличивается, пока я набираю это (святой ...? !!).Это не делает вероятным, что вся память в виртуальных машинах действительно заблокирована, потому что тогда такие цифры были бы совершенно невозможны.

По запросу, вот снимок VMMap: enter image description here

Цифры, по общему признанию, смешные ... Всего у виртуальной машины 1,6M, из которых согласно VMMap зарезервировано 821MiB и выделено 772MiB, Process Explorer показывает только 163MiB и 54MiB соответственно.Там что-то определенно подозрительно, но я подозреваю, что это, скорее всего, какая-то неясная попытка взлома VirtualBox, а не проблема Windows.

...