Wat is Dynamische geheugentoewijzing?

Tijdens de uitvoering van een programma geheugen van de benodigde grootte reserveren, en het weer vrijgeven als het niet meer wordt gebruikt. In C reserveert malloc(grootte) het geheugen en geeft het adres van het begin terug, en free(adres) geeft het vrij. calloc geeft een met nullen geïnitialiseerd gebied terug en realloc een gebied met een andere grootte. Bij een mislukking wordt NULL teruggegeven, dus het resultaat moet worden gecontroleerd. Het gebied ligt op de heap en blijft na het terugkeren uit functies bestaan tot het wordt vrijgegeven. Op kleine microcontrollers wordt het vaak vermeden vanwege fragmentatie en reserveringstijden die moeilijk te voorspellen zijn.

Japanse benaming: 動的メモリ確保

“Dynamische geheugentoewijzing” komt voor in 7 oefenvragen uit 4 onderwerpen, bijv. Basis van programmeren in C, Linker, loader en uitvoerbare formaten, Embedded systemen en firmware.

Vakgebied: Basis van programmeren in C

Nu oefenen: vragen over Dynamische geheugentoewijzing

Uit welk gebied van het proces wordt het met malloc in C gereserveerde geheugen in het algemeen genomen?

  1. ADe .text-sectie
  2. BDe heap
  3. CDe .rodata-sectie
Antwoord en toelichting tonen

Antwoord: B. De heap

De heap is het gebied waar tijdens uitvoering van het programma geheugen van de benodigde grootte wordt gereserveerd en met free wordt teruggegeven als het niet meer nodig is. Kenmerkend is dat grootte en levensduur tijdens uitvoering kunnen worden bepaald. malloc beheert zelf het vrije gebied en vraagt bij tekort het OS het gebied uit te breiden (op Linux met de systeemaanroepen brk of mmap). Als men vergeet free uit te voeren, blijft ongebruikt geheugen bestaan: een geheugenlek.

Bij herhaald malloc en free kan het voorkomen dat, ook al is het totaal aan vrij geheugen ruim voldoende, een groot gebied niet meer in één keer kan worden gereserveerd. Hoe heet dit verschijnsel?

  1. AGeheugenlek (memory leak)
  2. BFragmentatie
  3. CStack overflow
Antwoord en toelichting tonen

Antwoord: B. Fragmentatie

Bij herhaald reserveren en vrijgeven van gebieden van verschillende grootte raken kleine vrije stukken verspreid tussen gebruikte gebieden. Ook als het totaal aan vrije ruimte groot is, mislukt een grote reservering als er geen aaneengesloten groot vrij gebied is. Dit heet fragmentatie. Geheugenallocators beperken fragmentatie door per grootte te beheren en naburige vrije stukken samen te voegen. Bij embedded apparaten die lang blijven draaien, is hierop extra te letten.

“Dynamische geheugentoewijzing” in de toelichting

Vragen met “Dynamische geheugentoewijzing” (7)

  1. Uit welk gebied van het proces wordt het met malloc in C gereserveerde geheugen in het algemeen genomen?
  2. Bij herhaald malloc en free kan het voorkomen dat, ook al is het totaal aan vrij geheugen ruim voldoende, een groot gebied niet meer in één keer kan worden gereserveerd. Hoe heet dit verschijnsel?
  3. Wat is de juiste reden dat in de firmware van kleine microcontrollers vaak dynamische geheugenreservering zoals malloc wordt vermeden?
  4. Welke combinatie van de levensduur van (1) een lokale variabele die binnen een functie zonder static is gedeclareerd, (2) een met malloc gereserveerd gebied en (3) een variabele die buiten elke functie is gedeclareerd, is in C juist?
  5. Waarop moet worden gelet bij het first-touch-beleid dat vaak wordt gebruikt in Linux-NUMA-systemen (een pagina wordt geplaatst in het geheugen van het knooppunt waarop de thread draait die er het eerst naar schrijft)?
  6. fill en use zijn elders gedefinieerde functies. Wat is een probleem van de bovenstaande functie?
  7. Wat is juist over de pointer die de bovenstaande functie make teruggeeft?

Verwante termen

Heap Geheugenlek (memory leak) Variabele Stack (stapelgeheugen) Pointer Fragmentatie Microcontroller (MCU) NUMA Array Dangling pointer

Naar de woordenlijst