Frage

  

Mögliche Duplikate:
   Wie wird Heap und Stack-Speicher mananged, Implementiert, zugeordnet?
   Stapel, Static und Heap in C ++

In C / C ++ wir Variablen speichern können, Funktionen, Member-Funktionen, Instanzen einer Klasse entweder auf einem Stapel oder einen Haufen.

Wie wird jedes umgesetzt? Wie ist es gelungen (hoher Pegel)? Hat gcc weist ihn vorab einen Teil des Speichers zu für den Stack und Heap verwendet werden, und doles dann auf Anfrage aus? Sind ursprüngliche Speicher vom RAM kommen?

Kann eine Funktion auf dem Heap statt einem Stapel zugeordnet werden?

             --Clarification--

Ich bitte wirklich um Implementierung und Verwaltung von Heap und Stack-Speicher. Nach referenzierten Frage lesen, ich nicht alles, was die Adressen gefunden haben .. . danke für den Link

War es hilfreich?

Lösung

Ich denke, auf Ihre Frage kann man leicht zumindest einige Kapitel für das Buch über Betriebssysteme schreiben. Ich schlage vor, Sie Tanenbaum zu lesen:. Moderne Betriebssysteme

Der Hauptunterschied von Heap und Stack, dass man pro Prozesselement, das andere pro Faden Artikel. Anfangs, wenn Programm gestartet wird, wird es einige minimale Haufen und einige Stapelsegment. Heap gezüchtet wird, Stapel ist statisch (für jeden Thread). Wenn Sie eine rekursive Funktion schreiben, die nicht (endlose Rekursion) nicht beenden Sie Stapelüberlauf erhalten wird;) Jeder Funktionsaufruf einen Stapelrahmen auf Stapelsegment hat, wenn die Funktion verlässt, ist der Stapel abgewickelt und Rahmen ist frei durch die verwendet werden nächste Funktion. Stack ist eine kontinuierliche lineare Struktur. Unter Linux können Sie die Stack-Segmentgröße für einen Prozess über eine Umgebungsvariable konfigurieren. An Fenstern (zumindest mit MS Visual C ++) kann man einen Linker-Flag mit der Größe des Stapelsegmentes übergeben. Stapelüberlauf kann auch erzeugt werden, wenn bei der Kompilierung einiger großen Array Zuweisung:

char test[1000000];

Heap ist eine andere Geschichte. Wenn ein Prozess-Heap-Größe startet einiger Standardwert und kann Form O OS oder Konfiguration variiert auf diesem Betriebssystem verwendet werden (zum Beispiel unter Windows ist es 2MB standardmäßig soweit ich mich erinnere). wenn Sie mehr Haufen Des weiteren müssen, um mehr Platz zuweisen für Variablen usw. wird es wachsen. Wenn das Programm nicht kostenlos Heap-Speicher läuft es davon aus (oder Heap-Speicher). Es gibt verschiedene Datenstrukturen für einige von ihnen sind Heap Umsetzung Binärbaum-Derivate, sind einige nicht z.B. Fibonacci-Heap (Wald von Bäumen). Sie können einige Artikel lesen usw., wie man einen Speicherzuordner zu schreiben. Diese Datenstrukturen müssen für die Suche nach dem Heap Knoten optimiert werden, wenn ein zugeordneter Brocken zu de-allocate muss oder Anhänge (einen freien Brocken zu finden), wenn neuer Heap-Speicher benötigt wird.

Jeder Prozess auf einem 32-Bit-OS hat 4 GB virtuellen Adressraum. Wie man sich vorstellen kann es nicht so viel RAM, wo alle Prozesse mit ihren 4Gbs Pass virtuellen Adressraum sein kann. OS-Speicher in Seiten organisiert, die auf HD getauscht werden, wenn nicht mehr benötigt werden oder verfallen. Dies ist, wo Paging kommt zu spielen. Alles ist auf Seiten abgebildet: ein Verfahren, mit dem Stapel oder dem wachsenden Haufen. Aufgrund der Struktur der Halde, die es dynamisch wächst, kann es auf mehreren Seiten platziert wird. Aus diesem Grunde Heap-Zugang kann sehr teuer sein, denn wenn die Seite ein Seitenfehler geschieht nicht im Speicher ist und O hat eine Seite von der Festplatte laden (und die durch Größenordnung langsamer sein kann). Stapelrahmen des Gewindes wird, ist in Prozessor-Cache ausgeführt, die viel schneller als RAM ist.

Verschiedene Haufen Typen möglich sind, könnte es Haufen sein, die für kleine Objekte oder Haufen sehr schnell sind, die in Multi-Threaded-Umgebungen sehr effizient sind. Alexandrescu beschreibt in „Moderne C ++ Design“, wie klein Objekt allocator und einen Haufen zu entwickeln, die kleinen Objekte verwaltet. Diese Implementierung ist in seiner Loki C ++ Bibliothek zur Verfügung. Einige eingebettete Systeme bieten physikalisch verschiedene Speicherbereiche, in denen verschiedene Haufen Typen implementiert ontop werden kann. eine eigene Allocator (Heap-Manager etc.) ist ein harter Job zu schreiben, wenn Sie einen Compiler schlagen wollen.

Grüße, Ovanes

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top