Есть ли способ заставить рабочий набор процесса быть 1 ГБ в C ++?
Если бы я использовал следующий вызов в C ++, я бы ожидал, что рабочий набор процесса никогда не упадет ниже 100 МБ.
Однако операционная система по-прежнему обрезает рабочий набор до 16 МБ, даже если я сделаю этот вызов.
Установка WorkingSet на 100 МБ приведет к резкому увеличению скорости моего приложения за счет устранения сбоев страниц программных страниц (см. Диаграмму ниже).
Что я делаю неправильно?
SIZE_T workingSetSizeMB = 100;
int errorCode = SetProcessWorkingSetSizeEx(
GetCurrentProcess(),
(workingSetSizeMB - 1) * 1024 * 1024), // dwMinimumWorkingSetSize
workingSetSizeMB * 1024 * 1024, // dwMaximumWorkingSetSize,
QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE
);
// errorCode returns 1, so the call worked.
(дополнительно для экспертов) Экспериментальная методология
Я написал тестовый проект на C ++, чтобы выделить 100 МБ данных для переноса WorkingSet более 100 МБ (как показано в Process Explorer), а затем освободил эту память. Однако операционная система вернула рабочий набор обратно до 16 МБ, как только я освободил эту память. Я могу предоставить тестовый проект C ++, который я использовал, если хотите.
Почему Windows обеспечивает вызов SetProcessWorkingSetSizeEx (), если он не работает? Я должен делать что-то не так.
На диаграмме ниже показано резкое увеличение количества ошибок программных страниц (красные пики), когда зеленая линия (рабочий набор) упала с 50 МБ до 30 МБ.
Обновить
В итоге мы проигнорировали проблему, так как она не сильно повлияла на производительность.
Что еще более важно, SetProcessWorkingSetSizeEx делаетне контролировать текущий рабочий набор ине каким-либо образом связаны с ошибками мягкой страницы. Все, что он делает - это предотвращает сбои страниц, предотвращая перенос текущего рабочего набора на жесткий диск.
Другими словами, если кто-то хочет уменьшить программные сбои страниц, SetProcessWorkingSetSizeEx не имеет абсолютно никакого эффекта, поскольку это относится к жестким сбоям страниц.
В «Windows via C / C ++» (Рихтер) есть отличная рецензия, в которой Windows обращается с памятью.