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 Ramauslastung (bei ramgrößen >2gb) (https://www.delphipraxis.net/69805-ramauslastung-bei-ramgroessen-2gb.html)

easteregg 20. Mai 2006 00:07


Ramauslastung (bei ramgrößen >2gb)
 
heyho

da ich grad aufgrund eines rechnercrash mir einen "superrechner" zusammengebaut hab, ist mir aufgefallen das mein programm mit ramgrößen über 2gb nicht umgehen kann.

zur zeit lese ich die auslastung so aus:

Delphi-Quellcode:
var
  memory: TMemoryStatus;
begin
      //mem
       memory.dwLength := SizeOf(memory);
       GlobalMemoryStatus(memory);
        memtotal := memory.dwTotalPhys / 1024 / 1024;
        memavail := memory.dwAvailPhys / 1024 / 1024;
        memused := memory.dwMemoryLoad / 1024 / 1024;
aber das packt nur bis 2gb ;) der rest wird abgeschnippelt.... das find ich nicht toll -> da steht jetzt einfach 0/2048mb da ...
wie kann ich nun die vollen 2,5gb auslesen ?

Dax 20. Mai 2006 00:10

Re: Ramauslastung (bei ramgrößen >2gb)
 
Hm, sind die Zahlen in memory Integers oder DWords, wies dransteht? Wenns DWords sind, müsst das doch gehen..

Olli 20. Mai 2006 00:13

Re: Ramauslastung (bei ramgrößen >2gb)
 
JEDES Programm kann mit RAM-Größen über 2GB umgehen, wenn es für 32bit oder größer kompiliert wurde.

Das Problem ist nur, daß die oberen 2GB immer für das System - sprich: den Kernel - reserviert sind. Die Einstellung kannst du über einen BOOT.INI-Switch ändern, so daß 3GB zur Verfügung stehen. Ansonsten hast du da keine Chance.

Achtung, die Einstellung der boot.ini ist abhängig von deinem System. Auf Win9x/Me kannst du sowieso keine >2GB nutzen, also ging ich in meiner Antwort von NT aus!

Nachtrag:
Ach ja, wenn es noch niemandem aufgefallen sein sollte: jeder einzelne Prozeß hat 4GB (gespalten in die 2 Teile für System und User) zur Verfügung. Und dreimal dürft ihr raten, wie das geht wenn ihr z.B. nur 512MB RAM und eine 512MB Auslagerungsdatei habt!

himitsu 20. Mai 2006 00:16

Re: Ramauslastung (bei ramgrößen >2gb)
 
DerMemoryManager ist auf 2 GB begrenzt, aber man kann zumindestens FastMM (der BorlandMM kann es vrmutlich nicht richtig ... wenn überhaupt, da er eigentlich nicht dafür ausgelegt ist) auf 3 GB Win32 und bis zu 4 GB unter Win64 umstellen

schau dazu mal in die ReadMe > Stichwort "{$SetPEFlags $20}"

easteregg 20. Mai 2006 00:23

Re: Ramauslastung (bei ramgrößen >2gb)
 
also mein winXP prof erkennt ja die 2,5gb einwandfrei!
nur eben mein programm liest nur 2048mb aus.
also liegt das an dem memorymanager von borland?

und zu dem bootini swichtes -> hab ich das richtig verstanden das winXP zb gar nicht mehr als 2gb von den 2,5 nutzen wird/kann ?
ich bin grad etwas überfordert mit den infos ;)

Olli 20. Mai 2006 00:30

Re: Ramauslastung (bei ramgrößen >2gb)
 
Zitat:

Zitat von easteregg
also liegt das an dem memorymanager von borland?

Denkt doch bitte mal erstmal alle nach. Benutzt wurde zum auslesen eine Funktion namens? Richtig: MSDN-Library durchsuchenGlobalMemoryStatus! Wie der Zufall es will, ist diese Funktion absolut unabhängig vom Borland Memory Manager, weil es sich - wie der Zufall es will - um eine Win32 API-Funktion handelt.

Wenn du die Funktionen von Delphi benutzt um RAM zu allozieren, bist du aber natürlich auf das beschränkt, was Delphi dir anbietet (siehe himitsus Post). Würdest du die üblichen Windows-Funktionen verwenden, solltest du dieses Problem ja nicht haben ... teste es einfach.

Und nochmal: ein Usermode-Programm auf einer StiNo-Installation von Windows kann nicht mehr als 2GB allozieren, weil der Teil ab $80000000 eben dem Kernel gehört. Dort befinden sich (eingeblendet in den Prozeßspeicherraum) eingeblendet beispielsweise MMFs und Shared Sections von DLLs. Alles untendrunter ist sozusagen privat für den Prozeß.

himitsu 20. Mai 2006 00:35

Re: Ramauslastung (bei ramgrößen >2gb)
 
Egal was dein Windows kann und was da eingestellt ist ... Standardmäßig ist die Größe auf 2 GB begrenzt ... also im positiven Bereich von LongInt.

füg einfach mal {$SetPEFlags $20} in deie DPR ein uns schau was passiert ... entweder der DelphiMM kann es, oder eben nicht ;)

easteregg 20. Mai 2006 00:50

Re: Ramauslastung (bei ramgrößen >2gb)
 
ok das hab ich jetzt einfach ausprobiert und siehe da - es funktioniert.

wieso sind solche optionen nicht von anfang an aktiv?

himitsu 20. Mai 2006 02:25

Re: Ramauslastung (bei ramgrößen >2gb)
 
Weil es sowas früher nicht gab und man Abwärtskompatibel sein will/muß :zwinker:

bei den 2 GB kann man z.B. ganz einfach prüfen, ob ein Pointer im "gültigen" Bereich ist
also nicht negativ und nicht nil.

Delphi-Quellcode:
// 2 Flags geprüft und fertsch

or &P, &P
js @Fehler
jz @Fehler
Tja und wenn jetzt soeine, oder so 'ne ähnlich Prüfung gemacht wird, dann wird dieses meinen der Pointer wäre falsch, sobald er >= 2 GB liegt ._.

easteregg 20. Mai 2006 11:31

Re: Ramauslastung (bei ramgrößen >2gb)
 
ich verstehe das jetzt nicht richtig.

wenn jetzt also das für >2,5gb compilierte programm auf einem systemläuft mit weniger als 2gb kommt es zu problemen?

himitsu 20. Mai 2006 12:03

Re: Ramauslastung (bei ramgrößen >2gb)
 
Das sollte nicht geschehen, denn du kannst ja auch ein Pogramm, welches für <2 GB compiliert wurde auf einem System, mit weniger als 1 GB, laufen lassen ;)

Es kommen aber nicht alle Codes mit Pointern über 2GB klar ... du mußt also auch aufpassen, daß alle in deinem Programm (importierte Funktionen, geladene DLLs ...) auch dieses kann, wenn du diese Option aktivierst.

Olli 20. Mai 2006 12:34

Re: Ramauslastung (bei ramgrößen >2gb)
 
Pointer sind ja nur 32bit-Werte (auf einem 32bit-System). Sie können also theoretisch wie vorzeichenbehaftete oder vorzeichenlose Integer behandeltwerden, also wir LongInt vs. LongWord um beim Delphi-Jargon zu bleiben.

Das höchste Bit in diesem vorzeichenbehafteten Integer wird bei der Methode "two's complement" immer 1 sein, wenn der Wert negativ ist. Bei positiven Werten ist das höchste Bit immer 0. Wenn wir uns den Wert anschauen, der bei 32bit die Bitmaske des höchsten Bits darstellt, nämlich $80000000, sollte uns etwas auffallen - das ist genau unsere 2GB Grenze.

Wie es scheint, benutzt Delphi also vorzeichenbehaftete Pointerwerte "by default", was sich aber umstellen läßt (wußte ich z.B. auch nicht, danke himitsu!).

easteregg 20. Mai 2006 12:38

Re: Ramauslastung (bei ramgrößen >2gb)
 
Zitat:

Zitat von himitsu

Es kommen aber nicht alle Codes mit Pointern über 2GB klar ... du mußt also auch aufpassen, daß alle in deinem Programm (importierte Funktionen, geladene DLLs ...) auch dieses kann, wenn du diese Option aktivierst.

aber das ist ja nur relevant wenn mein programm soviel ram verbraucht oder?
(irgendwie ist das thema grad nen bömischer wald für mich ;) )

himitsu 20. Mai 2006 12:51

Re: Ramauslastung (bei ramgrößen >2gb)
 
Zitat:

Zitat von easteregg
aber das ist ja nur relevant wenn mein programm soviel ram verbraucht oder?
(irgendwie ist das thema grad nen bömischer wald für mich ;) )

Nein, ist es nicht, da die meisen MemoryManager (DelphiMM/FastMM/FastXMM...) speicher oben und unten im virtuellen Raum ablegen ... so werden z.B. bei Fast(X)MM alle kleinen/mittleren Speicherblöcke unten (Richtung nil) und die großen Blöcke oben reserviert, wärend in der Mitte/hinten/ die ganzen DLL's gemappt sind ... also in der Mitte sieht's meistens recht lehr auch und vorn/hinten mehr voll.
(vorn/mitte/hinten auf die 2 GB bezogen)

easteregg 20. Mai 2006 12:54

Re: Ramauslastung (bei ramgrößen >2gb)
 
also wenn ich zb später mal diesen hook mit einbauen will, das ich die tastenanschläge zähle (nicht auslese!) muss ich bei der dll dann auch diese anweisung mit einbauen, das er mehr als 2gb ram nutzt und sonst kommt es zu probleme - right?

Olli 20. Mai 2006 12:57

Re: Ramauslastung (bei ramgrößen >2gb)
 
Nein, wozu?!

easteregg 20. Mai 2006 12:59

Re: Ramauslastung (bei ramgrößen >2gb)
 
dann hab ich das hier falsch verstanden:

Zitat:

Zitat von himitsu
Es kommen aber nicht alle Codes mit Pointern über 2GB klar ... du mußt also auch aufpassen, daß alle in deinem Programm (importierte Funktionen, geladene DLLs ...) auch dieses kann, wenn du diese Option aktivierst.


himitsu 20. Mai 2006 13:01

Re: Ramauslastung (bei ramgrößen >2gb)
 
Ich denk/hoffe mal nicht, da die DLL ja ihren Speicher auch selber verwaltet (meistens).

Aber wozu willst du dieses Flag überhaupt setzten?
Es kommt ja nicht gerade oft vor, daß ein Programm überhaupt mal den 2 GB-Adressraum voll ausnutzt.

Na gut, ich hatte mal in 'nem Testprogramm "virtuell" die 2 GB vollgemacht und das bei nur 0,7 GB RAM+PageFile, aber dat war ja och nur 'ne Ausnahme ._.

[add]
es muß nicht aktiviert sein ... die DLL muß es nur verstehen/behandeln können, wenn sie mal auf speicher deiner EXE zugreift.

easteregg 20. Mai 2006 13:13

Re: Ramauslastung (bei ramgrößen >2gb)
 
ich brauch gar nichtsoviel ram, ich will ja nur die auslastung auslesen! (minimiert brauch mein programm unter einem MB ;) )

das brauch ich für mein tool (siehe signatur ;) ) - und da gestern mein server kaputt gegangen ist, hab ich seinen ram mit in meine workstation gebaut und komme so auf 2,5gb, und da ist mir der fehler aufgefallen!

himitsu 20. Mai 2006 13:24

Re: Ramauslastung (bei ramgrößen >2gb)
 
aber dafür brauchst du dieses Fläg doch nicht :zwinker:

Delphi-Quellcode:
var
  memory: TMemoryStatus;
begin
  memory.dwLength := SizeOf(memory);
  GlobalMemoryStatus(memory);
  memtotal := Cardinal(memory.dwTotalPhys) / 1024 / 1024;
  memavail := Cardinal(memory.dwAvailPhys) / 1024 / 1024;
  memused := Cardinal(memory.dwMemoryLoad) / 1024 / 1024;

easteregg 20. Mai 2006 13:41

Re: Ramauslastung (bei ramgrößen >2gb)
 
doch, brauch ich eben doch.
weil sonst steht da bei mir 0 null von 2048 benutzt, und erst wenn der erste 512er teil voll ist, gehts los mit zb 36 von 2048 (wenn ich 548 mb auslastung habe!)

mit gesetztem flag steht jetzt ordentlich 940 von 2559,48mb da

hier mal nen screenshot von nem programm, was den selben fehler hat (winbar).

http://verfriemelt.org/ram/

himitsu 20. Mai 2006 14:04

Re: Ramauslastung (bei ramgrößen >2gb)
 
hmmm, ich dachte GlobalMemoryStatus ließt den Status komplett aus, da sollte es doch keinen Unterschied machen :gruebel:

Zitat:

On computers with more than 4 GB of memory, the GlobalMemoryStatus function can return incorrect information. Windows 2000 and later report a value of -1 to indicate an overflow. Earlier versions of Windows NT report a value that is the real amount of memory, modulo 4 GB. For this reason, use the GlobalMemoryStatusEx function instead.
Im nachfolgenden Absatz steht, daß GlobalMemoryStatus auf 2 GB abrundet, wenn kein LargeAddress aktivier ist.

http://msdn.microsoft.com/library/de...morystatus.asp

easteregg 20. Mai 2006 14:20

Re: Ramauslastung (bei ramgrößen >2gb)
 
wie setz ich dieses GlobalMemoryStatusEx in delphi um?
weil den befehl selbst scheint es nicht zu kennen und den variablentypen memorystatusEx genauso wenig!

MagicAndre1981 20. Mai 2006 14:44

Re: Ramauslastung (bei ramgrößen >2gb)
 
Kommt auf deine Delphi-Version an, ob die die Deklaration kennt. Lade die die Win32API-Deklaration von den JEDIs runter, da sollte alles drin sein.

himitsu 20. Mai 2006 15:15

Re: Ramauslastung (bei ramgrößen >2gb)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Such mal dadrin ... irgendwo stehts :roll:

easteregg 25. Mai 2006 23:11

Re: Ramauslastung (bei ramgrößen >2gb)
 
was mich grad verwundert.

ich hab das mit dem flag {$SetPEFlags $20} gemacht. damit funktioniert das auch einwandfrei.
aber scheinbar wird das nur sporadisch verarbeitet - kann das sein?

mal zeigt er mir mehr als 2gb ram an mal nicht. (nutze das BDS 2006)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 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