Minneshantering - grunderna
Föreläsning 2
Minneshantering
 Hur hantera grundfallet med endast en process?
 Hur kan flera processer vara aktiva, dvs vara i
minnet, samtidigt?
 Adressrymden
 Kontinuerlig allokering
 Siduppdelat minne (paging)
Kap: 3.1-3.3
OS Föreläsning 2,
Minneshantering
2
Adressrymden
Vad är det vi pratar om?
Minneshierarki
snabbare*
mindre
dyrare
register
cache
primärminne
elektronisk disk
magnetisk disk
långsammare*
större
billigare
optisk disk
magnetband
*http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html
4
Från program till process
källkod
kompilator
assemblator
objekt
modul
länknings
editor
andra
objekt
moduler
Dynamisk laddning: en kopia av
binärkoden för funktionen laddas vid
behov = första anropet
ladd
modul
system
bibliotek
laddare
dynamiskt
laddade
system
bibliotek
Dynamisk länkning: om någon process
har en kopia av binärkoden i minnet,
hitta den och länka in den, annars
länka in en egen kopia. Görs via stub- OS Föreläsning 2,
dynamisk länkning
Minneshantering
kod. (urspr. MULTICS)
in-memory
binary
memory
image
5
Minnesutrymmet som en process
behöver varierar oftast över tiden
STACK
HEAP
Stacken växer/krymper med
funktionsanrop.
Heapen växer när vi allokerar mer minne
på den för objekt/datastrukturer som
inte är lokala variabler eller parametrar
till funktioner.
Vad händer då minnet är slut?
TEXT
OS Föreläsning 2,
Minneshantering
6
Fysisk vs. logisk/(virtuell) adressrymd
 Fysisk adressrymd – adresser för minnespositioner i
datorns fysiska minne (~primärminnet)
 Logisk/(virtuell) adressrymd – abstrakt adressrymd
som programmet använder
ex: som programmerare behöver jag inte fundera på vilken fysiskadress
som används för att lagra en variabel som t.ex int a = 4;
 När ett program laddas i minnet för exekvering
måste en adressöversättning/adressbindning ske från
logiska adresser till fysiska adresser
OS Föreläsning 2,
Minneshantering
7
Allokeringsproblematiken
Hur allokerar vi fysiskt minne för
att ladda in ett program för
exekvering i?
Hur håller vi ordning på ledigt resp.
upptaget minne?
Hur sker adressöversättning?
OS Föreläsning 2,
Minneshantering
8
Adresser och adressbindning
 Relokerbar (flyttbar) kod: adresser anges som relativa
gentemot t.ex. programstart
 Ex. första instruktionen = lägsta adressen 0
 en relativ adress är icke-negativ (> 0)
 När binds en relativ adress till en fysisk (absolut) adress?
När vi vet var programmet laddas!
 Compile-time: kan generera absolut-adresserad kod
 Load-time: kompilatorn genererar relokerbar kod, översätt alla
relativa adresser till absoluta vid laddningen
 Execution-time: Om processen kan flyttas i minnet under
exekvering måste man skjuta upp adressbindningen till
exekveringstillfället. Kräver hårdvarustöd.
OS Föreläsning 2,
Minneshantering
9
Kontinuerlig allokering
Har använts historiskt.
Används fortfarande i små
system med begränsade
resurser.
En enkel minnesmodell – ex. MS-DOS
ROM
Bootkod
Drivrutiner
etc = BIOS
1024 K
Endast ett användarprogram i
taget
960 K
512 K
RAM
Användarprogrammet kan swappas
ut på disk; långsam multitasking
Användar
Program
Vad händer om OS växer?
User base
OS
Användarprogrammet kan skriva
över OS!
0
OS Föreläsning 2,
Minneshantering
11
Ett första steg mot flera processer
- fixa minnespartitioner
Idé: dela upp minnet i flera, fixa, partitioner
som var och en kan hålla en process (OS/360)
0xFFFF
Strategier när en
partition blir ledig:
Kö av väntande processer
Välj den process som:
Hur vet man på vilken
adress en variabel eller
funktion kommer att
ligga i minnet?
Kan ett program skriva
sönder ett annat?
OS
0
OS Föreläsning 2,
Minneshantering
i)
Är den första som får
rum i partitionen
ii)
Är den som passar
bäst, ger minst spill, i
partitionen
12
Skydd och adressbindning
– en första ansats
 Hur undviker vi att ett program skriver sönder andra
program eller OS:et?
 Låt adressöversättning/bindning skötas av en enkel
MMU!
 Gränsregister: anger högsta relativa adress som processen
tillåts accessa.
Skyddar andra processer.
 Basregister eller relokeringsregister innehåller värde som
adderas till relativa adresser
 (Kontrollera att ingen absolutadress otillåtet addresserar in
i OS:et, endast tillåtet om processen exekverar i ”kernelmode”)
OS Föreläsning 2,
Minneshantering
13
Exempel med basregister och
gränsregister
LOAD r2 <- (700)
ladda r2 med innehållet på adress 700
Minne
MMU
Logisk/(virtuell)
adress
700
CPU
Gränsregister
1500
<
Basregister
500
ja
+
2000
1200
nej
500
TRAP: adresseringsfel
OS Föreläsning 2,
Minneshantering
OS
0
14
Flera partitioner – så långt
Partition
1
Partition
2
Partition
3
OS
Varje partition har sina egna
Base och Limit värden
P1 limit
P2 limit, P1 base
P3 limit, P2 base
P3 base
Måste partitionerna ha fix storlek?
Hur mycket extra utrymme måste
finnas i en partition för att
processens stack och heap skall
kunna växa?
OS Föreläsning 2,
Minneshantering
15
Variabla partitioner
Processer kan ha vilken storlek som helst
(som ej är större än minnet)
Oallokerade partitioner (hål) bildas när en
liten process läggs i ett stort utrymme
Krångligare relokeringsproblem
Hur hålla ordning på ledigt minne?
OS Föreläsning 2,
Minneshantering
16
Ready-kö
Minne
Variabel storlek på partitioner
- ett exempel
P1
P3
P3
P2
P2
P1
P1
P4
P4
Process P4 får inte
plats pga.
fragmentering
P2
P3
P4
OS Föreläsning 2,
Minneshantering
17
Fragmentering
Extern fragmentering
 Ledigt utrymme finns, men är uppdelat i för små
block
 Löses med kompaktering (kostsamt) eller med att ha
en enda blockstorlek (leder till intern fragmentering)
Intern fragmentering
 Dåligt utnyttjande av minne inom allokerade block
 Löses med variabel blockstorlek (tillbaka till extern
fragmentering)
 Block som kunde växa och krympa vore allra bäst
OS Föreläsning 2,
Minneshantering
18
Hålla ordning på ledigt minne
-länkade listor
Länkad lista med hål (ledigt utrymme) med
 Startadress
 Storlek
 Hur ska listan sorteras?
Det beror på allokeringsmetoden!
Allokeringsmetoder:
1300
1000
800
700
Start:700 Size:100
•Next-fit
P3
Start:1000 Size:300
P1
400
•First-fit
•Best-fit
•Worst-fit
OS Föreläsning 2,
Minneshantering
•Quick-fit
19
Hålla ordning på ledigt minne
-bitmap
 Dela upp minnet i lika stora ”allokeringsenheter”
 Ha en bitmap där 0 representerar ledig och 1
upptagen allokeringsenhet
 Val av storlek på allokeringsenhet viktigt
 För liten – bitmappen blir för stor
 För stor – onödig intern fragmentering
P3
1
1
1
0
1
1
0
0
0
P1
OS Föreläsning 2,
Minneshantering
20
Måste en process ligga i minnet ända
till dess den är klar?
Vad händer t.ex om vi har en
interaktiv process där
användaren går på lång-lunch?
Ska den processen ligga och ta
upp plats i minnet trots att den
inget gör?
Swappning
Flytta processer mellan huvudminne och disk
för att:
 inte alla processer får plats samtidigt
 då någon process blockerats, t.ex interaktiv
process där användaren gått på lunch
Kan ta lång tid för stora processer
Swap-in flyttar från disk till minne och
swap-out flyttar åt andra hållet
OS Föreläsning 2,
Minneshantering
22
Swappning
Swapping för med sig att:
 Vi måste ha utrymme på hårddisken för processer
som swappas ut
 Vi måste organisera diskutrymmet på något sätt,
antagligen på liknande sätt som primärminnet
 Hårddisken är långsam relativt primärminnet...
Vad händer om vi får fragmentering och kanske
måste kompaktera?
 Måste en utswappad process laddas på samma
minnespositioner som den låg i innan den
swappades ut?
OS Föreläsning 2,
Minneshantering
23
Enkel sidindelad minneshantering
Grunderna för paging
Sidindelad minneshantering – Paging
 Låna idéer från kontinuerlig allokering med bitmap!
 Dela in:
 Logiska/(virtuella) minnesrymden i sidor (pages)
 Fysiska minnesrymden i ramar (frames)
 Sidor och ramar är av samma storlek
 Gör (dynamisk) adressöversättning vid
execution-time
 Gör en smartare MMU som tillåter att vi mappar
(konsekutiva) sidor på icke-konsekutiva ramar!
OS Föreläsning 2,
Minneshantering
25
Sidhantering
– ett första exempel
Logisk
adressrymd
sid
nummer
P1
2
1
0
P3
1
0
P4
3
2
1
0
Sidtabeller
Fysiskt
minne
2
P4
1
P3
P4
0
P1
5
4
ram
nummer
8
7
6
5
4
3
2
1
0
Ramtabell
upptagen
ledig
upptagen
ledig
upptagen
ledig
upptagen
upptagen
upptagen
ledig
upptagen
upptagen
upptagen
P4
8
7
Ready-kö
6
3 OS Föreläsning 2,
Minneshantering
26
Sidindelning
Löser problemet med extern fragmentering
Tydlig uppdelning av:
 Logisk adressrymd – programmeraren uppfattar
att den logiska adressrymden är kontinuerlig
 Fysisk adressrymd – uppdelad i ramar –
programmets fysiska minne kan ligga utspritt
Kan ge intern fragmentering
 I snitt kan man förvänta sig att den sista
sidan/ramen bara blir halvfull
OS Föreläsning 2,
Minneshantering
27
Sidindelning -adressuppdelning
Logisk adressrymd 2m
– en adress är m bitar lång
0
m-1
Antag att sidstorleken är 2n (bytes)
- då krävs n bitar för att adressera i sidan
Resterande m-n bitar utgör sidnummer
sidnummer
p
sidoffset
d
n
m-n
OS Föreläsning 2,
Minneshantering
28
Siduppdelning - adressöversättning
Fysisk adress
sidnr offset
ramnr offset
CPU
ramnr
0
Logisk adress
sidnr
ramnr
offset
Sidtabell
(ligger i det fysiska minnet)
OS Föreläsning 2,
Minneshantering
Fysiskt minne
29
En observation!
• I ett fleranvändarsystem kör många samma program
t.ex. Webbläsare
• Programkod, i.e text-segmentet, är normalt sett re-entrant
(re-entrant = koden modifieras inte under exekveringen)
•Text-segmentet kan vara read-only och skulle kunna delas
av flera processer!
Logisk adressrymd
sidnummer
P1
P3
2
1
0
1
0
Sidtabeller
Fysiskt
minne
2
1
0
5
OS Föreläsning
2,
0
Minneshantering
P3
P1
P1&P2 text
ram
nummer
8
7
6
5
4
3
2
1
0
30
Delat minne – shared memory
Processer kan dela inte bara read-only sidor
utan även read-write segment/data
Kallas delat-minne (shared-memory)
Kan användas för effektiv kommunikation
mellan processer
Kräver någon form av synkronisering mellan
processerna!
OS Föreläsning 2,
Minneshantering
31
Skydd från att adressera utanför
det allokerade minnet - protection
 Hur skyddar vi oss från att en process
adresserar en ram som inte ligger i dess
adressrymd?
1. Valid/invalid bit i varje entry i sidtabellen
2. Register som talar om längden av sidtabellen
OS Föreläsning 2,
Minneshantering
32
Exempel
Processen P1 får adressera upp till adress 3500
1KB stora sidor
Ramnr
Sidnr
0
36
v
1
38
2
3
4
5
6
33
v
34
33
v
Vad händer om P1
försöker adressera:
34
v
35
Adressen 5422 ?
0
i
36
Adressen 3742 ?
0
i
0
i
37
Sidtabell
38
OS Föreläsning 2, 39
Minneshantering
Del av fysiska minnet
33
Hur väljer man sidstorlek?
 Liten sidstorlek – liten intern fragmentering
 Men
 Liten sidstorlek ger stor sidtabell med ökande overhead
 I/O till/från disk är effektivare för större datablock (relativa
overheaden minskar)
 Ex: sidstorlek = 1MB (220)
adressrymd = 264
max sidtabellstorlek = 244 * storlek på en position
Varje process har en egen sidtabell
– är storleken ett problem?
OS Föreläsning 2,
Minneshantering
34
En enkel räkneövning
 Genomsnittslig processtorlek = s bytes
 Sidstorlek = p bytes
 Antal bytes per entry i sidtabellen = e
Antal sidor per process i genomsnitt = s/p
Overhead = e*(s/p) + p/2
Minimera map p: -e(s/p2) + ½ = 0
Optimal sidstorlek map min overhead: p = 2es
Ex: s = 1MB, e = 8 bytes -> p = 4KB
OS Föreläsning 2,
Minneshantering
35
Typiska sidstorlekar
512B – 64KB har använts
Trend mot större sidstorlekar
Idag vanliga sidstorlekar: 4KB – 8KB
Vissa system tillåter flera olika sidstorlekar
 Solaris : 8KB och 4MB beroende på vilken typ av
data som lagras i sidorna
- 8KB vanliga användarprocesser
- 4MB OS-kärnan och tillgängligt för
användarprocesser som t.ex. databasapplikationer
OS Föreläsning 2,
Minneshantering
36
Hur implementerar man sidtabellen?
En massa mer eller mindre
viktiga detaljer och några
datastrukturer
Vad har vi att ta hänsyn till?
Möjliga problem:
 Sidtabellen kan potentiellt bli väldigt stor
Varje instruktion ger normalt sett upphov till
1-4 minnesreferenser
 För varje minnesreferens får vi overhead när vi
går via sidtabellen...
Krav:
 Minneseffektiv!
 Snabb! – hårdvarustöd vore bra
OS Föreläsning 2,
Minneshantering
38
Några första försök
Använd register för att hålla sidtabellen
+ snabb access
- inte möjligt för stora sidtabeller (> 256 sidor)
Hur gör man när man byter process – måste man ladda om
alla register?
Lägg hela sidtabellen i vanligt minne
+ kan ha stor sidtabell
+ enkelt att byta sidtabell – man behöver bara sätta om en
pekare
- dubbelt så lång minnesaccesstid eftersom man för varje
minnesreferens först måste hämta sidtabellsentry från
minnet
OS Föreläsning 2,
Minneshantering
39
En observation
Lokalitet
 Minnesreferenserna som en process gör uppvisar
lokalitet – ex. När man exekverar i en subrutin
accessas dess kod och dess parametrar/variabler
 Det utnyttjas vid cachening och vi kan göra
likadant för sidtabellen!
stack
heap
text
OS Föreläsning 2,
Minneshantering
40
tid
Translation Lookaside Buffer - TLB
TLB fungerar som ett litet cacheminne för
sidtabellen inne i MMU:n
Implementeras med associativt minne (jfr
CAM) dvs. man kan söka i hela minnet parallelt
Typiskt 8-64 (4196) entryn, dvs ”täcker” ofta
bara en del av primärminnet
Kan förbättra prestanda dramatiskt
OS Föreläsning 2,
Minneshantering
41
TLB innehåll
•Valid/invalid bit
Valid Sidnr Modifierad Protection Ramnr ASID
•Sidnr
1
44
0
RX
21
P2
•Modifieradbit
1
370
0
RX
12
P1
•Protection (RWX)
1
135
1
RW
37
P1
•Ramnr
1
22
1
RW
14
P2
•Ev. Adressrymds
identifierare ASID,
motsv. PID
0
34
0
RX
0
P3
0
0
1
RW
0
P3
OS Föreläsning 2,
Minneshantering
42
Adressöversättning med TLB
Logisk adress
Fysisk adress
sidnr offset
ramnr offset
CPU
TLB hit TLB
ramnr
TLB miss
Sidtabell
ramnr
OS Föreläsning 2,
Minneshantering
Fysiskt minne
43
Miss i TLBn
1. Accessa sidtabellen i primärminnet
2. Uppdatera TLB:n genom att slänga ut ett
ogiltigt eller gammalt entry
 Vem sköter om detta?
 Ofta MMU:n – men den blir komplex
 TRAP till OS som får uppdatera
(dvs mjukvarustyrd uppdatering)
Vanligt i nyare processorer: SPARC, MIPS, ALPHA
OS Föreläsning 2,
Minneshantering
44
Räkneexempel på TLB
Minnesaccesstid M = 100 nsec
TLB söktid s = 20 nsec
Träffsannolikhet i TLB (hit ratio) h = 90%
Effektiv minnesaccesstid =
h(s + M) + (1-h)(s + M +M) =
0.9(20 + 100) + 0.1(20 + 100 + 100) = 130
OS Föreläsning 2,
Minneshantering
45
Hur hantera storleken på sidtabellen
- val av datastruktur
1. En-nivås sidtabell
(det vi diskuterat hittills)
Om vi inte vill allokera kontinuerligt utrymme i minnet för hela
sidtabellen
2. Fler-nivåers sidtabell – sidindelad sidtabell
(hierarchical or multi-level paging)
3. Hashad sidtabell
Kan vi minska storleken ytterligare?
4. Inverterad sidtabell
OS Föreläsning 2,
Minneshantering
46
Flernivåers sidtabell
sidnummer
sidoffset
p
d
(Pentium II)
yttre
inre
sidnummer sidnummer
p1
p2
sidoffset
d
Adressöversättning – logisk till fysisk adress
p1
p2
d
ramnr
d
p2
ramnr
p1
Sida i den inre
sidtabellen
Yttre sidtabell
OS Föreläsning 2,
Minneshantering
Inre sidtabell
47
Hur delar man upp den logiska
adressen i flernivåers sidtabell?
Antag:
logisk adressrymd = 2n
sidstorlek = 2m
storlek på ett entry i sidtabellen 2e
Börja med en tvånivåers sidtabell:
Vi vill att en sida i den innersta sidtabellen ska mappa
enkelt till sidstorleken!
Då kan man ha 2m-e entryn per sida.
Den yttre sidtabellen kommer då att ha 2n-2m+e
positioner
OS Föreläsning 2,
Minneshantering
48
Uppdelning av den logiska adressen
forts.
Exempel: logisk adressrymd = 264, sidstorlek = 4KB (212)
storlek på ett entry 4 byte
yttre sida
inre sida
p2
#bitar
p1
42
10
offset
d
12
Den yttre sidtabellen blir för stor med 242 positioner!
Sidindela den också!?
yttre yttre sida
#bitar
p3
32
yttre sida inre sida
p2
p1
10
10
offset
d
12
Den yttersta sidtabellen blir fortfarande för stor. För att nå rimlig
storlek krävs minst 5-7 nivåers sidindelning! Men det blir för många
nivåer för att vara effektivt!
Hitta på något annat för stora
OS Föreläsning 2,
adressrymder!
Minneshantering
49
Hashad sidtabell
Fysisk adress
Logisk adress
CPU
sidnra offset
hash
funktion
ramnr offset
sidnrx ramnr
sidnra ramnr
sidnrz ramnr
Hashad
sidtabell
OS Föreläsning 2,
Minneshantering
Fysiskt minne
50
Inverterad sidtabell
Om varje process har en egen sidtabell kan
det gå åt mycket minne!
Inverterad sidtabell
 En sidtabell för alla processer
 Ett entry för varje fysisk ram
 I varje entry har man sidnr + PID för processen
som allokerat ramen
OS Föreläsning 2,
Minneshantering
51
Inverterad sidtabell
naivt exempel
Logisk adress
CPU
Fysisk adress
PID sidnroffset
sök
ramnr i offset
ramnr
0
PID sidnr ramnr i
max ramnr
Inverterad
sidtabell
OS Föreläsning 2,
Minneshantering
Fysiskt minne
52
Effektivare inverterad sidtabell
Den naiva implementationen har nackdelen att
man måste söka i sidtabellen
Åtgärder
 Använd associativt minne som t.ex. CAM – dyrt
 Hasha den inverterade sidtabellen
används i 64-bitars UltraSPARC, PowerPC
Ett potentiellt problem med inverterade sidtabeller är
att det är svårare att implementera delat minne
OS Föreläsning 2,
Minneshantering
53
Summering – vad vi pratat om idag
Adressrymden – logiska/(virtuella) och
fysiska adresser
Minneshantering där hela processen måste få
plats i primärminnet
 Kontinuerlig allokering
 Fragmentering
 Sidindelat minne -paging
OS Föreläsning 2,
Minneshantering
54
Kommande föreläsningar
Torsdag kl 13-15 sal E
Minneshantering del 2
Måndag 8-10 sal E (Robert Rönngren)
C-programmering del 1
Tisdag 13-15 sal E (Robert Rönngren)
C-programmering del 2
Torsdag 8-10 sal E
Filsystem
OS Föreläsning 2,
Minneshantering
55