Hallo Markus,
Post by Markus SpringweilerPost by Hubert SeidelVon welchem Betriebssystem gehst Du denn aus?
(Man kann bestimmt auch Win95 laufen lassen ;-)
Wenn du mir, gemäß Überschrift, ein 64-bit-Win95 zukommen lassen kannst,
wäre das einen Versuch wert.
Wenn man (nach den neuesten Erklärungen davon absieht das
alles gleichzeitig im RAM sein muss) davon ausgehen dann
das MapViewOfFile bereits mit Win95 eingeführt wurde...
also so mal ganz theoretisch, müsste ja MapViewOfFile auch
unter Win95 funktionieren. Möglicherweise eben nicht wenn
es sich um eine lokale Datei auf einem eigngeschränkten
eigenen Win95-Dateisystem handelt, aber auf einem anderen
Rechner via Netzwerk und entsprechend großer Datei?
Post by Markus SpringweilerPost by Hubert SeidelEin 32-Bit-Prozess hat nur 32-Bit-Register und kann demnach
im auch nur max. 4GB linear, direkt ohne weitere Tricks ansprechen.
Das ist klar. Aber das umgebende 64-bit OS kann ja sicherlich etwas
mitdenken, so genug RAM zur Verfügung steht.
Ich vermute, eine Sache des File-Caches...
zudem ist es dann aber eben nicht sicher gestellt.
Außerdem könnte das Betriebssystem dazu angehalten sein, zu gunsten
der Datensicherheit und intigrität nicht benötigte Bereiche
"bei Langeweils" schnellstens wieder auf Platte zu schreiben...
Post by Markus SpringweilerDie Frage war eher, wie schlau sich die MemoryMappedFiles-API
anstellt,
Post by Markus Springweilerwenn man mit LARGEADDRESSAWARE arbeitet.
Wenn ich das richtig verstanden habe, dann wird damit gesteuert in wie
fern das Betriebssystem seine Teile im RAM der Applikation sichtbar hat.
(z.b. am der 2GB-, 3GB- oder ?4GB-Grenze?)
Und genau bei letzterem wird es Haarig.
Ich könnte mir vorstellen das zu gunsten der "kompletten?" 4GB
das Betriebssystem ja wissen muß wann z.b. eine Systemfunktion
oder ähnliches aufgerufen werden will!
Ode man kann die 4GB evtl. nur mit einem bestimmten
Segment-Register ansprechen?
Kann mir dazu gut das Segment-Register GS vorstellen.
Dieses wird meinen Erfahrungen nach nur selten wo genutzt.
Ich glaube im Delphi-Code habe ich das bisher noch nie gesehen.
Maximal CS, DS, ES und SS.
Post by Markus SpringweilerPost by Hubert SeidelIch denke der Schalter "LARGEADDRESSAWARE" hat nix mit Delphi zu tun...
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
und ob es wirklich funktioniert, hängt natürlich auch von der Qualität der
Fremdkomponenten ab.
Aha... dazu habe ich folgendes gegoogelt:
http://209.85.129.132/search?q=cache:1L-ak8c-HjQJ:docs.codegear.com/docs/radstudio/radstudio2007/RS2007_helpupdates/HUpdate4/DE/html/devcommon/increaseaddressspace_xml.html+%22%7B%24SetPEFlags+IMAGE_FILE_LARGE_ADDRESS_AWARE%7D%22&hl=de&ct=clnk&cd=5&gl=de
Interessant dürfte dieses Zitat aus dem o.g. Link sein, was die 4GB-Idee
als gesamtes zugreifen zu können, zu nichte macht:
<Zitat>
Anmerkung: Die Standardgröße für den Adressraum für den Benutzermodus
für eine Win32-Anwendung beträgt 2 GB, er kann aber optional auf 3 GB
unter 32-Bit-Windows und auf 4 GB unter 64-Bit-Windows erweitert werden.
Der Adressraum ist immer ein wenig fragmentiert. Daher ist es
unwahrscheinlich, dass eine GetMem-Anforderung auf einen einzelnen
zusammenhängenden Block größer als 1 GB erfolgreich sein wird - auch
nicht bei einem Adressraum von 4 GB
</Zitat>
Post by Markus SpringweilerPost by Hubert SeidelMöglicherweise findest Du über die Seiten auch etwas zu Deinem
Betriebssystem, aber ich glaube mehr als 4GB wird ein 32-Bit-Prozess
einfach nicht (nie) direkt ansprechen können.
Ein 32bit-OS kann bis zu 64GiB verwalten (bei Microsoft Windows allerdings
nur ab Server-DataCenter-Edition).
Ja, nur die Frage ist, wieviel stellt das OS einem einzelnen Prozess zur
Verfügung?
Post by Markus Springweilerhttp://msdn.microsoft.com/en-us/library/aa366527(VS.85).aspx
aber prinzipiell wäre die Lösung mittels MMF einfacher und
allgemeiner.
Post by Markus SpringweilerPost by Hubert SeidelWie soll man theoretisch mit 32 Bit mehr als 32 Bit direkt
Addressieren
Post by Markus SpringweilerEben über gleitende Ausschnitte.
Wie bereits gesagt: Ist nicht _direkt_.
Also mit direkt meine ich eben ohne verzögerung/nachladen.
Post by Markus SpringweilerPost by Hubert SeidelBestimmt findest Du was bei den KB-Seiten dazu... ich will Dir ja nicht
den kompletten Recherche-Spaß nehmen ;-)
Letztenendes werde ich um eine Testanwendung nicht herumkommen -- nur
mangelt es derzeit an 64bit: Hardware wie OS.
Ähm... gibt es nicht eine Funktion einen Speicherbereich gegen auslagern
zu sichern?
Ich hätte da dann nämlich folgende Idee, wenn es darum geht z.b. 10GB
einer 32Bit-Applikation garantiert ohne Plattenzugriff zur Verfpgung zu
stellen:
Angenommen man hat 16GB, und möchte einer 32-Bit-Applikation 10GB
für einen (relativ) schnellen Zugriff zur Verfügung stellen.
Die eine Applikation startet 10 Prozesse, welche jeweils 1GB
(oder falls Fragmentierung stört, 20 Prozesse mit je 500MB)
und kommuniziert via IPC miteinander.
Welcher IPC-Mechanismus dann da der Beste ist, hängt von der Anforderung
ab.
Entweder man nehme wieder MemoryMappedFiles, oder eben was anderes.
Evtl. reicht es ja für jeden Prozess mit je 500MB ein
Fenster von nur 1 MB zu haben?
Dann stünde der einen Verwalter-Applikation auch genügend Speicher
für "eigene Dinge" zur Verfügung...
mfg.
Herby
--
http://www.hubert-seidel.eu