2016-08-03 43 views
-1

Im folgenden Link gibt die Antwort von Sdaz MacSkibbons einen kurzen Überblick über den Prozessadressraum auf virtuellen Adresssystemen.Prozessadressraum auf virtuellen Adresssystemen

What happens when a computer program runs?

Nehmen wir nun an jeder Prozessraum 4 GB virtuellen Adresse bekommt. Nun bedeutet das, dass die oberen Adressen dieses virtuellen Adressraums einen Stack-Teil erhalten (angenommen, die Stack-Adresse beginnt bei 0) und der Adressraum von unten wird Text, Daten, Globals und Heap zugewiesen. Da sich die Größe des Heapspeichers ändert, werden neue malloc-Zuordnungen die virtuellen Adressraumseiten direkt dem realen Speicher zuordnen oder prüfen, ob die zuvor zugewiesenen virtuellen Adressseiten frei/verfügbar sind. Und wie wäre es, wenn wir eine große Menge an Heap-Speicher, wie zum Beispiel mehr als 4 GB, benötigen, als wie unterstützt der Prozess das?

Vielen Dank im Voraus.

+0

Hängt vom Betriebssystem ab. Erstellen Sie ein C-Programm mit printf mit% p, um die Adressen lokaler Variablen (stacK) im Vergleich zu zugewiesenen (malloc()) Variablen im Vergleich zu Adressen von statischen Variablen (Programmdaten) im Vergleich zu Adressen von Funktionen (Zeiger auf Funktion) auszugeben. .... Ein Teil des virtuellen Adressraums wird für das Betriebssystem verwendet. Es gibt auch einige Daten, die sich auf jeden laufenden Thread beziehen (wie der Startwert für rand()) (FS- oder GS-Segmentregister können verwendet werden, um auf diesen zuzugreifen, oder er könnte in den virtuellen Adressraum abgebildet werden). – rcgldr

Antwort

1

Die Antwort, die Sie verlinken, zeigt einfach, wie die Dinge gemacht werden können.

Angenommen, Sie haben einen logischen 4-GB-Adressraum, nicht alle davon sind möglicherweise gültige oder sogar potenziell gültige virtuelle Adressen.

Ein Teil dieses logischen Adressraums wird dem System gewidmet. Es ist unwahrscheinlich, dass das System den gesamten ihm zugewiesenen logischen Adressbereich verwendet oder annähernd verwendet.

Es gibt weitere Bereiche im logischen Adressraum, die keine gültigen logischen Adressen haben.

Als nächstes ist die Beschreibung von Speicher als Heap und Stack irreführend. Heap und Stack sind einfach Lese-/Schreibspeicher. Es gibt nichts Besonderes an ihnen, und dem Betriebssystem ist es egal, wofür der Speicher verwendet wird.

Denken Sie an Programmteile als Sein: - Ausführbare, nur lesbar - Keine ausführen, lesen/schreiben - Keine ausführen, nur lesbar

Ihre zweite Frage ist über malloc. Malloc-Implementierungen verwalten Pools mit Lese-/Schreibspeicher. Malloc versucht, eine Speicheranforderung zu verarbeiten, indem Speicher aus dem Pool zurückgegeben wird. Wenn nicht genügend Speicher verfügbar ist, erhöht malloc die Größe des Pools, indem mehr virtueller Speicher auf den logischen Adressraum abgebildet wird.

Wenn Anwendungen große Speichermengen zuweisen müssen, verwenden sie normalerweise kein malloc. Sie Betriebssystem-Dienste stattdessen. Wenn Sie einen 4-GB-Adressraum haben, können Sie keine Blöcke mit mehr als 4 GB zuweisen.