2009-07-31 8 views
2

mögliche Dubletten:
How is heap and stack memories mananged, implemented, allocated?
Stack,Static and Heap in C++Wie wird Heap und Stack-Speicher mananged, implementiert, zugeordnet

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

Wie ist jeder implementiert? Wie wird es verwaltet (hohes Niveau)? Stellt gcc einen Speicherbereich vor, der für den Stack und den Heap verwendet werden soll, und dann auf Anfrage verteilt? Kommt der Originalspeicher aus dem RAM?

Kann eine Funktion auf dem Heap anstelle eines Stapels zugewiesen werden?

   --Clarification-- 

Ich frage wirklich über die Implementierung und Verwaltung von Heap-und Stapelspeicher. After reading referenced question, Ich habe nichts gefunden, das das anspricht ... danke für den Link

+3

Genaues Duplikat geschlossenen Frage: http://stackoverflow.com/questions/1212797/how-is-heap-and-stack-memories-mananged-implemented-allocated-closed – Pete

+2

Bitte nicht erneut posten, wenn Leute deine Frage als Duplikat schließen (und ich habe dafür gestimmt, deine andere Frage erneut zu öffnen, aber ich werde dafür stimmen, diese als Duplikat zu schließen). – Zifre

+0

@pete Blick auf die Kommentare des genauen Duplikats. thx –

Antwort

10

Ich denke, zu Ihrer Frage kann man leicht mindestens einige Kapitel für das Buch über Betriebssysteme schreiben. Ich empfehle Ihnen, Tanenbaum zu lesen: Moderne Betriebssysteme.

Hauptunterschied zwischen Heap und Stack, der eine pro Prozesselement, der andere pro Threadelement. Anfangs, wenn das Programm gestartet wird, erhält es einen minimalen Heap und ein Stack-Segment. Heap ist gewachsen, Stack ist statisch (für jeden Thread). Wenn Sie eine rekursive Funktion schreiben, die nicht terminiert (endlose Rekursion), erhalten Sie einen Stapelüberlauf;) Jeder Funktionsaufruf hat einen Stapelrahmen auf dem Stapelsegment, wenn die Funktion verlässt, der Stapel abgewickelt wird und der Rahmen frei ist nächste Funktion. Stack ist eine kontinuierliche lineare Struktur. Unter Linux können Sie die Stapelsegmentgröße für einen Prozess über eine Umgebungsvariable konfigurieren. Unter Windows (zumindest mit MS Visual C++) können Sie ein Linker-Flag mit der Größe des Stack-Segments übergeben. Stapelüberläufe können auch erzeugt werden, wenn zur Kompilierungszeit ein großes Array zugewiesen wird:

char test[1000000]; 

Heap ist eine andere Geschichte. Wenn ein Prozess gestartet wird, ist die Größe des Heapspeichers ein Standardwert und kann von Betriebssystem zu Betriebssystem oder von der Konfiguration auf diesem Betriebssystem abweichen (z. B. unter Windows sind es standardmäßig 2 MB, soweit ich mich daran erinnere). Außerdem, wenn Sie mehr Heap benötigen, um mehr Platz für Variablen usw. zu reservieren, wird es wachsen. Wenn das Programm keinen Heap-Speicher freigibt, läuft es nicht mehr (oder im Heap-Speicher). Es gibt verschiedene Datenstrukturen für die Heap-Implementierung, von denen einige binäre Baumderivate sind, einige nicht z. Fibonacci Heap (Wald der Bäume). Sie können einige Artikel lesen, um einen Speicherzuordner zu schreiben. Diese Datenstrukturen müssen für das Auffinden des Heap-Knotens optimiert werden, wenn ein zugewiesener Chunk freigegeben werden muss, oder für das Anhängen (Finden eines freien Chunks), wenn neuer Heap-Space benötigt wird.

Jeder Prozess auf einem 32-Bit-Betriebssystem hat 4 GB virtuellen Adressraum. Wie Sie sich vorstellen können, kann es nicht so viel RAM geben, wo alle Prozesse mit ihren 4 GB virtuellen Adressraum passen. Der Arbeitsspeicher des Betriebssystems ist in Seiten organisiert, die in HD umgewandelt werden, wenn sie nicht mehr benötigt werden oder abgelaufen sind. Hier kommt Paging zum Einsatz. Alles wird auf Seiten abgebildet: ein Prozess mit dem Stapel oder dem wachsenden Heap. Aufgrund der Struktur des Heaps, der dynamisch wächst, kann er auf mehreren Seiten platziert werden. Dies ist der Grund, warum der Heap-Zugriff sehr teuer sein kann, da, wenn die Seite nicht im Speicher ist, ein Seitenfehler auftritt und das Betriebssystem eine Seite von der Platte laden muss (und dies kann um Größenordnungen langsamer sein). Der Stapelrahmen des ablaufenden Threads befindet sich im Prozessor-Cache, der viel schneller ist als der RAM.

Es sind verschiedene Heap-Typen möglich, es gibt sehr schnelle Heaps für kleine Objekte oder Haufen, die in Multithread-Umgebungen sehr effizient sind. Alexandrescu beschreibt in "Modern C++ Design", wie man kleine Object Allocator und einen Heap, der kleine Objekte verwaltet, entwickelt. Diese Implementierung ist in seiner Loki C++ - Bibliothek verfügbar. Einige eingebettete Systeme bieten physikalisch unterschiedliche Speicherbereiche, in denen verschiedene Heap-Typen implementiert werden können. Einen eigenen Allokator (Heap-Manager usw.) zu schreiben, ist ein harter Job, wenn man einen Compiler besiegen will.

Grüße,
Ovanes

+0

Es wäre schön, wenn dies zu ultraman andere, praktisch identische Frage bewegt werden könnte, http://stackoverflow.com/questions/1212797/how-is-heap-and-stack-memories-mananged-implemented-allocated ... – SamB

Verwandte Themen