Geheugenbeheer is een van de basisfuncties van het besturingssysteem. Met moderne besturingssystemen kan elk proces meer virtueel geheugen krijgen dan de totale grootte van het werkelijke (fysieke) geheugen op een bepaald computersysteem. Het belangrijkste doel van geheugenbeheer is dat door het combineren van groot maar langzaam geheugen met een klein maar snel geheugen, het effect van groter snel geheugen wordt bereikt.
Het scheiden van vaste en variabele partitionering is niet effectief in termen van geheugengebruik, aangezien vaste partitionering resulteert in interne, terwijl dynamische in externe fragmentatie. Een mogelijke oplossing voor het probleem van fragmentatie is om het proces niet naar een continu geheugenblok te laten schrijven. Het programma kan willekeurig in het geheugen worden verspreid. In dit geval is het werkgeheugen verdeeld in kleinere blokken van vaste grootte, frames genaamd. De logische adresruimte van het programma is ook verdeeld in blokken van dezelfde grootte, pagina's genaamd. Wanneer een programma in het geheugen wordt ingevoerd, worden de pagina's in vrije geheugenkaders geschreven. Voor het gemak van het overbrengen van programma's van een schijf naar een werkgeheugen, is de schijf ook verdeeld in frames van dezelfde grootte als de geheugenframes. Aldus wordt één frame van de schijf geschreven in één frame van het werkgeheugen. Het pagingsysteem werkt op de volgende manier: wanneer het programma wordt geaccepteerd voor uitvoering, wordt de grootte berekend, die wordt uitgedrukt met het vereiste aantal pagina's. Als er voldoende frames beschikbaar zijn, wordt het proces opgeslagen op de geheugenpagina per pagina. Tegelijkertijd wordt het aantal frames waarin elke pagina is geschreven ingevoerd in de frametabel.
Het gebruikersprogramma en bijbehorende gegevens kunnen worden onderverdeeld in een aantal segmenten. Segmenten van alle programma's hoeven niet van dezelfde grootte te zijn, hoewel er een maximale segmentlengte is. Net als bij paging bestaat het logische adres dat de segmentatie gebruikt uit twee delen, in dit geval het aantal segmenten en dislocaties binnen dat segment. Vanwege het gebruik van segmenten van verschillende grootten, is segmentatie vergelijkbaar met dynamische partitionering. Bij afwezigheid van een overlay-schema of gebruik van virtueel geheugen, is het vereist dat alle programmasegmenten in het geheugen worden geladen voor uitvoering. Het verschil met dynamische partitionering is dat segmentering meer dan één partitie kan hebben en die partitie niet aangrenzend hoeft te zijn. Segmentatie lost het probleem van interne fragmentatie op, maar net als dynamische partitionering blijft het probleem van externe fragmentatie bestaan. Omdat het proces echter is verdeeld in een aantal kleinere delen, is de externe fragmentatie meestal kleiner. In tegenstelling tot paging die onzichtbaar is voor de programmeur, is segmentatie meestal zichtbaar en geschikt voor het organiseren van programma's en gegevens. Voor modulaire programmering kan het programma of de gegevens verder worden onderverdeeld in verschillende kleinere segmenten. Het nadeel van deze techniek is dat de programmeur de beperkingen van de maximale segmentgrootte kent. Het volgende gemak van het gebruik van segmenten van verschillende grootten is dat er geen potentiële verbinding is tussen logische en fysieke adressen. Net als bij paging, maakt de eenvoudige segmenteringstechniek gebruik van een segmententabel voor elk proces en een lijst met beschikbare blokken in het hoofdgeheugen.
Paging levert een virtuele en een fysieke adresruimte en een secundaire geheugenruimte op blokken (pagina's) van gelijke lengte. Hierdoor kan de continue virtuele adresruimte worden toegewezen aan het proces van verspreiding (niet noodzakelijkerwijs continu gedistribueerd) in de reële adresruimte en het secundaire geheugen. Zelfs de pagina verwijst als term naar geheugen in plaats van naar logische objecten die zichtbaar zijn op programmaniveau. Segmentatie levert een virtuele adresruimte op blokken (segmenten) die direct overeenkomen met objecten op programmaniveau. Vanwege dit heeft het segment geen vaste lengte, dus zelfs de segmentgrootte kan tijdens de uitvoering van het programma worden gewijzigd. Bescherming en deling zijn daarom mogelijk op objectniveau en er zijn zichtbare processen waarbij segmentatie wordt uitgevoerd.
De ontwikkelaar van de app is niet op de hoogte van de paging. Hij schrijft programma's alsof het geheugen lineair is, en het besturingssysteem en de processor maken zich zorgen over het partitioneren en converteren naar virtuele adressen. Programmeur op segmentatiesystemen vermeldt echter twee delen van het adres, segment en pagina in hun programma's. Alle pagina's hebben dezelfde grootte terwijl de segmenten anders zijn. Segmentatie heeft meerdere lineaire adresruimten en er wordt slechts één gepaafd. Segmenten maken logische partitionering en bescherming van applicatiecomponenten mogelijk en pagina's niet.
Paging, dat transparant is voor de programmeur, elimineert externe fragmentatie en zorgt zo voor een efficiënt gebruik van het hoofdgeheugen. De stukken die in en uit het hoofdgeheugen bewegen, zijn vast en even groot, dus het is mogelijk om geavanceerde algoritmen voor geheugenbeheer te ontwikkelen die het gedrag van het programma benutten. Segmentatie is zichtbaar voor de ontwikkelaar en heeft de mogelijkheid om de groei van gegevensstructuur, modulariteit en ondersteuning voor uitwisseling en bescherming te beheren.
paging | Segmentatie |
vaste pagina's | segmenten hebben geen vaste grootte |
onzichtbaar voor programmeur | zichtbaar voor programmeur |
een lineaire adresruimte | meerdere lineaire adresruimten |
staat geen logische partitionering en bescherming van applicatiecomponenten toe | toestaat |