Wenn ein Prozess gestartet wird, erhält er seinen eigenen virtuellen Adressraum. Die Größe des virtuellen Adressraums hängt von Ihrem Betriebssystem ab. Im Allgemeinen erhalten 32-Bit-Prozesse 4 GiB (4 Giga-Binär) -Adressen und 64-Bit-Prozesse erhalten 18 EiB (18 Exa-Binär) -Adressen.
Sie können auf keinen Fall auf etwas zugreifen, das nicht Ihrem virtuellen Adressraum zugeordnet ist, da per Definition alles, was dort nicht zugeordnet ist, keine Adresse für Sie hat. Sie können versuchen, auf Bereiche Ihres virtuellen Adressraums zuzugreifen, die derzeit keinem zugeordnet sind. In diesem Fall erhalten Sie eine segfault-Ausnahme.
Nicht alle Adressräume sind zu irgendeinem Zeitpunkt auf etwas abgebildet. Es kann auch nicht alles abgebildet werden (wie viel davon abgebildet werden kann, hängt vom Prozessor und vom Betriebssystem ab). Auf aktuellen Generation Intel Prozessoren können bis zu 256 TiB Ihres Adressraums abgebildet werden. Beachten Sie, dass Betriebssysteme das weiter einschränken können. Zum Beispiel für 32-Bit-Prozesse (mit bis zu 4 GiB-Adressen) Windows reserviert standardmäßig 2 GiB für das System und 2 GiB für die Anwendung (aber es gibt eine Möglichkeit, 1 GiB für das System und 3 GiB für die Anwendung).
Wie viel von dem Adressraum verwendet wird und wie viel zugeordnet wird, ändert sich, während die Anwendung ausgeführt wird. Mit betriebssystemspezifischen Tools können Sie überwachen, was der aktuell zugewiesene Speicher und der virtuelle Adressraum für eine laufende Anwendung sind.
Codeabschnitt, Datenabschnitt, BSS usw. sind Begriffe, die sich auf verschiedene Bereiche der vom Linker erstellten ausführbaren Datei beziehen. Im Allgemeinen ist Code von statischen unveränderlichen Daten getrennt, die von statisch zugewiesenen, aber veränderbaren Daten getrennt sind. Stack und Heap sind getrennt von allen oben genannten. Ihre Größe wird vom Compiler und dem Linker berechnet. Beachten Sie, dass jede Binärdatei über eigene Abschnitte verfügt. Daher werden alle dynamisch verknüpften Bibliotheken im Adressraum separat zugeordnet, wobei jeder Abschnitt eigene Bereiche aufweist. Heap und Stack sind jedoch nicht Teil des Binärbildes, es gibt im Allgemeinen nur einen Stack pro Prozess und einen Heap.
Die Größe des Stapels (zumindest der anfängliche Stapel) ist im Allgemeinen fest. Compiler und/oder Linker haben im Allgemeinen einige Flags, mit denen Sie die Größe des Stacks zur Laufzeit festlegen können. Stacks "wachsen im Allgemeinen rückwärts", weil die Anweisungen des Prozessor-Stacks so funktionieren. Wenn Stacks in eine Richtung wachsen und der Rest in dem anderen wächst, ist es leichter, Speicher in Situationen zu organisieren, in denen beide unbegrenzt sein sollen, aber nicht wissen, wie viel jede davon wachsen kann.
Heap bezieht sich im Allgemeinen auf alles, was beim Start des Prozesses nicht vorab zugewiesen wird. Auf der untersten Ebene gibt es mehrere logische Operationen, die sich auf die Heap-Verwaltung beziehen (nicht alle sind so implementiert, wie ich hier in allen Betriebssystemen beschreibe).
Während der Adressraum fest ist, verfolgen einige Betriebssysteme, welche Teile davon derzeit vom Prozess zurückerlangt werden. Auch wenn dies nicht der Fall ist, muss der Prozess selbst den Überblick behalten. Die Operation auf der niedrigsten Ebene besteht also darin, tatsächlich zu entscheiden, dass eine bestimmte Region des Adressraums verwendet wird.
Die zweite Low-Level-Operation besteht darin, das Betriebssystem anzuweisen, diese Region etwas zuzuordnen.Dies kann im allgemeinen
einige Speicher, die nicht
Speicher swappable ist, die dem System Auslagerungsdatei
Speicher, der auf eine andere Datei ist swappable und kartiert swappable und kartiert ist
Speicher, der im schreibgeschützten Modus ausgetauscht und einer anderen Datei zugeordnet werden kann
dieselbe Zuordnung, dass eine andere virtuelle Adreßbereich
die gleiche Abbildung, die einen anderen virtuellen Adreßbereich zugeordnet wird, zu
abgebildet wird, aber in abzubildenden nur Modus
dieselbe Zuordnung, dass eine andere virtuelle Adresse Region ausgelesen , aber auf Schreibmodus mit den kopierten Daten in Kopie an die Datei Default Swap abgebildet
Es können auch andere Kombinationen, die ich vergessen, aber das sind die wichtigsten sind.
Natürlich hängt der gesamte Speicherplatz davon ab, wie Sie ihn definieren. Der aktuell verwendete Arbeitsspeicher unterscheidet sich vom aktuell zugeordneten Adressraum. Aber wie ich oben schrieb, sollten Betriebssystem-abhängige Tools Sie herausfinden lassen, was gerade passiert.
Keine Programmierfrage. – unwind