Virtuel hukommelse er en teknik til at administrere hukommelse, som bruges i de fleste moderne computere og er en grundlæggende del af moderne styresystemer. Ideen er, at hvert program får sit eget sammenhængende "virtuelle" adresseområde, så programmet kan antage, at det har en blok hukommelse af en given størrelse til rådighed. Denne virtuelle hukommelse gælder uanset, om den faktiske data fysisk ligger i computerens hovedhukommelse (RAM), eller er skrevet ud til disk.
Problemstillingen: flere programmer, begrænset RAM
Hardware (den fysiske del af computeren, f.eks. CPU'en eller grafikkortet) kører software, og denne software har brug for computerhukommelse for at kunne køre. De fleste computere kører samtidig flere programmer (kendt som multiprocessing), men maskinen har kun et begrænset antal processorer og en begrænset mængde RAM. Virtuel hukommelse gør det muligt at lade flere programmer køre samtidig, selvom den samlede mængde krævet hukommelse overstiger den fysiske RAM.
Hvordan det virker (kort)
Det centrale princip er, at hver proces ser en egen række virtuelle adresser, som oversættes til fysiske adresser af systemet. Oversættelsen håndteres af en kombination af hardware og software:
- På hardware-siden er det Memory Management Unit (MMU) i CPU'en, der foretager selve oversættelsen fra virtuelle adresser til fysiske adresser og håndhæver adgangsrettigheder.
- På software-siden (styresystemets kerne) ligger sidekartoteket (page tables), styring af sidefejl og politikker for, hvilke sider der skal være i RAM eller på disk.
- Der findes også en hurtig cache i CPU'en, kaldet TLB (Translation Lookaside Buffer), der gemmer nylige adresseoversættelser for at gøre opslag hurtigere.
Paging og page faults
Virtuel hukommelse opdeles normalt i små faste størrelser kaldet sider (pages), og den fysiske hukommelse opdeles i sidepladser (page frames). Når en proces forsøger at få adgang til en virtuel side, som ikke er i RAM, opstår en page fault (sidefejl). Styresystemet håndterer denne afbrydelse: det finder den ønskede side på disk (typisk i et swap-område eller i en sidefil), indlæser den i RAM, opdaterer sidekartoteket og genoptager processen. Hvis RAM er fuld, må en eksisterende side blive fjernet (eventuelt skrevet ud til disk først, hvis den er ændret) for at give plads.
Paging vs. swapping
Begrebet "paging" refererer typisk til håndteringen af enkelte sider. "Swapping" kan betyde at flytte hele processer ud til disk, men i moderne systemer bruges oftere demand paging, hvor kun de nødvendige sider indlæses efter behov. Dette gør hukommelsesudnyttelsen mere fleksibel og effektiv.
Sideudskiftning og algoritmer
Når styresystemet skal vælge, hvilke sider der skal fjernes fra RAM, bruger det en sideudskiftningsalgoritme. Almindelige metoder er:
- FIFO (First-In, First-Out)
- LRU (Least Recently Used) eller tilnærmelser til LRU
- Clock-algoritmen (en effektiv approximation af LRU)
Begreber som "working set" bruges til at beskrive den mængde sider en proces typisk har brug for i et givet tidsrum; hvis systemet konstant bruger tid på at loade sider frem og tilbage (såkaldt thrashing), er det et tegn på, at der er for lidt fysisk hukommelse i forhold til belastningen.
Fordele ved virtuel hukommelse
- Isolering og sikkerhed: Hver proces får sit eget virtuelle addressrum, hvilket forhindrer en proces i at læse eller skrive i en anden process hukommelse uden tilladelse.
- Effektiv hukommelsesudnyttelse: Kun de sider, der reelt bruges, behøver at være i RAM.
- Deling: Samme fysiske sider (f.eks. fælles biblioteker) kan kortlægges ind i flere processers virtuelle rum uden at kopiere data.
- Copy-on-write: Meget effektiv deling ved for eksempel fork—kopiering af sider sker først hvis én af processerne ændrer indholdet.
- Større adresserum: Programmer kan bruge et større logisk hukommelsesrum, end der fysisk er til rådighed.
Ulemper og begrænsninger
Der er også ulemper:
- Performance: Sidefejl er dyre, fordi indlæsning fra disk er langt langsommere end adgang til RAM. Hyppige sidefejl kan føre til lav ydeevne.
- Ikke-deterministisk svartid: Fordi en sideadgang nogle gange kræver diskadgang, bliver svartiden uforudsigelig. Derfor undlader mange indlejrede systemer, især realtidsstyringer, at bruge fuld virtuel hukommelse eller undgår sideudskiftning for at opretholde garanterede svartider.
- Administrationsomkostning: Opdatering af sidekartoteker, TLB-misses og sideudskiftninger kræver CPU- og IO-ressourcer.
Praktiske detaljer og optimering
Sidestørrelser varierer (typisk 4 KiB, men også større som 2 MiB eller 1 GiB i moderne systemer via "huge pages"). Systemer kan tunes på forskellige måder for at reducere swapping: mere RAM, justering af systemets swap-politikker (fx hvor aggressivt styresystemet begynder at skrive ud), brug af hurtigere lagring (SSD), eller låse kritiske sider i hukommelsen på realtidskrævende systemer.
Hardware vs. software-ansvar
Det er vigtigt at skelne rollerne: CPU'en (gennem MMU og TLB) foretager hurtig adresseoversættelse, mens styresystemet vedligeholder sidekartoteker, håndterer sidefejl og beslutter, hvilke sider der skal indlæses eller udskiftes. Altså er det ikke CPU'ens aritmetisk-logiske enhed (ALU), der udfører oversættelserne; det er MMU/hardware med støtte fra OS.
Sammenfatning
Virtuel hukommelse (paging) er en kraftfuld mekanisme, som tillader effektiv og sikker udnyttelse af begrænset fysisk hukommelse ved at kombinere RAM og disklagring transparent for programmer. Den giver isolering, deling og fleksibilitet, men kan skabe performance-udfordringer, især i systemer med stramme responskrav.

