Gibt es eine Möglichkeit, das WorkingSet eines Prozesses in C ++ auf 1 GB zu setzen?

Wenn ich den folgenden Aufruf in C ++ verwende, würde ich erwarten, dass das WorkingSet des Prozesses niemals unter 100 MB fällt.

Das Betriebssystem reduziert den Arbeitssatz jedoch immer noch auf 16 MB, selbst wenn ich diesen Anruf tätige.

Das Setzen von WorkingSet auf 100MB würde zu einer dramatischen Steigerung meiner Anwendungsgeschwindigkeit führen, indem Fehler bei Soft-Page-Seiten beseitigt werden (siehe Abbildung unten).

Was mache ich falsch?

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 für Experten) Experimentelle Methodik

Ich schrieb ein Test-C ++ - Projekt, um 100 MB Daten zuzuweisen, damit das WorkingSet über 100 MB groß wird (wie im Process Explorer angezeigt), und teilte dann diesen Speicher auf. Das Betriebssystem hat das WorkingSet jedoch auf 16 MB zurückgesetzt, sobald ich die Zuordnung dieses Speichers aufgehoben habe. Wenn Sie möchten, kann ich Ihnen das von mir verwendete Test-C ++ - Projekt zur Verfügung stellen.

Warum ruft Windows SetProcessWorkingSetSizeEx () auf, wenn es anscheinend nicht funktioniert? Ich muss etwas falsch machen.

Das folgende Diagramm zeigt den dramatischen Anstieg der Anzahl von Fehlern bei weichen Seiten (die roten Spitzen), wenn die grüne Linie (der Arbeitssatz) von 50 MB auf 30 MB abfiel.

Aktualisieren

Am Ende haben wir das Problem ignoriert, da es die Leistung nicht so sehr beeinträchtigte.

Noch wichtiger ist, dass SetProcessWorkingSetSizeEx dies tutnicht steuern Sie das aktuelle WorkingSet und istnicht in irgendeiner Weise auf weiche Seitenfehler bezogen. Es verhindert lediglich Hardpage-Fehler, indem verhindert wird, dass das aktuelle WorkingSet auf die Festplatte ausgelagert wird.

Mit anderen Worten, wenn man weiche Seitenfehler reduzieren möchte, hat SetProcessWorkingSetSizeEx absolut keine Auswirkung, da es sich um harte Seitenfehler handelt.

In "Windows via C / C ++" (Richter) gibt es eine großartige Beschreibung, wie Windows mit Speicher umgeht.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage