Was ist die physische Darstellung des Heaps und des Stapels?

9

Ich kann leicht verstehen, wie .bss und der Code physikalische Darstellungen im Prozessor haben, der eine Speicherbank für die Anweisungen hat, die ein Programmzähler hochzählen kann, und das bss (Blockstart-Symbol) sind nur globale Daten. Aber dann gibt es den Stapel für lokale Variablen und den Heap für den dynamischen Speicher. Wie werden diese Dinge physisch auf die Strecke gebracht?

Niklas
quelle

Antworten:

6

Hinweis: Ich beziehe mich hauptsächlich auf x86, da ich damit am besten vertraut bin und es weitgehend dokumentiert ist:

Auf x86 (und den meisten anderen Architekturen) befindet sich der Stapel wie alles andere nur im Speicher . Der Prozessor manipuliert den Stapel über einen Zeiger, der normalerweise in einem Register (dem Stapelzeiger) gespeichert ist. Push- und Pop-Anweisungen ändern den Wert des Stapelzeigers und ändern, wo sich die Oberseite des Stapels befindet.

Der Heap ist eine Software-Abstraktion . Wie der Name schon sagt, handelt es sich nur um einen RAM-Klumpen, auf den ein Allokator aufteilt und Zeiger verteilt. In physischer Hinsicht sieht der Heap nicht anders aus als jeder andere Teil des RAM.

Paging und Segmentierung hängen jedoch tangential mit dem Heap zusammen. Sie haben hauptsächlich mit Multitasking zu tun, bei dem Prozesse RAM nicht ändern dürfen, das sie nicht explizit besitzen.

Mathew Hall
quelle
3
Beim Paging geht es mehr um die Speicherverwaltung im Allgemeinen - die Einheit, auf der der physische Speicher einer logischen Adresse zugeordnet ist - als nur um Zugriffsbeschränkungen, obwohl letztere tendenziell als zusätzliches Merkmal der Speicherverwaltungseinheit angewendet werden.
Chris Stratton
4

Logischerweise sind der Stapel und der Heap normalerweise nur Speicher; Auf Implementierungsebene werden sie hoffentlich hauptsächlich aus dem Cache bereitgestellt. In den meisten Systemen gelangen sie dynamisch über Caching-Algorithmen dorthin, aber es gab Systeme, die die explizite Speicherung im Cache oder in einem anderen Speicher unterstützen, der schneller als üblich ist, und wahrscheinlich auch solche, die das Hinterlassen von Hinweisen unterstützen, dass bestimmte Daten für die Platzierung dort eine bevorzugte Priorität haben sollten Platz erlaubt.

Das Design von Software- und Compiler-Codegeneratoren auf niedriger Ebene berücksichtigt hoffentlich die Organisation des Datenzugriffs, was wahrscheinlich zu einer guten Cache-Auslastung im Vergleich zu ständigen Cache-Fehlern führt.

Einige Prozessoren verfügen über ein Rücksprungadressenregister, das als eine Art expliziter Stapelspeicher mit einer Tiefe fungiert (es gibt wahrscheinlich auch solche mit mehreren tiefen Hardwarestapeln, obwohl Beispiele nicht in den Sinn kommen).

Chris Stratton
quelle