Geheugenbeheer
Geheugenbeheer is een paradigma bij het programmeren van computerprogramma's. Het is één van de belangrijkste activiteiten binnen de werking van een computer welke op alle niveaus terugkomt van hardware tot aan applicatiesoftware.
Inhoud
Introductie[bewerken]
Tijdens het theoretisch ontwerpen van een programma wordt veelal gewerkt met een model waarbij oneindig veel geheugen voorhanden is en oneindig veel variabelen naast elkaar aangemaakt worden. Ook hogere programmeertalen bieden de programmeur een berekenbaarheidsmodel aan waarin hij zich niet hoeft te bekommeren om de plaatsing van variabelen en datastructuren in het geheugen.
Het geheugen van een computer is echter een eindige "sliert" bytes. Als voor een bepaalde taak in de computer geheugen nodig is, dan dient een deeltje van deze sliert daarvan toegewezen te worden. Idealiter dient het mogelijk te zijn dat op ieder willekeurig moment een ononderbroken deelsliert van een willekeurige lengte opvraagbaar moet zijn.
Goed geheugenbeheer deelt het geheugen zo in dat zo goed als mogelijk aan deze wens voldaan kan worden. Vanzelfsprekend dient zo min mogelijk geheugen voor het geheugenbeheer zelf nodig zijn en dient geheugenbeheer zo ontworpen te worden dat het opvragen en vrijgeven van geheugen snel en efficiënt mogelijk te zijn.
Deze eisen zijn op veel punten tegenstrijdig. Zo is het voor de snelheid van het geheugenbeheer gunstig als meer ruimte gebruikt mag worden voor het beheer ervan. Echter als een relatief groot percentage van het geheugen voor het beheer ervan gebruikt wordt blijft weinig ruimte over om er iets zinnigs meer te doen.
Een groot gevaar bij geheugenbeheer is fragmentatie van het geheugen. Als bijvoorbeeld verspreid door het hele geheugen op gelijke afstanden blokjes geheugen toegewezen zijn, dan wordt het onmogelijk om nog een aaneengesloten stuk geheugen te vinden met een grootte groter dan die afstand. Fragmentatie ontstaat doordat geheugen niet noodzakelijk in dezelfde volgorde wordt vrijgegeven als dat het toegewezen wordt.
Geheugenbeheer op hardwareniveau[bewerken]
Als een schijf gefragmenteerd is. Dit is dat er een bestand uit 2 of meerdere fragmenten bestaat en op de harde schijf is gezet. Een normaal bestand staat op 1 plek op de harde schijf, maar een gefragmenteerd bestand staat op 2 plaatsen op de schijf. Hierdoor moet er als het bestand geopend wordt, op 2 plaatsen op de harde schijf dit van de cluster worden uitgelezen. Dit duurt langer en hierdoor wordt je computer traag. Wat je hiertegen kunt doen is het defragmenteren van de schijf. Dan worden deze fragmenten die op verschillende plaatsen staan, op 1 plaats op de harde schijf gezet. Hierdoor zijn ze makkelijker uitleesbaar en wordt je computer sneller. Op elke computer van Microsoft Windows is er dit programma aanwezig. Dit is te vinden door met de rechter muisknop op een partitie te klikken en dan kies je extra opties. Dan kun je je schijf defragmenteren. Meer informatie hierover vind je op de pagina defragmentatie
Geheugenbeheer op besturingssysteemniveau[bewerken]
Het besturingssysteem op een computer is verantwoordelijk te reageren op geheugenverzoeken van programma's. Het bepaalt van het totale fysieke geheugen welk deel aan welk programma wordt toegewezen. Verder beheert het besturingssysteem virtueel geheugen. Hierbij wordt een ongebruikt deel van een programma op schijf bewaard waardoor dit geheugen vrij komt voor gebruik door andere programma's. Dit geheugenbeheer gebeurt tegenwoordig veelal volgens het principe van geheugenpaginering waardoor het fragmentatieprobleem minder wordt. Veelal is het echter toch nodig om aaneengesloten stukken geheugen te kunnen opvragen voor bijvoorbeeld hardwarebuffers waar door het probleem ook vandaag nog bestaat.
Geheugenbeheer op applicatieniveau[bewerken]
Computerprogramma's bouwen voor hun werking voortdurend datastructuren op en breken deze weer af. Datastructuren gebruiken geheugen en dus wisselt de hoeveelheid benodigd geheugen voortdurend. Voor elk lid van een datastructuur het besturingssysteem aanroepen om hier geheugen voor toegewezen te krijgen is te inefficiënt.
In plaats hiervan vragen programma's geheugen in grote brokken op van het besturingssysteem en verdelen dit weer verder onder. Deze brokken vormen dus weer slierten bytes welke volgens het geheugenbeheer van het applicatieprogramma beheerd worden.
Geheugenbeheer op applicatieniveau kan in twee categorieën verdeeld worden:
- Handmatig geheugenbeheer. Hierbij dient de programmeur voor zijn datastructuren met de hand geheugen aan de vragen en dit zodra het niet meer nodig is weer vrij te geven.
- Automatisch geheugenbeheer. Hierbij gebruikt een datastructuur geheugen zodra deze wordt aangemaakt. Dit geheugen blijft bezet totdat een zogenaamde garbage collector geheugen dat niet meer gebruikt is opzoekt en weer vrijgeeft.
Automatisch geheugenbeheer is op dit moment (2005) populair omdat de programmeur minder omkijken naar het geheugen heeft. Garbage collectors staan traditioneel bekend als traag en kunnen een programma op een willekeurig moment onderbreken. Het geheugengebruik van een programma met automatisch geheugenbeheer is afhankelijk van hoe vaak de garbage collector zijn werk doet. Vaak hebben dit soort programma's dan ook grote, ongebruikte stukken geheugen in gebruik.
Echter, moderne technieken voor garbage collectors hebben deze bezwaren al voor een groot deel tenietgedaan en het is inmiddels duidelijk dat automatische geheugenbeheerstechnieken geen algoritmische complexiteitsverslechteringen hoeven te betekenen. Ook komen hier en daar meldingen dat automatisch geheugenbeheer zelfs sneller dan handmatig geheugenbeheer kan zijn.
Voorlopig is hiervan nog maar een deel van in praktijk gebracht; programmeertalen met handmatig geheugenbeheer als C en Pascal houden voorlopig een compactheids- en snelheidsverschil in stand in vergelijking tot de talen met automatisch geheugenbeheer zoals Java en C#. Zij leveren voor de eindgebruiker compactere en minder in het systeem ingrijpende programma's op. Dit is waarschijnlijk de belangrijkste reden waarom een volledige overstap naar automatisch geheugenbeheer vooralsnog uitblijft.