Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RAM, virtuelle Adressierung, Auslagerungsdatei - reservieren (https://www.delphipraxis.net/93559-ram-virtuelle-adressierung-auslagerungsdatei-reservieren.html)

Puhbaehr 7. Jun 2007 13:11


RAM, virtuelle Adressierung, Auslagerungsdatei - reservieren
 
Hallo DPler,

ich kenne den Unterschied zwischen physischem RAM, dessen virtuellen Speicheradressierung und dem virtuellen Speicher - der Auslagerungsdatei.
Ich nahm bisher an, dass der Taskmanger unter "virtueller Speicher" mir den Speicherverbrauch der Auslagerungsdatei zeigt.
In einem Programm wollte ich reelen Speicher anfordern (hab mit LocalAlloc und dyn./stat. Arrays rumprobiert). Aber im Taskmanger wurde nicht wie erwartet unter der Spalte "Speichernutzung" ein erhöhter Bedarf festgestellt sondern stattdessen in der Spalte "virtueller Speicher".

D.h. meine Daten liegen nun in der Auslagerungsdatei? Wie kann man das richtig verstehen?

Der Speicheroptimierer von TuneUp zeigt auch die Speichernutzung des physischen Speichers. Laut diesem werden die dyn. und stat. Arrays im physischem Speicher abgelegt. Die Speicherreservierung von LocalAlloc verschwindet eindeutig in der Auslagerugnsdatei.

Mit welchen Funktionen kann man vernünftig und schnell Speicher reservieren der sich auch tatsächlich im RAM befindet? Ich benötige für das Programm mehrere kleinere Speicherblöcke in denen ich Dateien von der Festplatte einlesen kann. Die Daten sollen dabei möglichst schnell greifbar für den Prozessor liegen damit dieser später schnell auf die Daten zugreifen und allesamt hintereinander ausführen kann.
Laut PSDK ist LocalAlloc langsamer. Ich denke mir wegen der Auslagerung.
Laut DP lassen sich mit VirtualAlloc nur größere Speicherbereiche reservieren und damit nicht allzuviele.

Andersrum: Gibt es auch Funktionen mit denen ich explizit festlegen kann "bitte in der Auslagerungsdatei reservieren". Ich möchte "unwichtige" Sachen wie Benutzereinstellungen nicht in den knappen RAM ablegen.

In einigen Beiträgen hab ich über Delphi-Funktionen wie GetMem gelesen die aber bei erst wieder mit dem Beenden des Programmes für Windows freigegeben werden. Da wurde auf die Windows-Funktionen (VirtualAlloc, LocalAlloc) hin verwiesen.

Ich wäre für ein paar Tipps dankbar.

Gruß,
Robert

EDIT: Ich werde auf VirtualAlloc zurückgreifen und in einem großen Speicherbereich mehrere Dateien ablegen und einfach auf die Blöcke referenzieren. Mal schauen ob das was wird.

OregonGhost 7. Jun 2007 13:53

Re: RAM, virtuelle Adressierung, Auslagerungsdatei - reservi
 
Vielleicht solltest du dich einfach gar nicht um diese Probleme kümmern? Ich meine, das Betriebssystem kriegt schon halbwegs mit, wenn Speicherbereiche wenig oder gar nicht benutzt werden und lagert sie aus, und umgekehrt. Nutzt du einen bestimmten Speicherbereich häufig, wird er auch nicht ausgelagert im Normalfall. Ich sehe ehrlich gesagt nicht viel Nutzen darin, Windows diese Arbeit abzunehmen, wenn du nicht gerade einen Treiber programmierst (da hat man ja noch ein paar andere Möglichkeiten). Wenn du wirkliclh Speicher sparen willst, dann lade die Daten doch erst bei Bedarf in den Speicher und lösche sie anschließend wieder.
Außerdem:
Zitat:

Zitat von Windows SDK
Note The local functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions.

Ich habe zurzeit keinen XP-Taskmanager im Zugriff (im Vista-Taskmanager heißen die Spalten alle anders), aber ich meine mich erinnern zu können, dass unter "Virtueller Speicher" die gesamte Speichernutzung des Programms angegeben wird, also physikalischer und ausgelagerter zusammen.

Edit roter Kasten: Ich poste trotzdem mal, mit dieser Ergänzung:
Dokumentation zu VirtualAlloc:
Zitat:

The VirtualAlloc function reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, unless MEM_RESET is specified.
Virtueller Adressraum heißt nicht unbedingt ausgelagerter Speicher.

Luckie 7. Jun 2007 14:22

Re: RAM, virtuelle Adressierung, Auslagerungsdatei - reservi
 
Der virtuelle Speicher ist der Adressraum deines Prozesses. Jeder Prozess hat 4 GB (2 GB für den Prozess nutzbar) an Adressraum zur Verfügung. Dies ergibt sich aus der Breite des Adressbusses von 32-Bit. Da aber der Hauptspeicher kleiner ist, werden die 4 GB virtuell abgebildet. Und erst wenn der tatsächliche Zugriff erfolgt, wird der Inhalt an den benötigten Adressen physisch der CPU um Hauptspeicher zur Verfügung gestellt.

Puhbaehr 7. Jun 2007 15:02

Re: RAM, virtuelle Adressierung, Auslagerungsdatei - reservi
 
Nunja, mit VirtualAlloc bin ich weiter. VirtualAlloc reserviert tatsächlich Speicher im RAM. Ich hatte ganz zu Anfangs bei meiner Suche diese Funktion im Blick. Hab mich aber durch den irreführenden Funktions-Namen davon abbringen lassen ohne mir den Text vorher durchzulesen. Denn die Auslagerungsdatei ist nunmal als virtueller Arbeitsspeicher bekannt.
Nun hab ich hier noch Probleme größere Adressräume zu reservieren. Aber das ist ein anderes Problem.

---

zu Luckie:

Dass die virtuelle Adressierung für jeden Prozess gilt und es Begrenzungen wegen der 32-Bit gibt war mir soweit bekannt. Ich dachte nur, dass im Taskmanager ersichtlich ist welche Art von Speicher ein Prozess benutzt.
Jetzt wo du es sagst ist dann wohl "virtueller Speicher" die angeforderte Speicherreservierung eines Prozesses und "Speichernutzung" die tatsächliche Nutzung.

Findet man noch irgendwo gute Dokus zum Thema Speicher und deren Verwaltung? Mich interessiert im Moment ob die virtuelle Adressierung durch die 64-Bit-Systeme irgendwann wieder außer Kraft gesetzt wird da ja mit 64-Bit nun genügend Speicher adressiert werden kann.

Vielen Dank soweit.

Luckie 7. Jun 2007 15:10

Re: RAM, virtuelle Adressierung, Auslagerungsdatei - reservi
 
Zitat:

Zitat von Puhbaehr
Mich interessiert im Moment ob die virtuelle Adressierung durch die 64-Bit-Systeme irgendwann wieder außer Kraft gesetzt wird da ja mit 64-Bit nun genügend Speicher adressiert werden kann.

Eher im Gegenteil. Jetzt kann der Adressraum noch größer sein, aber man hat trotzdem nur 1 bis 2 GB Haupptspeicher. Das Konzept der virtuellen Speichers wird es wohl so lange geben, wie es PC geben wird oder so lange es noch keine 100 GB Hauptspeicher gibt. ;)

OregonGhost 7. Jun 2007 15:11

Re: RAM, virtuelle Adressierung, Auslagerungsdatei - reservi
 
Zitat:

VirtualAlloc reserviert tatsächlich Speicher im RAM.
Dir ist hoffentlich klar, dass der mit VirtualAlloc reservierte Speicher jederzeit ausgelagert werden kann.
Zitat:

Denn die Auslagerungsdatei ist nunmal als virtueller Arbeitsspeicher bekannt.
Hmm, nö. Mir nicht.
Zitat:

Mich interessiert im Moment ob die virtuelle Adressierung durch die 64-Bit-Systeme irgendwann wieder außer Kraft gesetzt wird da ja mit 64-Bit nun genügend Speicher adressiert werden kann.
Dir scheint das alles noch nicht ganz klar zu sein. Auf einem 64-Bit-System geht es erst recht nicht ohne die virtuelle Adressierung. Nichtmal, wenn du das von Win64 ermöglichte Maximum an RAM erreicht hast, denn das ist immer noch viel weniger als man mit 64 Bit adressieren könnte. Anders gesagt, auch wenn du auf Win64 nur 1GB RAM hast, kann dir das System 4GB reservieren. Dass der Großteil davon in der Auslagerungsdatei liegt, ist an dieser Stelle nicht dein Problem und genau genommen erfährst du das im Normalfall gar nicht. Der Zugriff ist völlig transparent, weil du eine virtuelle Adresse benutzt, um darauf zuzugreifen und keine physikalische.
Lass Windows diese ganze Speichergeschichte erledigen. Wenn du nicht wirklich einen guten Grund (und die nötigen Kenntnisse) hast, da einzugreifen, und den sehe ich bei dir nicht, solltest du es dabei belassen. Spiel mit Windows zusammen und nicht dagegen.

Hmpf, pöser Luckie, sein roter Kasten war schneller als ich :mrgreen:

sirius 7. Jun 2007 17:28

Re: RAM, virtuelle Adressierung, Auslagerungsdatei - reservi
 
Zitat:

Zitat von ORegonGhost
wenn du das von Win64 ermöglichte Maximum an RAM erreicht hast

Und selbst wenn, dann starte ich einfach einen weiteren Prozess und schon bin ich wieder drüber :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz