Wie viel Speicher kann ein 32-Bit-Prozess auf einem 64-Bit-Betriebssystem zugreifen?

85

Unter Windows kann ein 32-Bit-Prozess unter normalen Umständen nur auf 2 GB RAM zugreifen (oder auf 3 GB mit einem speziellen Schalter in der Datei boot.ini). Wie viel Speicher ist verfügbar, wenn ein 32-Bit-Prozess auf einem 64-Bit-Betriebssystem ausgeführt wird? Gibt es spezielle Schalter oder Einstellungen, die dies ändern können?

jjxtra
quelle

Antworten:

90

Standardmäßig 2 GB. Wenn die Anwendung über einen großen Adressraum verfügt (verknüpft mit / LARGEADDRESSAWARE), erhält sie 4 GB (nicht 3 GB, siehe http://msdn.microsoft.com/en-us/library/aa366778.aspx ).

Sie sind immer noch auf 2 GB begrenzt, da viele Anwendungen davon abhängen, dass das oberste Bit der Zeiger Null ist.

Michael
quelle
5
Kann jemand erklären, warum Prozesse nicht auf die vollen 4 GB zugreifen können?
BlueTrin
1
Was meinst du? Wenn Sie es selbst erstellen, können Sie das Flag / LARGEADDRESSAWARE verwenden und dafür sorgen, dass es mit 4 GB funktioniert. Wenn Sie dies nicht getan haben, sind Sie den Entwicklern ausgeliefert, die dies getan haben.
SilverbackNet
Liegt das daran, dass der Zeiger gefährlich mit Zweierkomplement interpretiert werden könnte?
Rosstex
1
Damit since many application depends on the top bit of pointers to be zeromeinen Sie, dass das 32. Bit des Adressierungsschemas beim Durchlaufen des Adressraums des Prozesses nicht berücksichtigt oder verwendet wird.
RBT
20

4 GB abzüglich der vom System verwendeten Daten, wenn Sie eine Verbindung mit / LARGEADDRESSAWARE herstellen.

Natürlich sollten Sie mit der Zeigerarithmetik noch vorsichtiger sein, wenn Sie dieses Flag setzen.

MSN
quelle
-1: Das System verwendet 64-Bit-Adressen für sich selbst, so dass es nicht nötig ist, etwas zu subtrahieren
Thomas Weller
@ThomasW., Das stimmt nicht, zumindest unter Windows. WOW64 benötigt weiterhin 32-Bit-Thunks für 64-Bit-Systemaufrufe. Siehe msdn.microsoft.com/en-us/library/windows/desktop/…
MSN
1
Du meinst diese 605 kB DLLs? Entschuldigung, das habe ich nicht verstanden, da es sich bei der Frage eher um GB Speicher handelte.
Thomas Weller
7
@ThomasW., Deshalb habe ich gesagt "minus was vom System verwendet wird."
MSN
14

Niemand scheint die Tatsache zu berühren, dass das wow64-Subsystem viele verschiedene 32-Bit-Anwendungen überall im Speicher über 4 G zuordnen kann. In einem 64-Bit-Fenster mit ausreichend Speicher können Sie also viel mehr 32-Bit-Anwendungen ausführen als auf einem nativen 32-Bit-System.

Harm ten Napel
quelle
7
Sie sprechen von physischem RAM, während das OP von virtuellem Speicher spricht. Selbst auf 32-Bit-Systemen können Sie viele Anwendungen ausführen, solange Ihre Auslagerungsdatei groß genug ist.
Thomas Weller
7

Ein 32-Bit-Prozess ist in einem 64-Bit-Betriebssystem immer noch auf dieselben Einschränkungen beschränkt. Das Problem ist, dass Speicherzeiger nur 32 Bit breit sind, sodass das Programm keine Speicheradresse zuweisen / auflösen kann, die größer als 32 Bit ist.

Ben S.
quelle
4
Dies wäre nützlich gewesen, wenn Sie klargestellt hätten, dass 32 Bit 4 GB Speicherplatz adressieren.
Ingenieur
3

Ein einzelner 32-Bit-Prozess unter einem 64-Bit-Betriebssystem ist auf 2 GB beschränkt. Wenn es jedoch zu einer EXE-Datei mit IMAGE_FILE_LARGE_ADDRESS_AWAREgesetztem Bit kompiliert wird, hat es ein Limit von 4 GB, nicht von 2 GB - siehe https://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

Die Dinge, die Sie über spezielle Startflags, 3 GB, /3GBSwitches oder /uservaalles über 32-Bit-Betriebssysteme hören, gelten nicht für 64-Bit-Windows.

Weitere Informationen finden Sie unter https://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx .

Bei den 32-Bit-Betriebssystemen gibt es entgegen der Annahme keine physische Grenze von 4 GB für 32-Bit-Betriebssysteme. Beispielsweise können 32-Bit-Server-Betriebssysteme wie Microsoft Windows Server 2008 32-Bit auf bis zu 64 GB zugreifen(Windows Server 2008 Enterprise- und Datacenter-Editionen) - Mithilfe der Physical Address Extension (PAE), die zuerst von Intel im Pentium Pro und später von AMD im Athlon-Prozessor eingeführt wurde, wird eine Seitentabellenhierarchie mit drei Ebenen definiert. Mit Tabelleneinträgen von jeweils 64 Bit anstelle von 32 können diese CPUs direkt auf einen physischen Adressraum zugreifen, der größer als 4 Gigabyte ist. Theoretisch kann ein 32-Bit-Betriebssystem also theoretisch auf 2 ^ 64 Byte oder 17.179.869.184 Gigabyte zugreifen, das Segment jedoch begrenzt durch 4GB. Aus Marketinggründen hat Microsoft den maximal verfügbaren Speicher auf Nicht-Server-Betriebssystemen jedoch auf nur 4 GB oder sogar 3 GB effektiv beschränkt. Somit kann ein einzelner Prozess auf einem 32-Bit-Betriebssystem auf mehr als 4 GB zugreifen - und Microsoft SQL Server ist ein Beispiel.

32-Bit-Prozesse unter 64-Bit-Windows haben keinen Nachteil im Vergleich zu 64-Bit-Prozessen bei der Verwendung des virtuellen Adressraums des gemeinsam genutzten Kernels (auch als Systemraum bezeichnet ). Alle Prozesse, sei es 64-Bit oder 32-Bit, unter 64-Bit-Windows teilen sich den gleichen 64-Bit-Systemspeicher.

Angesichts der Tatsache, dass der Systemspeicher unter 32-Bit-Windows von allen Prozessen gemeinsam genutzt wird , belegen Prozesse, die eine große Anzahl von Handles erstellen (wie Threads, Semaphoren, Dateien usw.) , den Systemspeicherplatz von Kernelobjekten und können sogar keinen Speicher mehr haben wenn Sie insgesamt viel Speicher zur Verfügung haben. Im Gegensatz dazu ist der Kernelspeicher unter 64-Bit-Windows 64-Bit und nicht auf 4 GB beschränkt. Alle Systemaufrufe von 32-Bit-Anwendungen werden im Benutzermodus in native 64-Bit-Aufrufe konvertiert .

Maxim Masiutin
quelle
1
Bei dieser Frage wird gefragt, auf wie viel Speicher ein einzelner Prozess zugreifen kann. Dies wird durch den 32-Bit-Adressraum des virtuellen Speichers begrenzt. Sicher, Sie können mehrere 32-Bit-Prozesse mit jeweils 4 GB auf demselben Computer ausführen, selbst mit einem 32-Bit-Betriebssystem mit PAE. Aber das ist nicht das, was diese Frage stellt.
Peter Cordes
@PeterCordes - Entschuldigung und danke - Ich habe die Antwort zum Limit von 2 GB / 4 GB aktualisiert.
Maxim Masiutin
@PeterCordes, vielen Dank für Ihre Bemerkung. Ich habe die Antwort aktualisiert, um zu betonen, dass mehrere 32-Bit-Prozesse jeweils 4 GB auf demselben Computer verwenden können, selbst bei einem 32-Bit-Betriebssystem mit PAE, und dass 32-Bit-Prozesse unter 64- Bit-Betriebssysteme leiden nicht unter der 2-GB-Systemspeicherbeschränkung, was unter 32-Bit-Betriebssystemen ein Problem war.
Maxim Masiutin
-1

Sie haben die gleiche grundlegende Einschränkung, wenn Sie einen 32-Bit-Prozess unter Win64 ausführen. Ihre App läuft auf einem 32-Subsystem, das jedoch wie Win32 aussieht. Dazu gehören die Speicherbeschränkungen für Ihren Prozess (untere 2 GB für Sie, obere 2 GB für das Betriebssystem).

Sean
quelle
-11

Das Limit ist nicht 2 g oder 3 GB, sondern 4 GB für 32 Bit.

Der Grund, warum die Leute denken, dass es 3 GB sind, ist, dass das Betriebssystem 3 GB frei anzeigt, wenn sie wirklich 4 GB System-RAM haben.

Sein Gesamt-RAM von 4 GB. Wenn Sie also eine 1-GB-Grafikkarte haben, die als Teil des vom 32-Bit-Betriebssystem angezeigten Gesamt-RAM zählt.

4Gig nicht 3 nicht 2 verstanden?

BobJ
quelle
2
Das ist falsch. Bei einem Standard-x86-System (keine Speichererweiterungen) kann der Kernel auf die vollen 4 GB Speicherplatz zugreifen (selbst wenn der Computer aufgrund von Paging nur 1 GB RAM hat). Der Kernel reserviert die oberen 2GiB (einige Kernel reservieren stattdessen 1GiB oder 3GiB) für den eigenen Gebrauch. Im virtuellen Speicher jedes Prozesses ist auch der reservierte Speicher des Kernels zugeordnet, sodass der Prozess keine 2 GB Speicher verwenden kann.
Alex Jorgenson
3
Grafikkarten haben auch nichts mit der Speichermenge zu tun, die ein Prozess verwenden kann. ACPI-Tabellen, speicherabgebildete E / A usw. verbrauchen physische Speicheradressen, dies wird jedoch dank des virtuellen Speichers vermieden.
Alex Jorgenson
1
Das ist falsch. Microsoft entschied sich (Designauswahl), den virtuellen 32-Bit-Adressraum mit Windows NT so aufzuteilen, dass 2 GB für die Zuordnung des Betriebssystems (Treiber / API / Systemaufrufe usw.) und die verbleibenden 2 GB für die App-Verwendung reserviert waren. / 3 GB Boot-Switch ändert dieses Verhalten (1 GB für die Betriebssystemzuordnung, 3 GB für App-Code). Ich
gehe und finde