¿Hay alguna forma de forzar que el WorkingSet de un proceso sea de 1GB en C ++?

Si utilizo la siguiente llamada en C ++, esperaría que el WorkingSet del proceso nunca caiga por debajo de 100MB.

Sin embargo, el sistema operativo aún recorta el conjunto de trabajo a 16 MB, incluso si hago esta llamada.

Establecer WorkingSet en 100MB conduciría a un aumento dramático en la velocidad de mi aplicación, al eliminar las fallas de página de página suave (vea el diagrama a continuación).

¿Qué estoy haciendo mal?

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.

(extra para expertos) Metodologia experimental

Escribí un proyecto de prueba en C ++ para asignar 100 MB de datos para llevar el WorkingSet a más de 100 MB (como se ve en Process Explorer), y luego desasigné esa memoria. Sin embargo, el sistema operativo recortó el WorkingSet de nuevo a 16MB tan pronto como desasigné esa memoria. Puedo proporcionar el proyecto de prueba de C ++ que utilicé si lo desea.

¿Por qué Windows proporciona una llamada a SetProcessWorkingSetSizeEx () si no parece funcionar? Debo estar haciendo algo mal.

El diagrama a continuación muestra el aumento dramático en el número de fallas de páginas suaves (los picos rojos) cuando la línea verde (el conjunto de trabajo) cayó de 50 MB a 30 MB.

Actualizar

Al final, terminamos ignorando el problema, ya que no afectó mucho el rendimiento.

Más importante aún, SetProcessWorkingSetSizeEx haceno controlar el actual WorkingSet, y esno Relacionado de alguna manera con los fallos de página. Todo lo que hace es evitar las fallas de la página, evitando que el WorkingSet actual se pagine en el disco duro.

En otras palabras, si uno quiere reducir las fallas de página suaves, SetProcessWorkingSetSizeEx no tiene absolutamente ningún efecto, ya que se refiere a fallas de páginas duras.

Hay una gran reseña en "Windows a través de C / C ++" (Richter) que explica cómo Windows se ocupa de la memoria.

Respuestas a la pregunta(1)

Su respuesta a la pregunta