16/06/2011
I hjertet af ethvert moderne operativsystem ligger en kompleks, men elegant proces kendt som hukommelsesstyring. En af de mest fundamentale teknikker inden for dette felt er paging. Paging er en metode, der tillader et programs fysiske adresserum at være ikke-sammenhængende, hvilket løser mange af de problemer, der plagede tidlige computersystemer. Denne teknik er afgørende for effektiv multitasking og virtuel hukommelse. I denne artikel vil vi dykke ned i, hvad paging er, hvordan det fungerer, dets fordele og ulemper, samt de hardwarekomponenter, der gør det muligt.

Den Grundlæggende Metode bag Paging
Kernen i paging er en simpel, men kraftfuld idé: at opdele hukommelsen i faste, lige store blokke. Denne opdeling sker på to niveauer:
- Logisk Hukommelse: Det adresserum, som CPU'en genererer for et program, opdeles i blokke af samme størrelse kaldet sider (pages).
- Fysisk Hukommelse: Den faktiske RAM i computeren opdeles i blokke af samme størrelse kaldet rammer (frames).
Det er afgørende, at størrelsen på en side er nøjagtig den samme som størrelsen på en ramme. Når et program skal afvikles, indlæses dets sider i tilgængelige rammer i den fysiske hukommelse. Fordi siderne kan placeres i hvilken som helst ledig ramme, behøver de ikke at ligge ved siden af hinanden i RAM. Dette eliminerer problemet med ekstern fragmentering, hvor der er nok samlet ledig hukommelse, men den er opdelt i små, ikke-sammenhængende stykker, der er for små til at rumme et nyt program.
Operativsystemet holder styr på alle ledige rammer. Når et program har brug for 'n' sider, finder operativsystemet 'n' ledige rammer og indlæser siderne. Det er muligt, at den sidste side i et program ikke fylder en hel ramme, hvilket fører til et andet, mindre problem, som vi vil se på senere.
Adresseoversættelse: Fra Logisk til Fysisk
CPU'en arbejder med logiske adresser; den ved ikke, hvor i den fysiske RAM dataene rent faktisk befinder sig. Det er Memory Management Unit (MMU), en hardwarekomponent, der har til opgave at oversætte den logiske adresse til en fysisk adresse i realtid. En logisk adresse genereret af CPU'en består af to dele:
- Sidenummer (p): Angiver, hvilken side i processens logiske adresserum der skal tilgås.
- Side-offset (d): Angiver den specifikke adresse eller byte inden for den pågældende side.
For at udføre oversættelsen bruger MMU'en en datastruktur kaldet en sidetabel (page table). Hver proces i systemet har sin egen sidetabel. Sidetabellen er i bund og grund en tabel, der mapper hver side i den logiske hukommelse til en ramme i den fysiske hukommelse.

Processen for oversættelse er som følger:
- CPU'en genererer en logisk adresse (p, d).
- Sidenummeret (p) bruges som et indeks i processens sidetabel for at finde det tilsvarende rammenummer (f).
- Rammenummeret (f) kombineres med side-offset'et (d) for at danne den endelige fysiske adresse.
- Denne fysiske adresse sendes til hukommelsesbussen for at tilgå data i RAM.
Offset'et (d) ændres ikke under oversættelsen, da det repræsenterer den relative position inden for en side/ramme, som har samme størrelse.
Udfordringen med Sidetabeller og Løsningen: TLB
Sidetabellen for hver proces gemmes i hovedhukommelsen (RAM). En speciel CPU-register, kendt som Page Table Base Register (PTBR), peger på starten af den aktuelle process' sidetabel. Dette skaber en betydelig ydeevne-flaskehals. For at tilgå en enkelt byte i hukommelsen kræver systemet nu to hukommelsesadgange:
- Én adgang for at slå rammenummeret op i sidetabellen.
- Én adgang for at hente den faktiske data fra den beregnede fysiske adresse.
Dette halverer effektivt hukommelsesadgangshastigheden, hvilket er uacceptabelt. Løsningen på dette problem er en specialiseret, lille og ekstremt hurtig hardware-cache kaldet en Translation Lookaside Buffer (TLB).
TLB'en er en associativ hukommelse, hvor hver post indeholder en nøgle (sidenummer) og en værdi (rammenummer). Når MMU'en skal oversætte en adresse, sker følgende:
- TLB-opslag: Først tjekkes TLB'en for sidenummeret.
- TLB Hit: Hvis sidenummeret findes i TLB'en, hentes rammenummeret øjeblikkeligt derfra. Dette er ekstremt hurtigt og kræver næsten ingen ekstra tid. Den fysiske adresse kan dannes med det samme.
- TLB Miss: Hvis sidenummeret ikke findes i TLB'en, skal MMU'en foretage den langsomme adgang til sidetabellen i RAM. Når rammenummeret er fundet, bliver parret af (sidenummer, rammenummer) tilføjet til TLB'en, så det er tilgængeligt for hurtig opslag næste gang. Hvis TLB'en er fuld, skal en eksisterende post erstattes.
Da de fleste programmer udviser lokalitetsprincippet (dvs. de har tendens til at tilgå de samme hukommelsesområder gentagne gange), er hit-raten i TLB'en typisk meget høj (ofte over 99%), hvilket betyder, at den gennemsnitlige hukommelsesadgangstid er meget tæt på kun at være én hukommelsesadgang.
Sammenligning af Hukommelsesadgang
| Egenskab | Uden TLB | Med TLB (ved Hit) | Med TLB (ved Miss) |
|---|---|---|---|
| Antal Hukommelsesadgange | 2 (Sidetabel + Data) | 1 (Kun Data) | 2 (Sidetabel + Data) |
| Adgangshastighed | Langsom | Meget Hurtig | Langsom |
| Hardwarekompleksitet | Lavere | Højere | Højere |
Fordele og Ulemper ved Paging
Som enhver anden teknologi har paging sine styrker og svagheder.

Fordele
- Eliminerer Ekstern Fragmentering: Dette er den primære fordel. Enhver ledig ramme kan bruges, hvilket fører til meget mere effektiv udnyttelse af hukommelsen.
- Enkel Algoritme: Allokering af hukommelse er simpelt. Operativsystemet skal blot vedligeholde en liste over ledige rammer.
- Grundlag for Virtuel Hukommelse: Paging er den underliggende mekanisme, der gør det muligt for systemer at implementere virtuel hukommelse, hvor dele af et program kan midlertidigt gemmes på harddisken.
Ulemper
- Intern Fragmentering: Selvom ekstern fragmentering er løst, introducerer paging intern fragmentering. Dette sker, fordi et program sjældent har en størrelse, der er et præcist multiplum af sidestørrelsen. Den sidste side er derfor ofte kun delvist fyldt. Da en hel ramme skal allokeres til denne side, går den resterende plads i rammen tabt.
- Hukommelsesoverhead fra Sidetabeller: For processer med et stort adresserum kan sidetabellen selv blive meget stor og optage en betydelig mængde RAM.
- Ydelsesomkostninger: Uden en TLB med en høj hit-rate ville paging være for langsomt til praktisk brug på grund af de dobbelte hukommelsesadgange.
Ofte Stillede Spørgsmål (FAQ)
Hvad er forskellen på en side og en ramme?
En side er en fast størrelse blok af logisk hukommelse (det adresserum, som programmet ser). En ramme er en fast størrelse blok af fysisk hukommelse (den faktiske RAM). De har altid samme størrelse, så en side passer perfekt ind i en ramme.
Hvorfor er paging nødvendigt?
Paging er nødvendigt for at løse problemet med ekstern fragmentering, som opstår, når ledig hukommelse bliver opdelt i små, ubrugelige stykker. Ved at tillade, at et programs hukommelse spredes ud over ikke-sammenhængende fysiske rammer, kan systemet udnytte den tilgængelige RAM meget mere effektivt.
Hvad er intern fragmentering?
Intern fragmentering er spild af hukommelse inden i en allokeret blok. I konteksten af paging sker det, når den sidste side af et program ikke fylder hele rammen, den er placeret i. For eksempel, hvis sidestørrelsen er 4 KB, og et program kun har brug for 1 KB på sin sidste side, vil de resterende 3 KB i rammen være spildt, da ingen anden proces kan bruge dem.
Hvis du vil læse andre artikler, der ligner Paging: Nøglen til Effektiv Hukommelse, kan du besøge kategorien Sundhed.
