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