Ist es möglich, Windows anzudeuten, einen Prozess komplett aus dem Swap zu holen

13

Ist es möglich, den Windows Virtual-Memory-Manager anzudeuten, einen bestimmten Prozess aus dem Swap zu holen?

Die Situation, in der ich mich oft befinde, beansprucht normalerweise etwa 50% meines Arbeitsspeichers für alle normalen Programme, insbesondere für eine IDE für ein eingebettetes Ziel und den zugehörigen Debugger.

Dann lasse ich einen speicherhungrigen Prozess laufen - z. B. Wireshark oder etwas, das über ein Wochenende Daten sammelt, alles wird ausgetauscht - wie sie sollten. Nachdem der große Prozess abgeschlossen ist, werden die meisten Prozesse im Swap belassen.

Dann pausiert das Sporadische, um den Prozess zurückzuspielen, was zu Problemen mit dem Debugger führen kann, vermutlich aufgrund von Timing-Problemen in der Kommunikation zwischen IDE und dem Hardware-Debugger. Die Steuerung des Zielgeräts kann daher sporadisch erfolgen, bis genügend Versuche die Debug-Daten in der IDE wieder aus dem Swap-Speicher entfernt haben.

Greg
quelle
Das wäre sehr nützlich! Aus Sicht der Benutzer ist es ärgerlich, nach jedem Klick oder jeder Benutzeraktion auf den ausgelagerten Prozess zu warten. Es wäre viel besser zu sagen: "Tauschen Sie diesen Prozess aus!" Gehen Sie auf einen Kaffee und kehren Sie zu einem reaktionsfähigen System zurück!
Tomas
Ich kenne die Besonderheiten des Auslagerungsprozesses von Windows nicht, aber ist dies etwas, das Sie suchen? In den Kommentaren sollte sich ein funktionierendes Binärbeispiel befinden.
Rik
1
Ich hatte einmal eine ähnliche Frage und schrieb ein Programm, das auf den Antworten auf Stack Overflow basierte.
Kerrek SB
@Kerrek, ich habe versucht, Ihren Code unter MinGW zu kompilieren, und bei jedem Lesevorgang sind Fehler aufgetreten. "Fehler beim Lesen eines Bytes von 0x161000, Fehler 299 (0 gelesene Bytes)." Da ich nur Windows bei der Arbeit habe, war ich nicht mutig genug, die angehängte zufällige Binärdatei auszuführen, damit das Problem in meiner Zusammenstellung liegen könnte.
Greg
1
@KerrekSB, scheint ein kleines Problem zu sein. Vielleicht berühren Sie einen Speicherbereich, der nicht zugeordnet ist? Wie auch immer, ich denke, deine Antwort verdient das Kopfgeld :) PS: Das Auswechseln scheint im Vergleich zur Festplattengeschwindigkeit viel langsamer zu sein, als es sein könnte. Scheint, dass der Engpass woanders liegt, aber wo?
Tomas

Antworten:

1

KerrekSB hat dafür ein spezielles Tool entwickelt:

/programming//a/2940209/684229

Es ist auf GiTHUB mit Binärdateien verfügbar: https://github.com/louisdx/unpage

Während des Laufs erhalten Sie viele Fehler "Fehler beim Lesen eines Bytes von 0x .... 000, Fehler 299 (0 gelesene Bytes)", aber es ist kein Problem, das Tool funktioniert großartig.

Tomas
quelle
"aber es ist ein problem"? Ich denke nicht, dass es ein Problem ist.
Kerrek SB
Zitat: "Tool, das versucht, alle Anwendungen wieder in den physischen Speicher zu bekommen". Mit dem "speicherhungrigen Prozess" des Posters funktioniert dies möglicherweise nicht.
Harrymc
@harrymc Zitat aus der Frage: After the big process is finished, most processes are left in swap.. Vermutlich hat er den "gedächtnishungrigen Prozess" also schon beendet.
Rik
@KerrekSB natürlich, das war ein Tippfehler. Danke :-)
Tomas
@Tomas Ich fand diese . Mit meinen sehr begrenzten Kenntnissen in C ++ habe ich überprüft, dass die Seite bei jedem fehlgeschlagenen Zugriff tatsächlich durch das PAGE_GUARD-Bit geschützt ist. Ich habe if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }kurz vor der ReadProcessMemory-Linie verwendet. PAGE_GUARD ist 256 und ich habe 260 mit den fehlgeschlagenen Seiten. So ist es möglich, die Fehler loszuwerden. Jemand mit C ++ - und Paging-Kenntnissen muss das PAGE_GUARD-Bit nachlesen.
Rik
1

Sie können Process Lasso verwenden , um einem Prozess eine Speicherseitenpriorität zuzuweisen :

Beginnend mit Windows Vista hat jede Speicherseite eine Priorität von 0 bis 7. Die Standby-Liste ist in acht Listen unterteilt, die jeweils Seiten mit einer anderen Priorität behandeln. Wenn der Speichermanager eine Seite aus der Standby-Liste nehmen möchte, nimmt er zuerst Seiten aus den Listen mit niedriger Priorität. "

Process Lasso kann beim Verwalten von Speicherprioritäten helfen, indem es das Festlegen von Prioritäten für beständigen Speicher für Prozesse ermöglicht, sodass die Seiten des virtuellen Speichers bei jeder Ausführung auf eine bestimmte Priorität festgelegt werden.

Process Lasso hat zwei Versionen: kostenlos und kommerziell (18,95 USD mit Testversion).

Harrymc
quelle
Ich fürchte, Sie beantworten eine ganz andere Frage. Prozess Prozess einen Speicher gibt Priorität ist anders Aufgabe, wahrscheinlich nutzlos im Rahmen OP und ich skizzierte: Wenn Sie bereits einen Prozess haben, der in Swap ist und wollen es unswap. Sie wollen nicht verhindern, dass es tauscht.
Tomas
@Tomas: Das verstehe ich nicht. Die Anforderung besteht darin, zu verhindern, dass ein bestimmter Prozess ausgelagert wird. Wenn der Prozess selbst nicht so programmiert ist, dass seine Seiten im Speicher gesperrt werden, besteht die nächstbeste Lösung darin, ihm die höchste Speicherpriorität zuzuweisen, damit es weniger wahrscheinlich ist, dass er ausgelagert wird.
Harrymc
3
@harrymc, OP sagt, wenn das Gedächtnisschwein läuft, "wird alles ausgetauscht - wie sie sollten", so dass es das ist, was das OP will. Es ist nur so, dass er am Montagmorgen möchte, dass die Arbeitssets der wichtigen Prozesse auf einmal eingespielt werden, und nicht mit der Zeit durch Seitenfehler.
mgkrebbs
@mgkrebbs: Das ist eine andere Lösung für das Problem, die ich für unmöglich halte. Meine Lösung ist, dass, wenn die IDE nie ausgetauscht wird, keine Notwendigkeit besteht, sie wieder einzutauschen. Der "speicherhungrige Prozess" benötigt nur ein paar Megabyte weniger RAM, was die Leistung nicht allzu sehr beeinträchtigt.
Harrymc