Der Unterschied zwischen statischem Bereich, Stapel und Heap im Linux-Speicher

Statischer Bereich : Speichern Sie automatische globale Variablen und statische Variablen (einschließlich statischer globaler und lokaler Variablen). Der Inhalt des statischen Bereichs existiert im Lebenszyklus des gesamten Programms und wird beim Kompilieren vom Compiler zugewiesen.

Stapel ist ein Stapel : Speichern Sie lokale Variablen, und ihr Speicherplatz wird vom Betriebssystem automatisch zugewiesen und freigegeben. Der Inhalt auf dem Stapel existiert nur innerhalb des Funktionsumfangs, und die Parameter werden auf dem Stapel übergeben, wenn die Funktion während der Ausführung des Programms aufgerufen wird. Wenn die Ausführung der Funktion beendet ist, wird der Inhalt automatisch zerstört . Es zeichnet sich durch hohe Effizienz, aber begrenzten Platzbedarf aus.

  • Natürlich verfügt der Stapel auch über eine dynamische Zuordnung, die von der Alloca-Funktion zugewiesen wird, aber die dynamische Zuordnung des Stapels unterscheidet sich von der des Heaps: Seine dynamische Zuordnung wird vom Compiler ohne manuelle Implementierung freigegeben. Es ist erwähnenswert, dass die Alloca-Funktion zwar verwendet werden kann, um die dynamische Zuweisung von Stapelspeicher zu realisieren, die Portabilität der Alloca-Funktion jedoch sehr schlecht ist und es schwierig ist, sie auf einer Maschine ohne herkömmlichen Stapel zu implementieren. Daher sollte es nicht in weit portierten Programmen verwendet werden. Natürlich können Sie das Array variabler Länge in C99 verwenden, um die Alloca-Funktion zu ersetzen.

Heap ist ein Heap : Sein Speicherplatz wird manuell zugewiesen/freigegeben, z. B. der Speicher, der durch die Malloc-Reihe von Funktionsoperatoren zugewiesen wird. Sein Lebenszyklus wird durch freie usw. bestimmt. Besteht bis zum Ende des Programms bis zur Veröffentlichung. Es zeichnet sich durch flexible Nutzung und relativ viel Platz aus, allerdings kann man leicht Fehler machen.

Für Heap und Stack:

1) Problem der Zuordnungsfragmentierung

Für den Heap führt die häufige Zuweisung und Freigabe (malloc/free) von Heap-Speicherplatz unterschiedlicher Größe unweigerlich zu einer Diskontinuität im Speicherraum, was zu einer großen Anzahl von Fragmenten führt, was zu einer verringerten Programmeffizienz führt; für den Stapel tritt dieses Problem jedoch auf nicht vorhanden.

2) Effizienz der Verteilung

Wie wir alle wissen, ist der Stapel eine Datenstruktur, die vom Maschinensystem bereitgestellt wird. Der Computer unterstützt den Stapel auf der untersten Ebene. Beispielsweise wird ein spezielles Register zum Speichern der Adresse des Stapels zugewiesen. Die Effizienz ist relativ hoch. Im Allgemeinen stellt das System Speicher für das Programm bereit, solange der verbleibende Speicherplatz im Stapel größer als der angeforderte ist. Andernfalls wird eine Ausnahme gemeldet, die auf einen Stapelüberlauf hinweist.

Der Heap ist anders, er wird von der C/C++-Funktionsbibliothek bereitgestellt und sein Mechanismus ist ziemlich kompliziert. Um beispielsweise einen Teil des Heap-Speichers zuzuweisen, sollten Sie zunächst wissen, dass das Betriebssystem über eine verknüpfte Liste verfügt, die freie Speicheradressen aufzeichnet. Wenn das System eine Anwendung von einem Programm empfängt, durchläuft es die verknüpfte Liste, um die zu finden Der erste Heap-Knoten, dessen Speicherplatz größer als der angeforderte Speicherplatz ist, und dann den Knoten aus der Liste der freien Knoten löschen und den Speicherplatz des Knotens dem Programm zuweisen. Bei den meisten Systemen wird die Größe dieser Zuweisung an der ersten Adresse dieses Speicherplatzes aufgezeichnet, sodass die Löschanweisung im Code diesen Speicherplatz korrekt freigeben kann. Da außerdem die Größe des gefundenen Heap-Knotens nicht unbedingt genau der angeforderten Größe entspricht, fügt das System den redundanten Teil automatisch wieder in die freie Liste ein. Offensichtlich ist die Zuordnungseffizienz des Heaps viel geringer als die des Stapels.

3) Beschränkung der Anwendungsgröße

Da das Betriebssystem eine verknüpfte Liste zum Speichern freier Speicheradressen verwendet (der Speicherbereich ist nicht kontinuierlich) und die Durchlaufrichtung der verknüpften Liste von der niedrigen zur hohen Adresse verläuft. Daher ist die Anwendungsgröße des Heap-Speichers durch den verfügbaren virtuellen Speicher im Computersystem begrenzt.

Der Stapel ist anders: Es handelt sich um einen kontinuierlichen Speicherbereich, und die Wachstumsrichtung seiner Adresse ist nach unten gerichtet, und er wächst in Richtung abnehmender Speicheradresse. Es ist ersichtlich, dass die Adresse der Oberseite des Stapels und die maximale Kapazität des Stapels im Allgemeinen vom System vorgegeben werden. Wenn der angeforderte Speicherplatz den verbleibenden Speicherplatz des Stapels überschreitet, wird ein Überlauffehler angezeigt. Es ist ersichtlich, dass der vom Stapel verfügbare Speicherplatz im Vergleich zum Heap relativ klein ist.

4) Gespeicherter Inhalt

Für den Stapel wird er im Allgemeinen zum Speichern von Funktionsparametern und lokalen Variablen verwendet. Wenn beispielsweise eine Funktion aufgerufen wird, wird (in der Hauptfunktion) als Erstes die Adresse der nächsten Anweisung beim Aufruf (d. h. die nächste ausführbare Anweisung der Funktionsaufrufanweisung) in den Stapel verschoben dann die Parameter der Funktion. In den meisten C-Compilern werden Parameter von rechts nach links auf den Stapel geschoben und schließlich lokale Variablen in der Funktion (beachten Sie, dass statische Variablen nicht auf den Stapel geschoben werden).

Supongo que te gusta

Origin blog.csdn.net/weixin_42432281/article/details/85268625
Recomendado
Clasificación