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