2017-07-30 2 views
1

Mein Professor sagte, dass wir regelmäßig nur 2 GB von 4 GB RAM verwenden können, weil die anderen 2 GB vom Betriebssystem verwendet werden. Beim Ausführen einiger Tests sehe ich jedoch, dass ich mit einem virtuellen Speicherbereich von 4 GB eines Prozesses nur maximal 2 GB unter Verwendung der VirtualAlloc()-Funktion zuweisen kann. Warum ist das (ich hatte erwartet, dass es mehr als 3 GB ist)?Warum kann ich nur 2 GB auf einem virtuellen 4-GB-Speicherplatz reservieren?

Wie ich weiß, verwenden die Stack-, Daten- und Code-Segmente nur wenig Speicher. Einer meiner Freunde sagte mir, dass die anderen 2 GB von OS verwendet werden, genau wie der Professor sagte. Allerdings glaube ich, dass der Professor 2 GB gemeint hat. Es ist nicht in der virtual memory dieses Prozesses. Könnte jemand erklären, was hier passiert? Vielen Dank.

Einige Informationen:

Physikalischer Speicher: 4 GB.

Virtueller Speicher: 4 GB.

OS: Windows 10.

+0

Sie können zu etwa 3 GB, indem Sie ändern, wie Windows-Starts lesen von https://blogs.technet.microsoft.com/askperf/2007/03/23/memory-management-demystifying-3gb/ –

+0

verwenden Sie 64-Bit-Betriebssystem und Compiler? –

+0

@ M.M Ich verwende 64-Bit-Betriebssystem und kompiliere in 32-Bit. – Rickie

Antwort

4

Ihr Professor ist richtig - 2 GB Ihrer virtuellen Speicher sind Kernel-Speicher. Auf diese Weise können diese 2 GB bleiben, wenn ein Kontextwechsel stattfindet, und nur die anderen 2 müssen getauscht werden. Es hilft Leistung.

Sie können auch sehen, here eine Erklärung von Microsoft, einschließlich Erläuterungen, wie Sie den Benutzeranteil auf 3 GB erhöhen.

Übrigens ist die Situation in 64-Bit-Maschinen anders, wo der virtuelle Speicher viel größer ist.

3

Es hat nichts mit RAM zu tun, die virtuelle in VirtualAlloc() sagt keine Lügen. Sicher, die oberen 2 GB sind dem Betriebssystem vorbehalten, die größten Teile sind der Dateisystem-Cache und die Videospeicher-Blende. Letzteres ist der Hauptgrund, warum die/3GB-Bootoption nicht mehr funktioniert. Wie Sie herausgefunden haben, können Sie nie die vollen 2GB bekommen, Ihr Programm benötigt ebenfalls Adressraum und steht immer an erster Stelle. Es hat es bekommen, wenn es vom OS Loader geladen wurde, was übrig bleibt, kann von VirtualAlloc aufgeteilt werden.

In der Regel weniger als 2 GB, wird der Adressraum durch geladene DLLs fragmentiert. Achten Sie darauf, dass Sie möglicherweise einige verwenden, selbst wenn Sie ihre Importbibliotheken nicht verlinkt haben, da Anti-Malware- und Cloud-Storage-Dienstprogramme sie injizieren können. Alle Heapzuweisungen in Ihrem Programm führen ebenfalls zu Splits.

Diese Bedenken werden ziemlich altmodisch, alle modernen Maschinen starten ein 64-Bit-Betriebssystem. Ein 32-Bit-Programm läuft jetzt in einem Emulator und der obere Bereich wird vom Betriebssystem nicht mehr benötigt. Sie können jetzt viel näher an 4 GB durch Verknüpfung mit der /LARGEADDRESSAWARE linker option bekommen. Diese Option gibt Ihnen einen ziemlich guten Hinweis, warum sie ursprünglich entschieden haben, dass das Aufteilen des Adressraumes als eine gute Idee angesehen wurde. Auch der Ansatz in 64-Bit-Betriebssystemen.

Verwandte Themen