Erstens ist die Menge an RAM, die eingespart werden muss, überraschend gering. Tatsächlich muss nur der Satz zugeordneter unsauberer Seiten ("Lazy Writeback") gelöscht werden, und alle privaten Seiten, die in ausführbaren Code geschrieben und an einen anderen Ort verschoben wurden, müssen geschrieben werden.
- Die .text-Segmente von ausführbaren Dateien werden immer durch eine Dateizuordnung gesichert. Dies gilt zumindest auch für einige DLLs (aber nicht für alle, hängt davon ab, ob sie verschoben werden müssen).
- Speicher, der auf ähnliche Weise durch Dateizuordnungen gesichert ist, kann verworfen werden (vorausgesetzt, er ist nicht CoW oder RW und verschmutzt).
- Lazy Writeback muss weiterhin durchgeführt werden, aber ansonsten können Caches verworfen werden.
- Speicher, der reserviert, aber nicht beschrieben wurde (normalerweise der größte Teil der Anwendungsdaten!), Wird durch die Nullseite gesichert und kann verworfen werden.
- Der größte Teil der Speicherseiten, die sich im "Standby" -Status befinden (der tatsächliche prozessspezifische Arbeitsspeicher unter Windows ist überraschend klein, nur 16 MB), wurde irgendwann in die Auslagerungsdatei im Hintergrund kopiert und kann verworfen werden .
- Speicherbereiche, die von bestimmten Geräten wie der Grafikkarte zugeordnet wurden, müssen (möglicherweise) nicht gespeichert werden. Benutzer sind manchmal überrascht, dass sie 8GiB oder 16GiB an einen Computer anschließen und 1GiB oder 2GiB ohne ersichtlichen Grund einfach "weg" sind. Die wichtigsten Grafik-APIs setzen voraus, dass Anwendungen in der Lage sind, Pufferinhalte "unter bestimmten Umständen" ungültig zu machen (ohne genau zu sagen, was dies bedeutet). Es ist daher nicht unangemessen zu erwarten, dass der vom Grafiktreiber festgelegte Speicher ebenfalls einfach verworfen wird. Immerhin wird der Bildschirm sowieso dunkel.
Zweitens, im Gegensatz zum Kopieren einer Datei, besteht das Speichern der zu speichernden RAM-Seiten aus einem einzelnen sequentiellen, zusammenhängenden Schreibvorgang aus Sicht des Laufwerks. Die Win32-API stellt für diesen Vorgang sogar eine Funktion auf Benutzerebene zur Verfügung. Gather Write wird direkt von der Hardware unterstützt und arbeitet so schnell, wie die Festplatte Daten physisch aufnehmen kann (der Controller ruft Daten direkt über DMA ab).
Es gibt eine Reihe von Voraussetzungen dafür (wie Ausrichtung, Blockgröße, Fixieren), und es spielt keine Rolle beim Zwischenspeichern, und es gibt kein "Lazy Writeback" (was im Normalbetrieb eine sehr wünschenswerte Optimierung ist) ).
Das ist der Grund, warum nicht jeder schreibtfunktioniert die ganze Zeit so. Wenn das System jedoch die Ruhezustandsdatei speichert, sind alle Voraussetzungen automatisch erfüllt (alle Daten sind seitenausgerichtet, seitengroß und gepinnt), und das Zwischenspeichern ist gerade irrelevant geworden, weil der Computer in einem Moment ausgeschaltet wird.
Drittens ist das Ausführen eines einzelnen zusammenhängenden Schreibvorgangs sowohl für rotierende als auch für Solid-State-Festplatten sehr vorteilhaft .
Die Auslagerungsdatei und die Ruhezustandsdatei gehören normalerweise zu den frühesten Dateien, die auf der Festplatte erstellt und reserviert wurden. Sie haben normalerweise ein, höchstens zwei Fragmente. Sofern also keine Sektoren beschädigt sind und die Festplatte physische Sektoren neu zuordnen muss, wird ein logischer sequentieller Schreibvorgang in einen physischen sequentiellen Schreibvorgang auf einer sich drehenden Festplatte umgewandelt.
Es sind keine Lese-, Änderungs- und Schreibvorgänge auf der Festplatte erforderlich, wenn eine große Menge aufeinanderfolgender, zusammenhängender Daten geschrieben wird. Dieses Problem ist auf sich drehenden Festplatten weniger ausgeprägt, die einzelne Sektoren schreiben können, die recht klein sind. (Vorausgesetzt, Sie schreiben keine einzelnen Bytes, was in der Regel durch Caching verhindert wird, muss das Gerät den ursprünglichen Inhalt nicht abrufen und die geänderte Version zurückschreiben.) .
Dies ist jedoch auf SSD sehr auffällig, da bei jedem Schreibvorgang z. B. ein 512-KB-Block (das ist eine übliche Zahl, die jedoch größer sein kann) vom Controller gelesen, geändert und auf einen anderen zurückgeschrieben werden muss Block. Du kannst zwar prinzipiell schreiben (aber nicht überschreiben) kleinere Einheiten auf Flash-Disks, man kann immer nur riesige Blöcke löschen, so funktioniert die Hardware. Dies ist der Grund, warum SSDs bei großen sequenziellen Schreibvorgängen so viel besser abschneiden.