Paar Fragen zu Speicher (Windows)
-
Hi!
Ich wüsste gern mal ein paar Dinge bezüglich des Speichers.
-
Darf eine Anwendung praktisch so viel Speicher allozieren, bis RAM + Festplatte (Pagefile, und das wird AFAIK ja automatisch vergrößert, auch bei fixem Wert) voll sind? Oder gibt es hier eine Grenze, wieviel Speicher ein Prozess maximal nutzen darf?
-
Wenn eine Grenze gilt, wieviel sind das (alleine für die Anwendung) unter 32bit? Und wieviel unter 64bit?
-
Unterschiede dynamisch (heap) / statisch (stack) ?
-
Und kommt es dann drauf an, ob die Anwendung 64bit kompiliert ist, um mehr Speicher nutzen zu können? Oder reicht es, eine 32bit Anwendung auf einem 64bit OS laufen zu lassen?
Danke euch!
MFG
-
-
Unter Win x32 hast du eine Grenze von 2 GB pro Prozess. Mit Tricks kann das auf 3 GB ausgeweitet werden. Unter x64 hat ein 32-Bit-Prozess maximal 4 GB zur Verfügung (mit LAA-Flag, sonst auch 2 GB), daran kann logischerweise auch nicht mehr gerüttelt werden.
Mehr Infos gibts auch hier: http://msdn.microsoft.com/de-de/library/bb978906.aspx
-
Aha, also man muss dafür sorgen, dass eine 32bit Anwendung auf einem 32bit OS (ohne jegliche Flags) nicht mehr als ~2GB verbraucht... Ne ziemlich doofe Begrenzung für komplexe Spiele...
-
Na ja, 2 GB sind eigentlich ganz schön viel. Nur wenige Spiele nutzen wirklich mehr (und dann wird ja ausgelagert, es wird also mehr genutzt, was man mit Nachladepausen erkauft). Abgesehen davon: die Zukunft entwickelt sich schließlich in Richtung 64 Bit. XP x64 hat zwar keine Sau interessiert, aber durch Vista/7 wird das Ganze doch gut gepusht. In ein paar Jahren wird es vermutlich gar keine 32-Bit-Spiele mehr geben. Also, was soll's?
-
Jetzt sagst du, es kann ausgelagert (mehr genutzt) werden. Ich hab ja extra gefragt, ob in jedem Fall diese Grenze gilt, oder ob ab 2GB ausgelagert wird, und somit doch mehr als 2GB für den Prozess zur Verfügung stehen (Jetzt für 32bit Anwendungen gemeint).
-
Bei 2 GB /Prozess ist normalerweise Ende. Wenn das Programm auslagert, kommt die Auslagerung nicht in die Rechnung hinein.
Stell es Dir etwa so vor, wie der 1 Euro Jobber in der Arbeitslosenstatistik.
-> Hat einen Job, ist also nicht arbeitslos.
-> Mein Programm hat maximal 2 GB RAM, lagert aber 150 Petabyte aus
-
Ja, entschuldige, da hab ich wohl Quatsch gelabert...
-
Windows0r schrieb:
und somit doch mehr als 2GB für den Prozess zur Verfügung stehen (Jetzt für 32bit Anwendungen gemeint).
Ne, weil afaik WinNT ein Higher-Half-Kernel ist. Heißt, die oberen 2GB Adressbereich bei den Pointern (also Pointer-Werte ab 0x8000_0000) sind dafür reserviert, bei Systemaufrufen in Kernel-Speicher zu zeigen. Wie du vielleicht weißt, erlaubt die Virtuelle Speicherverwaltung des x86ers, virtuelle Adressen auf physischen Speicher zu mappen. Theoretisch könnte ein OS einem Prozess auch die ganzen 4GB an virtuellen Adressen überlassen, dann müssten aber viele Page-Tables bei Systemaufrufen umgehangen werden, was relativ viel Zeit kostet.
-
Ivo schrieb:
Bei 2 GB /Prozess ist normalerweise Ende. Wenn das Programm auslagert, kommt die Auslagerung nicht in die Rechnung hinein.
Ging es nicht darum, dass das Betriebssystem auslagert? Das spielt nämlich sehr wohl in die 2 GB rein.
-
Badestrand schrieb:
Ivo schrieb:
Bei 2 GB /Prozess ist normalerweise Ende. Wenn das Programm auslagert, kommt die Auslagerung nicht in die Rechnung hinein.
Ging es nicht darum, dass das Betriebssystem auslagert? Das spielt nämlich sehr wohl in die 2 GB rein.
Du kannst in Deinen Programm aber selber swappen und schon geht es nicht mehr in die Rechnung rein.
Ging es nur um das OS? Wenn ja, hast Du sicherlich recht.
-
Äh ich checks noch immer nicht. Wenn meine Anwendung nun die 2GB auf 32bit verbraucht hat, und ich weiteren Speicher dynamisch anfordere, schlägt es dann fehl oder nicht? Wird dann statt dem RAM automatisch die Auslagerungsdatei verwendet?
-
Die Auslagerungsdatei hat damit nix zu tun. Angenommen, dein PC hat nur 512MB RAM und du allokierst 1 GB, dann kommt sicherlich 3/4 davon in die Auslagerungsdatei. Trotzdem sind deine Pointer alle noch valid (und "belegen" virtuelle Adressen). Bei 'nem Zugriff auf einen Pointer, dessen Speicher auf der Platte liegt, wird dann was anderes aus dem Arbeitsspeicher auf die Platte ausgelagert und das, worauf du zugreifst, wird wieder in den RAM geholt.
Die Auslagerungsdatei arbeitet damit auf einem ganz anderen Problemfeld als die 32-Bit-Beschränkung. Also: Du kannst nicht mehr als ~2GB allokieren, einfach weil du nur 4GB adressieren kannst und 2GB an Adressen in der Regel für's OS reserviert sind.
-
Achja, so große Adressen gibt es unter 32bit ja gar nicht
Ok verstehe, es muss erst mal in den RAM passen, damit die Auslagerungsdatei genutzt werden kann. Direkt in die Datei mappen wäre ja auch unsinning da viiiel zu langsam.
Aber was ich so in Erinnerung habe, laufen neuere Spiele problemlos auch mit wenig RAM. Aber da bin ich mir nicht sicher.
(Oder sind Abstürze/Fehlermeldungen wegen zu wenig RAM üblich? Ist mir noch nie aufgefallen, sowas...)
-
Windows0r schrieb:
Aber was ich so in Erinnerung habe, laufen neuere Spiele problemlos auch mit wenig RAM. Aber da bin ich mir nicht sicher.
Na ja, was heißt wenig? Viele aktuelle Spiele setzen schon 1 GB voraus (was ja nicht heißt, dass die nicht mehr nutzen).
Für 32-Bit-Windows gibts übrigens auch nen Switch, der dir erlaubt, ein wenig mehr Speicher pro Prozess zu nutzen:
http://support.microsoft.com/kb/316739
Hab ich aber nie ausprobiert. In der Regel kommen alle Programme doch gut mit 2 GB hin. Und wer sehr viel mehr für Profi-Software braucht, sollte halt nach Möglichkeit auf x64 wechseln.
-
zB. Anno 1404 hat als Mindestvoraussetzung 1GB Ram. Bei mir braucht der Prozess aber schon ~1.6GB ("Working Set") nach paar Stunden Spielzeit.
Also würde das Spiel mit 1GB abstürzen?
-
Windows0r schrieb:
zB. Anno 1404 hat als Mindestvoraussetzung 1GB Ram. Bei mir braucht der Prozess aber schon ~1.6GB ("Working Set") nach paar Stunden Spielzeit.
Also würde das Spiel mit 1GB abstürzen?
nein, es müsste nur deutlich öfter auslagern, was den Spielfluss erheblich bremsen kann
-
Windows0r schrieb:
zB. Anno 1404 hat als Mindestvoraussetzung 1GB Ram. Bei mir braucht der Prozess aber schon ~1.6GB ("Working Set") nach paar Stunden Spielzeit.
Also würde das Spiel mit 1GB abstürzen?
Wenn du die Voraussetzung erfüllst, warum gehst du dann davon aus, dass das Spiel abstürzt? Macht nicht wirklich Sinn, oder?
-
Ok, dann bin ich einfach zu dumm und kapiers immer noch nicht so richtig.
-
Windows0r schrieb:
Ok, dann bin ich einfach zu dumm und kapiers immer noch nicht so richtig.
Ok, gaaanz langsam:
Maximal nutzbarer Speicher auf 32 Bit Systemen überhaupt (ohne fiese Tricks): 4 GiB (edit: Weil 2^32 Byte = 4 GiB)
Das gilt für alle Programme, unter anderem auch für das Betriebssystem, dass den Speicher für andere Programme verwaltet. Ob die 4 GiB in richtigen RAM-Modulen vorliegen oder auf der Festplatte sind, ist dabei erstmal egal.Von diesen 4 GiB nimmt sich Windows selber schonmal 2 GiB (mit Tricks auch nur 1 GiB, aber das ist an dieser Stelle nicht wichtig). Da Windows auch den Speicher für alle Programme verwaltet, bleibt für diese logischerweise maximal 2 GiB (bzw. 3 GiB) übrig. Ob dieser Speicher in RAM-Modulen oder auf der Festplatte vorliegt, ist dabei immer noch egal.
Windows verwaltet wie gesagt die kompletten 4 GiB des 32-bit Systems. Dabei wird alles was nicht in die echten RAM-Module passt auf die Festplatte geschrieben. Angenommen du hast 1GiB RAM-Module und alle Programme inklusive Windows verbrauchen 1,5 GiB, dann wird 1 GiB im echten RAM gehalten und 0.5 GiB auf die Festplatte geschrieben. Welche Daten im echten RAM sein sollen und welche auf der Festplatte entscheidet Windows mit irgendwelchen tollen Algorithmen die für ein möglichst reibungsloses Arbeiten sorgen sollen.
Wenn jetzt alle Anwendungen zusammen mehr als 2 GiB Speicher brauchen, hat Windows nicht mehr genug übrig, da ja von den 4 GiB schon 2 GiB von Windows reserviert wurden. Folglich bekommt das Programm, das den nicht zur Verfügung stehenden Speicher angefordert hat ein Signal, dass die Speicheranforderung nicht geklappt hat. Viele Programme quittieren dies mit einem Crash-to-Desktop.
Hat man nur 1 GiB echten RAM und ein Programm braucht mehr als 1 GiB, dann wird, wie schon gesagt, ausgelagert. Das Programm bekommt davon im Prinzip nichts mit, der Benutzer wird aber merken, dass die Festplatte am rödeln ist und das Programm nur noch sehr zäh reagiert. Abstürzen wird das Programm aber nicht, da es allen angeforderten Speicher bekommen hat, auch wenn dieser nun auf der Festplatte liegt.
-
Thanks a lot! Jetzt hab ich's kapiert!
-
Und falls es dich interessiert: diese Tricks, von denen SeppJ spricht, sind Switches in der boot.ini (/3gb und /userva). Damit kannst du ein wenig mehr Speicher (bis 3 GB, abhängig vom Wert im userva-Switch) bereitstellen.