wie reserviert malloc speicher ????
-
die anweisung:
z=(unsigned char *)malloc(10000*1024*1024);
wird auf meinem rechner (1gb ram) fehlerfrei ausgeführt und malloc gibt keinen
NULL-zeiger zurück. aber wiso geht das -ich hab doch keine 10000mb ram???
-
Hat a) nix mit BCB sondern mit ANSI C zu tun
b) reserviert malloc den Speicher über Betriebssystemaufrufe was es wiederum Betriebssystemabhängig machtJedoch hängt grundsätzlich die maximal reservierbare grösse weniger vom Physikalischen Speicher als vielmehr vom Physikalischen UND dem auslagerungsspeicher ab.
Verschoben nach ANSI C...
-junix
-
und wie kann ich den max. verfügbaren physikalischen speicher ermitteln?
arbeitet etwa "new" auch so?
-
Original erstellt von tenim:
und wie kann ich den max. verfügbaren physikalischen speicher ermitteln?
arbeitet etwa "new" auch so?new ruft malloc in den meisten implementationen auf
-
Original erstellt von junix:
**
Jedoch hängt grundsätzlich die maximal reservierbare grösse weniger vom Physikalischen Speicher als vielmehr vom Physikalischen UND dem auslagerungsspeicher ab.**
Stimmt so nicht ganz. Hängt viel mehr von der größe des virtuellen Arbeitsspeichers ab. Dieser ist bei Windows (NT) 4GB groß, egal wie groß die auslagerungsdatei und wirklicher RAM ist.
Wie groß der bei Linux ist kann ich nicht sagen. Aber da wird diese große auch logisch unabhängig von den physischen großen sein.
-
Wie xroads42 schon gesagt hat, aber ich glaube ich habe es ein bisschen anders in Erinnerung, und zwar glaube ich dass es ab Win95 jeder Anwendung erlaubt war bis zu 4GB RAM zu adressieren, warum das möglich ist weiß ich aber nicht.
-
10000*1024*1024 erzeugt einen Überlauf, also forderst du gar keine 10 GB an, sondern grade mal 1.8 GB. Wenn du das unter Linux versucht hast, google mal nach 'overcommitment'.
-
Also: In 32-Bit Systemen hat man einen 32-Bit -Adressraum, kann also prinzipiell mit 4GB-Adressen rumspielen. Unter Windows NT und Linux sind allerdings die oberen 2GB für den Kernel gesperrt und damit hat man nur 2GB verfügbar. Unter Win98 sind die oberen 2GB shared memory können also _theoretisch_ genutzt werden, praktisch liegt allerdings da der Kernel etc. Von daher soltle man das besser nicht versuchen.
Sobald man sich so einen batzen Speicher holt, wird meist nur notiert, dass der Anwendung jetz potentiell soviel Speicher gehört. Erst beim tatsächlichen Zugriff wird eine Speicherseite geholt und eingesetzt (virtueller Speicher heißts deswegen). Sind alle Speicherseiten belegt, wird eine auf die Platte geschrieben und notiert, dass die Speicherseite nun weg ist. Dnach wird die ehemals belegte Seite übergeben. Will ein Programm an eine Seite, die nicht mehr im Speicher ist, holt das Betriebssystem sie wieder in den Speicher rein. Das ganze nennt man dann Paging. Zum Glück passiert das ganze für die Anwendungen unsichtbar, so dass das OS dir vorgaukeln kann, dass du wirklich 2GB speicher nutzen kannst, indem es notfalls die Festplatte zur Auslagerung befragt.
-
Hmmm, also ich bin der Meinung, dass der Adressraum für jedes Programm 4GB ist.
Da bei dem Paging für jedes Programm eine Seitentabelle angelegt wird.
Nun weiss ich allerdings nicht, warum unter Linux 2GB für den Kernel gesperrt sein soll... ... das ist mir ehrlichgesagt auch neu.
Sicher kann man nicht volle 4GB nutzen, da in diesen 4GB auch die Seitentabellen liegen und die nicht gerade klein sind, falls man wirklich so viel Speicher brauchen sollte.Was auf jeden Fall korrekt gesagt wurde ist:
es wird in den Betriebsystemen zwischen physikalischen und virtuellen Speicher unterschieden. Als Programmierer von "normalen" Anwendungsprogrammen, wirst du nur mit virtuellem Speicher arbeiten, ohne es zu merken.
-
stimmt, daran hatte ich nicht gedacht. aber auch 1,8 gb dürfte er nicht reservieren können bei 1gb ram. aber ich check das jetzt immer vorher mit der funktion "globalmemoryststus" und dann gehts.
-
Also wenn es sich um Native 64Bit Anwendungen handelt hatte ich recht (o;
Ne im Ernst stimmt schon... hatte ich ganz vergessen. Hängt vom Virtuellen Arbeitsspeicher ab. Aber wenn du nicht genügend Platz auf der disc hast, um die angeforderte Menge auszulagern, dann ist die Begrenzung ganz klar durch Phys. Grössen wie Diskgrösse und RAMgrösse gegeben.
aber auch 1,8 gb dürfte er nicht reservieren können bei 1gb ram
Doch, solange er 0.8GByte auf der Disk findet und reservieren kann schon.-junix