20 Februar 2008

Speichermodell

Im Programmierumfeld betrachten wir vier Speichersegmente:
  1. Code-Segement (auch Text-Segment genannt)
  2. Data-Segment
  3. Heap
  4. Stack
Im Code-Segment sind die ausführbaren (Programm-)Codezeilen gespeichert, übrigens auch der Startup-Code der vor der main ausgeführt und den Terminate-Code, der nach Beenden des eigentlichen Programms ausgeführt wird. Das Code-Segment ist während der Programmausführung read-only.
Im Data-Segement befinden sich die Daten, die über die gesammte Programmlaufzeit erhalten bleiben (globale und statische Variablen). Es besteht aus einem const-Bereich, und je einem Bereich für initialisierte und nicht-initialisierte Daten.
Das Heap-Segment ist gleichbedeutend mit dem freien Arbeitsspeicher, der zur Laufzeit allokiert werden kann.
Das Stack-Segment ist ein LIFO (Kellerspeicher) und nur durch push/pop , aber nicht wahlfrei zugreifbar. Auf dem Stack werden lokale Daten abgelegt, sowie Rücksprungadressen und Parameter von Funktionen.

Ablauf der Speicherzugriffe eines Programmes:
  1. nach compiling/binding -> load des Programmes (in den Prozessorspeicher)
  2. Loader legt Maschinenbefehle ins Code-Segment
  3. Instruktionszeiger zeigt auf den ersten auszuführenden Befehl im Code-Segment
  4. Programm im Code-Segment wird linear abgearbeitet.
  5. erfolgt ein Funktionsaufruf, wird in die entsprechende Stelle im Code-Segment gesprungen - der letzte Instruktionszeigerwert(Rücksprungadresse) wird auf dem Stack gelegt und die Einsprungadresse in den Instruktionszeiger geladen.
  6. beim Verlassen der Funktion wird die alte Adresse vom Stack geholt und das Programm bei der nächsten folgenden Adresse fortgesetzt.
  • Über den Stack können auch Parameter an die Funktion übergeben oder Return-Werte an das Hauptprogramm zurück gegeben werden.
  • Variablenübergaben (bei C/C++) erfolgen durch Übergabe der Werte, indem die Werte auf den Stack geschrieben werden. Entweder durch Schreiben des Wertes (primitive Datentypen) oder Aufruf des Copy-Konstruktors (Objekte und Klassen) -> Call-by-Value
  • Möchte man Call-by-Reference einsetzen, muss man explizit Zeiger oder Referenzen übergeben.

Labels: ,

0 Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]

<< Startseite