Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#8

AW: Systemtreiber debuggen, geht das?

  Alt 7. Aug 2020, 18:24
Mit hab ich jetzt nur die 8 Jahre alte EXE und der Rest liegt (hoffentlich) irgendwo daheim in den Archiven, aber über VirtualAlloc wird man dazu auch was finden können.

Bei sowas muß man aufpassen, denn wenn für das System kein physischer RAM zur Verfügung ist, dann kann es auch komplett hängen bleiben.
Hier ist das einfach nur die Minimalversion von den "angeblichen" RAM-Optimieren.
Windows wird dazu gezwungen allen Speicher auszulagern (MMFs entladen, Programmspeicher in die Auslagerungsdatei und den FileCache leer),
wobei Letzteres zu Testzwecken und für gewisse größere Operationen die eigentliche Funktion dieses Progrämmchens ist.

Für aktive Programme wäre aber physischer Speicher, ein großes WorkingSet und hohe Prozesspriorität meistens nicht Ideeal, für das GesamtSystem.
Ausnahmen sind z.B. der TaskManager oder Sicherheitsfunktionen, wie der Kern des VirenScanners.
Ich würde mir wünschen Windows würde das für den Task-Manager von sich aus standardmäßig so machen, denn nichts nervt mehr, wenn irgendwas ist und man nichts machen kann, weil der Taskmanager ewig garnicht reagiert.

Aber auch für Passwörter/Verschlüsselung könnte man das nutzen, damit sie nicht in der Auslagerungsdatei / auf der Festplatte landen können.
Man kann zwar Windows beim Beenden sagen dass es diese Datei "sicher" löschen soll
und während des Betriebs kann man (eigentlich) nicht auf diese Datei zugreifen,
aber wenn man die Programme zum Auslagern zwingt und dann den Strom abzieht (harter Reset), dann ......

TMemoryStream + Delphi-Referenz durchsuchenTZCompressionStream
oder direkt ein TStream nachfahre, wo man eine den MemoryStream mit einer Block-Komprimierung verknubbelt.

Wie gesagt, inzwischen macht Windows das auch von sich aus (auf Heim-Windows-Versionen standardmäßig seit 2015 aktiv)
Leider wird das mehr an Leistung durch anderen Mist wieder sinnlos vernichtet.
z.B. wird seit einer Weile bei Systemstart (eigentlich bei Start/Neustart der explorer.exe) der blöde Edge gestartet, damit er bei ersten Benutzen schneller da ist. (selbst wenn man diesen Mist garnicht benutzt)
Und auch andere Programme (MS Office und andere Hersteller) machen so einen Scheiß.

Selbst im RAM zu komprimieren bringt also aktuell kaum einen Vorteil.
Falls man Angst hat, dass die Auslagerungsdatei voll wird und nicht reicht, kann man selbst Speicher gegen eine eigene Datei mappen. (MMF)
Oder einen FileStream THandleStream mit CreateFile + FILE_ATTRIBUTE_TEMPORARY verwenden.
Zusätzlich eventuell noch FILE_FLAG_RANDOM_ACCESS oder FILE_FLAG_SEQUENTIAL_SCAN. (auch wenn ich leider hier im Windows seit Jahren keine merkliche Wirkung erkennen kann )

Wer sehr sehr viele Daten rumschaufeln muß, aber den RAM und WindowsFileCache nicht vollmüllen will (Programme nicht zum Auslagern zwingen),
der nutzt eben CreateFile mit FILE_FLAG_NO_BUFFERING und FILE_FLAG_WRITE_THROUGH.
Denn auch wenn man Windows sagt, dass Programme bevorzugt werden sollen (standardmäßig wird der FileCache bevorzugt), werden dennoch zuerst Programme ausgelagert, bevor Windows den Cache leert.
Man kopiere einfach mal paar 100 GB/TB umher.
Besonders krank fand ich grade eben erst, dass FTP über den Explorer durch den Cache des Internet Explorers rauscht.
Obwohl dort 330 MB als Grenze drin stehen, war gestern plötzlich mein SSD übervoll, nur weil ich paar Aufnahmen von meiner VU+ ins NAS verschieben wollte ... und dieser Cache erst ganz am Ende der "gesamten" Kopieroperation nach paar Minuten freigegeben wird.
Das erklärt dann auch, warum der Explorer manchmal "alte" Dateien kopiert, selbst wenn die auf dem FTP inzwischen aktualisiert wurden.



PowerShell (Administrator) :
Code:
Get-MMAgent
Enable-MMAgent -mc
Disable-MMAgent -mc
https://docs.microsoft.com/en-us/pow...?view=win10-ps

Nja, bisslang gab es den Arbeitsspeicher und die Auslagerungsdatei
und nun dazwischen auch noch die Speicherkomprimierung,
wo Windows den virtuellen Arbeitsspeicher und die MMFs (z.B. den gemappten Code und die Ressourcen der EXE) drin verteilt.
* es wird nicht sofort ausgelagert (erstmal nur komprimiert und so Speicher gespart)
* und beim Auslagern und zurückholen geht es auch schneller, wenn dort das komprimierte gespeichert wird ... weil ja weniger Daten zum, vom und auf dem Datenträger.
Task-Manager > Leistung > Arbeistspeicher > In Verwendung (komprimiert)
Task-Manager > Performance > Memory > In use (Compressed)

Dann gibt es noch Superfetch (im XE der Vorgänger Prefetch), was "oft" genutzte Dateien schon vorläd, damit bei Nutzung es schneller geht.

In jedem Programm gibt es auch einen Teil, die nie ausgelagert wird (WorkingSet).
https://docs.microsoft.com/en-us/sys...loads/cacheset

Und es gibt die Möglichkeiten im physischen RAM etwas Speicher zu reservieren und in den virtuellen Speicher des Programms zu mappen.

Bei Memory-Mappes-Files wird eine Datei in den virtuellen Speicher gemappt.
Wenn möglich lieg der Speicher im RAM (FileCache) oder eben nur in der Datei, wenn noch nicht zugegriffen wurde oder ausgelagert werden musste.
Schreibzugriffe werden dann vom Windows über den FileCache in die Datei weitergeleitet.

Dann kann man im NTFS die HDD/Dateien und sogar Systemdateien komprimieren.
Das ist dan ähnlich einer SpraseFile, da wird blockweise Komprimiert und ungenutzte Teile werden ausgeschnitten (nicht gepseichert).
PS: Die NTFS-Verschlüsselung arbeitet ähnlich, drum kann man das und nicht gleichzeitig verwenden.
Angehängte Dateien
Dateityp: zip ClearRAM.zip (198,7 KB, 5x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Aug 2020 um 18:39 Uhr)
  Mit Zitat antworten Zitat