Was ist der Unterschied zwischen Adressraum, Laufzeitkeller und Halde?

2 Antworten

Von Experte Erzesel bestätigt

"Laufzeitkeller" und "Halde" hab ich in dem Zusammenhang noch nie gehört. Laut Google sind damit aber anscheinend der Stack und der Heap-Speicher gemeint.

Der Stack oder Stapelspeicher ist ein Speicherbereich wo man einfach Daten ablegen und wieder holen kann. Normalerweise redet man in dem Zusammenhang von den Befehlen "push" und "pop". Mit push kann man einen Wert auf den Stapel packen und mit pop kann man einen Wert wieder vom Stapelspeicher laden. Dabei muss man ein bisschen auf die Reihenfolge achten, damit die Variablen in der richtigen Reihenfolge wieder beschrieben werden. Beispiel: push a, push b, push c, pop c, pop b, pop a, damit alle drei Variablen wieder ihre ursprünglichen Werte haben.

Der Heap wird auch "dynamischer Speicher" genannt. Wenn du eine Variable initialisierst, wird im Heap eine freie Stelle gesucht, wo die Variable gespeichert werden kann. Wenn der Heap voll ist, läuft die Garbage Collection und räumt den Speicherplatz von nicht mehr benötigten Variablen wieder frei.

Mit Adressraum werden einfach Start und Endadresse für die verschiedenen Speicher bezeichnet. Z.B. der Programmspeicher (wo die Befehle drinstehen) geht von 0x0000 bis 0x3fff, der Heap geht von 0x4000 bis 0xefff und der Rest (von 0xf000 bis 0xffff) ist Stack.

KathaHohenfels 
Fragesteller
 29.11.2022, 18:15

Der Adressraum ist also keine extra Speicherart neben Heap und Stack?

1
daCypher  30.11.2022, 08:00
@KathaHohenfels

Nein, der Adressraum ist wie gesagt einfach nur der Bereich, der für eine bestimmte Speichersorte reserviert ist. Normalerweise sagt man auch dazu, von welchem Adressraum die Rede ist. Z.B. der Heap-Adressraum ist 0x4000 bis 0xefff oder so. Mit Adressraum kann aber auch der gesamte adressierbare Speicher gemeint sein. Bei meinen Beispielen mit Adressen zwischen 0x0000 bis 0xffff ist der Adressraum z.B. 64kiB groß, weil man mit zwei Bytes nur 65536 Adressen zur Verfügung hat und jede Adresse standardmäßig ein Byte groß ist.

1
KathaHohenfels 
Fragesteller
 30.11.2022, 08:30
@daCypher

gibt es denn einen nicht-adressierbaren Speicher? wenn ja, was ist das für ein Speicher?

0
daCypher  30.11.2022, 10:25
@KathaHohenfels

Das ist dann nicht nutzbarer Speicher. Z.B. kann ein 32 Bit Computer nur 4GB RAM addressieren. Wenn du jetzt aber einen 8GB RAM-Riegel eingebaut hast, ist die Hälfte davon einfach nicht nutzbar.

Oder bezogen auf Programme: Heutige Rechner laufen alle im "protected mode". Das heißt, sie haben keinen Zugriff auf den gesamten Arbeitsspeicher, sondern es gibt nur einen Prozess, den Kernel, der wirklich Zugriff auf den gesamten Speicher hat und wenn ein neues Programm gestartet wird, kann es über Softwareinterrupts beim Kernel mehr Speicherplatz anfragen oder wieder freigeben. Wenn das Programm versucht, auf Speicher zuzugreifen, der nicht für das Programm reserviert ist, wird eine Fehlermeldung angezeigt und das Programm beendet.

0

Der Laufzeitkeller (engl. stack) wird verwaltet nach dem Prinzip "last in = first out".

Ganz anders die Halde (engl. heap): In ihr wird Speicher portionsweise an im Prinzip beliebiger Stelle allokiert und deallokiert. Eben deswegen ist dort hin und wieder Neuorganisation notwendig mit dem Ziel, zu starke Zerstückelung des noch freien Speichers zu vermeiden.

Der physische Adressraum ist der gesamte Hauptspeicher eines Computers.

Darin allokiert wird (als heap und/oder stack) der logische Adressraum der einzeln gestarteten Prozesse. Er ist Summe sog. Seiten (engl. pages), die bei Bedarf im physischen Adressraum allokiert und deallokiert werden.