Was ist Dynamische Speicherreservierung?

Reservieren von Speicher in der benötigten Größe während der Programmausführung und Freigeben nach der Verwendung. In C reserviert malloc(Größe) den Speicher und liefert die Anfangsadresse, free(Adresse) gibt ihn frei. calloc liefert einen mit 0 initialisierten Bereich, realloc einen Bereich mit geänderter Größe. Schlägt die Reservierung fehl, wird NULL zurückgegeben, was geprüft werden muss. Der Bereich liegt auf dem Heap und bleibt bis zur Freigabe auch nach der Rückkehr aus der Funktion bestehen. Auf kleinen Mikrocontrollern wird sie oft vermieden, weil Fragmentierung und die Dauer der Reservierung schwer vorherzusagen sind.

Japanische Bezeichnung: 動的メモリ確保

„Dynamische Speicherreservierung“ kommt in 7 Übungsfragen aus 4 Themen vor, z. B. Grundlagen der Programmiersprache C, Linker, Loader und ausführbare Formate, Embedded Systems und Firmware.

Fachgebiet: Grundlagen der Programmiersprache C

Jetzt üben: Fragen zu Dynamische Speicherreservierung

Aus welchem Bereich eines Prozesses wird der mit malloc in C reservierte Speicher im Allgemeinen genommen?

  1. AAus der Section .text
  2. BAus dem Heap
  3. CAus der Section .rodata
Antwort und Erläuterung anzeigen

Antwort: B. Aus dem Heap

Der Heap ist der Bereich, in dem zur Laufzeit Speicher in der benötigten Größe angefordert und bei Nichtgebrauch mit free zurückgegeben wird. Kennzeichnend ist, dass sich Größe und Lebensdauer erst zur Laufzeit festlegen lassen. malloc verwaltet den freien Platz selbst und fordert bei Bedarf vom Betriebssystem eine Vergrößerung an (unter Linux über die Systemaufrufe brk oder mmap). Wird free vergessen, bleibt ungenutzter Speicher bestehen, was einen Speicherleck (Memory Leak) ergibt.

Wie heißt das Phänomen, dass sich nach wiederholtem malloc und free zwar insgesamt genug freier Speicher findet, aber ein großer zusammenhängender Bereich nicht mehr reserviert werden kann?

  1. ASpeicherleck (Memory Leak)
  2. BFragmentierung
  3. CStack Overflow
Antwort und Erläuterung anzeigen

Antwort: B. Fragmentierung

Werden Bereiche unterschiedlicher Größe wiederholt reserviert und freigegeben, verteilen sich kleine freie Lücken zwischen den belegten Bereichen. Auch wenn die Summe des freien Speichers groß ist, schlägt die Reservierung eines großen Bereichs fehl, wenn kein großer zusammenhängender freier Bereich vorhanden ist. Dies nennt man Fragmentierung. Speicherallokatoren verringern sie, indem sie nach Größen getrennt verwalten oder benachbarte freie Bereiche zusammenfassen. Bei lange laufenden Embedded-Geräten ist besondere Vorsicht geboten.

„Dynamische Speicherreservierung“ in den Erläuterungen

Fragen mit „Dynamische Speicherreservierung“ (7)

  1. Aus welchem Bereich eines Prozesses wird der mit malloc in C reservierte Speicher im Allgemeinen genommen?
  2. Wie heißt das Phänomen, dass sich nach wiederholtem malloc und free zwar insgesamt genug freier Speicher findet, aber ein großer zusammenhängender Bereich nicht mehr reserviert werden kann?
  3. Warum wird in der Firmware kleiner Mikrocontroller häufig auf dynamische Speicherbelegung wie malloc verzichtet?
  4. Welche Kombination gibt in C die Zeitspanne (Lebensdauer) richtig an, in der (1) eine in einer Funktion ohne static deklarierte lokale Variable, (2) ein mit malloc reservierter Bereich und (3) eine außerhalb von Funktionen deklarierte Variable existieren?
  5. Was ist bei der unter Linux in NUMA-Systemen häufig verwendeten First-Touch-Strategie (die Seite wird im Speicher des Knotens abgelegt, auf dem der Thread läuft, der sie als Erster beschreibt) zu beachten?
  6. fill und use seien separat definierte Funktionen. Welches Problem hat die obige Funktion?
  7. Was trifft auf den Zeiger zu, den die obige Funktion make zurückgibt?

Verwandte Begriffe

Heap Speicherleck (Memory Leak) Variable Stack (Stapelspeicher) Zeiger (Pointer) Fragmentierung Mikrocontroller NUMA (Non-Uniform Memory Access) Seitenfehler (Page Fault) Array

Zur Glossarübersicht