Virtual memory
Virtual memory, på dansk ofte kaldet virtuel hukommelse, er en hukommelsesstyringsteknik i operativsystemet, der gør det muligt for programmer at bruge mere hukommelse, end der reelt er installeret som fysisk RAM i computeren.
Teknikken skaber en form for hukommelses-abstraktion, hvor operativsystemet kombinerer den fysiske RAM med ledig plads på en disk, så det for hvert enkelt program ser ud, som om det har adgang til et stort, sammenhængende hukommelsesområde. I praksis arbejder hvert program med sit eget virtuelle adresserum, mens operativsystemet og processoren i baggrunden holder styr på, hvor data faktisk befinder sig.
Et hverdagseksempel: En bærbar computer med begrænset RAM har samtidig et regneark, et videoopkald og en snes browserfaner åbne. Når den fysiske RAM er ved at være fuld, flytter operativsystemet automatisk data, som ikke bruges lige nu, midlertidigt over på disken. Brugeren mærker typisk ikke selve flytningen, men programmerne fortsætter med at køre, i stedet for at systemet går ned eller nægter at åbne flere programmer.
Sådan virker virtuel hukommelse
Hvert kørende program tildeles et virtuelt adresserum, som operativsystemet styrer. Programmet kender kun sine egne virtuelle adresser og ved ikke, om dataene reelt ligger i RAM eller på disken. Adresserummet opdeles i faste blokke kaldet sider (pages), typisk på nogle få kilobyte hver. Denne opdeling gør det muligt at flytte enkelte dele af et program frem og tilbage mellem hukommelse og disk efter behov, i stedet for at hele programmet skal ligge i RAM på samme tid.
Oversættelsen fra en virtuel adresse til en fysisk adresse i RAM foretages af en hardwarekomponent i processoren kaldet Memory Management Unit (MMU). MMU’en bruger sidetabeller, som operativsystemet vedligeholder, til at slå op, hvilken fysisk placering en given virtuel side svarer til. Hvis en side, programmet efterspørger, ikke aktuelt findes i RAM, opstår der et såkaldt page fault. Operativsystemet stopper processen kortvarigt, henter den manglende side fra disken, opdaterer sidetabellen og lader derefter programmet fortsætte. Sker det for ofte, fordi systemet konstant flytter data frem og tilbage mellem RAM og disk, kan man opleve såkaldt thrashing, hvor computeren bruger mere tid på at flytte hukommelse end på at udføre det egentlige arbejde.
De data, der midlertidigt flyttes ud af RAM, gemmes i en sidefil (også kaldet en swap-fil) på lagerdrevet. Fordi en harddisk eller SSD harddisk arbejder markant langsommere end RAM, mærkes brugen af sidefilen typisk som en opbremsning i systemet – jo mere virtuel hukommelse der bruges, desto større er risikoen for, at man oplever hakken eller længere svartider.
Virtuel hukommelse i Windows, Linux og macOS
De store operativsystemer implementerer virtuel hukommelse på lidt forskellige måder. Windows bruger en sidefil kaldet pagefile.sys, som som udgangspunkt styres automatisk af systemet, men som kan konfigureres manuelt under systemindstillingerne for ydeevne. Linux benytter typisk en dedikeret swap-partition, oprettet ved installationen, eller alternativt en swap-fil, og lader den erfarne bruger justere, hvor aggressivt systemet swapper via kommandolinjeværktøjer. macOS håndterer i høj grad virtuel hukommelse automatisk og komprimerer inaktiv hukommelse, før der overhovedet skrives til en swap-fil, hvilket i mange tilfælde reducerer behovet for at bruge disken. Fælles for alle tre platforme er, at virtuel hukommelse som udgangspunkt bør forblive aktiveret, også på systemer med rigelig RAM, fordi operativsystemet bruger mekanismen som en del af sin generelle hukommelsesstyring.
Enheder med meget begrænset fysisk RAM, som en Raspberry Pi, læner sig ofte kraftigt op ad swap-funktionen for overhovedet at kunne køre flere programmer eller tungere opgaver samtidig, hvilket illustrerer, hvor afgørende virtuel hukommelse kan være på hardware med få gigabyte RAM.
Fordele og ulemper ved virtuel hukommelse
Virtuel hukommelse gør det muligt at køre programmer, der tilsammen kræver mere hukommelse, end der fysisk er til rådighed, og bidrager dermed til bedre multitasking. Fordi hvert program får sit eget adresserum, opnår systemet også en vis grad af isolation mellem processer, så ét program normalt ikke uforvarende kan overskrive et andet programs data. For udviklere gør teknikken det desuden lettere at programmere, da man kan arbejde med et stort, sammenhængende hukommelsesområde uden selv at skulle håndtere fragmentering af den fysiske RAM.
Til gengæld har mekanismen en tydelig pris i form af ydeevne. RAM leverer data til processoren markant hurtigere end selv en hurtig SSD, og enhver gang systemet må hente data fra sidefilen i stedet for RAM, mærkes det som en forsinkelse. Bruges virtuel hukommelse i stort omfang over længere tid, kan det derfor gøre en ellers hurtig computer mærkbart langsommere, og den mest effektive løsning er som regel at udvide den fysiske RAM snarere end blot at forlade sig på en større sidefil.
Hvorfor virtuel hukommelse bruges
Virtual memory bruges, fordi det giver operativsystemet et sikkerhedsnet mod at løbe tør for hukommelse midt i en arbejdsopgave. I stedet for at et program crasher eller nægter at starte, kan systemet midlertidigt låne plads på disken. Teknikken understøtter desuden mere avancerede funktioner som memory-mapped files og deling af biblioteker mellem flere processer, som begge bygger videre på abstraktionen med virtuelle adresser. Samlet set er virtuel hukommelse en grundlæggende del af, hvordan moderne operativsystemer fordeler en begrænset mængde fysisk hukommelse mellem mange samtidige programmer.