Raymond Chen antwortet direkt in einem späteren Beitrag auf seinem Blog The Old New Thing (Maximus Minimius hatte die richtige Quelle, es stellt sich heraus, dass es nur 3 Jahre zu früh für eine direkte Erklärung ist): https://blogs.msdn.microsoft.com/oldnewthing / 20151111-00 /? P = 91972
Dieser Code greift in einem ungewöhnlichen Muster auf den durch die Parameter ptr und size angegebenen Speicherblock zu: Er liest Byte Null, dann das Byte mit einem Versatz von 16 Seiten, dann das Byte Eins und dann ein Byte mit einem Versatz von 16 Seiten plus eins und so weiter, abwechselnd zwischen einem Byte und seinem Gegenstück 16 Seiten voraus.
Dieses spezielle Zugriffsmuster in Windows 95 besiegte den Erkennungsalgorithmus "Sequential Memory Scan".
Denken Sie daran, dass Computer in der Windows 95-Ära 4 MB RAM hatten. Angenommen, Sie haben lange in einem Dokument gearbeitet. Schließlich sind Sie fertig und schließen das Fenster oder minimieren es. Boom, jetzt ist Ihr Desktop sichtbar und die Hintergrund-Bitmap muss eingelagert werden. Wenn Ihr Bildschirm 1024 × 768 mit 16 Bit pro Pixel ist, entspricht dies 1,5 MB Speicher. Das Blättern in 1,5 MB Speicher bedeutet, dass für die Bitmap 1,5 MB Speicher ausgegeben werden, der für andere Dinge verwendet wird, und das ist viel Speicher für einen Computer, auf dem nur 4 MB zu arbeiten sind (zumal ein Großteil dieser 4 MB zu Sachen gehört) das kann nicht ausgelagert werden). Das Phänomen, das wir gesehen haben, war, dass das Neulackieren Ihres Desktops den größten Teil Ihres Speichers leeren würde.
Und als nächstes starten Sie wahrscheinlich eine neue Anwendung, die das Hintergrundbild abdeckt, sodass der Hintergrundbildspeicher nicht mehr benötigt wird. Wir haben also im Grunde den gesamten Speicher in Ihrem System gelöscht, um einen riesigen Speicherblock zu verarbeiten, auf den nur einmal zugegriffen wurde.
Der Trick, den Windows 95 verwendete, bestand darin, Ihr Muster von Seitenfehlern zu beobachten. Wenn festgestellt wurde, dass Sie einen sequentiellen Speicherzugriff ausführen, wurde der Speicher 16 Seiten hinter dem aktuellen Zugriff als nicht kürzlich aufgerufen markiert . Bei einem geraden sequentiellen Scan bedeutet dies, dass der gesamte Puffer unabhängig von der Puffergröße ein 64-KB-Speicherfenster durchläuft. Mit diesem Trick verbraucht ein 4-MB-Puffer nur 64 KB Speicher, anstatt den gesamten Speicher in Ihrem System zu verwenden.
Die Sys_PageIn
Funktion besiegt speziell den Sequential-Scan-Detektor, indem sie absichtlich 16 Seiten zurückblättert und erneut auf die Seite zugreift. Dies führt dazu, dass es als kürzlich verwendet markiert wird , was dem nicht kürzlich verwendeten Markieren entgegenwirkt , das der Sequential-Scan-Detektor durchgeführt hat. Ergebnis: Die Speicherseiten sind alle als kürzlich verwendet markiert und sind keine Hauptkandidaten mehr für das Auslagern.