Vroeger hadden computers erg weinig geheugen. Om toch grote programma's te kunnen
draaien heeft men een techniek bedacht waarbij men werkt met overlays.
Als een programmeur een programma schrijft dan deelt hij dat zelf in in stukken die in het
geheugen passen. Bij het uitvoeren wordt dan een zo'n stuk in het werkgeheugen
gezet totdat een ander stuk nodig is. Het programma haalt zelf dit nieuwe stuk
op en plaatst het in het geheugen.
Door dit principe te automatiseren en onder te brengen in het operating
system heeft men de techniek van virtueel geheugen ontwikkeld.
Een CPU heeft meestal een groter adresseerbereik dan er daadwerkelijk
aan werkgeheugen (fysieke adresruimte) aanwezig is. Bij paging wordt het adresseerbereik verdeeld
in stukken van vaste grootte die we pages noemen.
Het echte werkgeheugen wordt daarop
afgebeeld via een vertaalslag van speciale hardware die we MMU noemen
(memory management unit).
Van een programma zijn alleen bepaalde pages aanwezig, namelijk die waar de CPU
mee bezig is. Komt de CPU bij de uitvoering op een niet aanwezig page dan detecteerd de mmu dat en genereert een pagetrap (exception).
Via het operating system wordt de informatie die voor die page nodig is
van disk gehaald en kan het programma worden doorgestart.
Voordeel is dat elk programma in principe het totale geheugenbereik (virtuele
adresruimte) ter
beschikking heeft en er eenvoudig meer programma's afwisselend door de
CPU uitgevoerd kunnen worden (multitasking).
Ook hoeft de programmeur zich niet om dit systeem te bekommeren. Paging
is transparant voor de applicatieontwikkelaar.
Voor paging is schijfruimte nodig. De gegeven moeten ergens beschikbaar zijn.
De MMU houdt met een pagetabel bij welke fysieke pages op welk virtueel adres worden
afgebeeld en welke pages ook echt aanwezig zijn.
Bij verwijzing naar een niet aanwezig page ontstaat een pagetrap, pagainafout of
page fault. De CPU komt dan in het operating system. Het operating system grijpt in en kan de niet aanwezig pagina van disk halen en in het werkgeheugen
zetten. Op deze wijze wordt elke keer
een pagina op verzoek ingevoerd. We noemen dit demand paging.
Op een gegeven moment bevinden zich een hoeveelheid pages in het werkgeheugen.
De CPU haalt daar instructies van op of schrijft of leest gegevens.
De verzameling pages die door de laatste 'k' geheugenreferenties worden
genruikt noemt men de werkset. Zo'n werkset zou redelijk stabiel in de tijd kunnen zijn en een aanwijzing kunnen zijn welke pages echt van belang zijn.
Deze zouden dan bij voorkeur geladen moeten worden bij het opstarten van een
programma.
Als al het fysieke geheugen in gebruik is hebben we een algoritme
nodig om een pagina te kiezen die weg mag ten koste van een nieuwe.
Bestudeer de volgende begrippen die hiermee samenhangen:
- LRU. Least recently used. De pagina die het langs niet gebruikt is
wordt overschreven.
- FIFO. First in First out. De pagina die de meesta pagetraps heeft
meegemaakt gaat eruit ten koste van een nieuwe.
- trashing. Trashing is een verschijnsel dat zich voordoet als telkens
net een pagina is weggehaald die vervolgens weer nodig is. Dit geeft een
zware vertraging van het systeem.
Pagina's hebben een grootte die een macht van twee is. 512 bytes is mogelijk
maar meer gebruikelijk is 4K of 8K. Ook 64K wordt soms gebruikt.
Probleem is dat de laatste page bijna nooit helemaal vol is.
Gemiddeld half gevuld. Dit heet interne fragmentatie.
Kleine pages hebben een kleinde interne fragmentatie, maar hebben een
grote pagetable nodig. Ook zullen er bij kleine pages vaker pagetraps
voorkomen.
Een programma bestaat uit een aantal logische delen. Ze kennen we de stack,
de plaats waar variabelen staan en het gedeelte waar de machinecode
staat. We noemen dit segmenten. Bij segmentatie heeft elk segment zijn eigen adresruimte.
We kunnen per segment bepaalde permissies zetten. Zo zal het codesegment
read-only zijn zodat een programma niet per abuis zijn eigen code
kan veranderen.
Bekijk de voors en tegens van segmentatie ten opzichte van paging
Segmenten hebben een variable grootte. Een probleem dat zich hierbij
voordoet is externe fragmentatie. Er vallen gaten van ongebruikt geheugen
tussen de segmenten
Segmentatie kan gecombineerd worden met paging om dit probleem op te lossen.
De Pentium II ondersteunt de twee genoemde vormen van virtueel geheugen
alsmede de combinatie van de twee. Dus:
- paging
- segmentatie
- segmentatie met paging
De Pentium II gebruikt hiervoor twee tabellen te weten de LDT (Local
Descriptor Table) (een voor elk programma) en een enkele GDT
(Global descriptor table).
Om paging te grbuiken worden in principe alle segmenten op dezelfde
adresruimte afgebeeld. We hebben dan een lineair adresruimte van 4GByte.
De Pentium kent vier protectie niveaus:
- kernel
- system calls
- shared libraries
- user programs
Bij NT heeft elk proces een geheugenruimte van 4 GByte. De onderste 2 zijn voor het proces. De bovenste 2GByte is voor de kernel.
Een virtuele pagina kent drie toestanden:
- vrij
- toegewezen
- gereserveerd
pages kunnen gedeeld worden tussen meer processen. NT kent een of meer
paging files.
Samenvatting COSY2
This document was generated using the
LaTeX2HTML translator Version 2002 (1.62)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 2 tan6.tex
The translation was initiated by Leo van Moergestel on 2003-05-26
Leo van Moergestel
2003-05-26