Minneshantering segmentering och virtuellminne Föreläsning 3
Minneshantering forts. Hur kan man köra processer som är större än primärminnet? Hur kan man undvika att stack och heap växer ihop? Virtuellminne demand paging Segmentering Segmentering kombinerat med sidindelning Kap: 4.4-4.8 Minneshantering forts. 2
Virtuellminne demand paging Virtuellminne: Hur man utnyttjar sekundärminne (skivminne) för att kunna köra processer som är större än primärminnet
Utnyttja mer av minneshierarkin Måste hela processen finnas i minnet? Utnyttja lokalitet: Bara de delar som för tillfället används av text, stack och heap behöver vara i minnet resten kan ligga på sekundärminne (disk) register cache primärminne elektronisk disk magnetisk disk Minneshantering forts. 4
Demand paging Addera information till sidtabellen som indikerar om sidan finns i primärminnet (i en ram) eller inte När en sida som inte finns i primärminnet refereras genreras ett sidfel (page fault) Vid sidfel hämtas sidan från sekundärminne (disk) till primärminnet och sidtabellen uppdateras Håll lista med lediga ramar Jfr. swapping men här hanteras inte nödvändigtvis hela processer utan sidor page-in och page-out Minneshantering forts. 5
Demand paging ett första exempel Virtuellt minne Sidtabell Primärminne Sekundärminne P1 1 Trap till OS sid nummer 3 2 1 0 2 Var det ett sidfel? 3 Var det en legal adress? 4 Hitta en ledig ram SIDFEL ram 5 Starta I/O av sidan till ramen 6 Processen blockeras i väntan på I/O I/O klar 7 Processen läggs i ready kö 6 0 3 present/absent (valid/invalid) i v v i v P1-2 P1-0 P1-1 ram nummer 8 7 6 5 4 3 2 1 0 0 1 2 3 Minneshantering forts. 6
När laddas en process sidor? Ren demand paging Vid behov Första sidan laddas när första instruktionen skall exekveras Pre-paging Försök räkna ut vilka sidor som behövs och ladda in dem i förväg - Hur räknar man ut vilka sidor som behövs? Minneshantering forts. 7
Vad vet vi och vad vet vi inte? Allt vi sagt om paging på förra föreläsningen gäller även för demand paging som t.ex: Implementation av sidtabell TLB Val av sidstorlek Blir det inte långsamt speciellt vid sidfel? Hur hittar man lediga ramar? Hur många ramar får/behöver en process allokera? Minneshantering forts. 8
Minnesaccesstid vid demand paging p = sannolikhet för sidfel vid en minnesreferens m = minnesaccesstid om sidan är i primärminnet d = tid för page-in, dvs att läsa in en sida från minnet till en ram Effektiv minnesaccesstid = (1-p)m + pd Typiska tider: m = 100 ns, d = 25 ms För mindre än 10% långsammare minnessaccesstid krävs: p < 0.0000004 Dvs mindre än ett sidfel per 2.5 M minnessaccesser Minneshantering forts. 9
Att skapa lediga ramar Vad gör man när alla ramar är fyllda? Sidutbytesalgoritmer (page-replacement)
Sidutbytesalgoritmer Om ingen tom ram finns töm en ram för att skapa utrymme Men vilken ram tömmer man? Två mål: 1. Minimera antalet sidfel 2. Minimera I/O Minneshantering forts. 11
I/O-kostnad Det kostar mindre att byta ut en sida som inte är modifierad (dirty) än en som är modifierad Om en sida i en ram är ren finns en kopia på disk, dvs. man behöver inte skriva ut innehållet i ramen till disk > 1 I/O operation Om en sida i en ram är modifierad måste den skrivas ut till disk innan man kan läsa in en ny sida till ramen > 2 I/O operationer Bra är att ha en modifierad/( dirty ) bit i sidtabellen som sätts då någon byte i sidan skrivs Minneshantering forts. 12
Sidutbytesalgoritmer Teori Referenssträng Working set Algoritmer Optimal FIFO LRU Least Recently Used FIFO-varianter: Second Chance, Clock Förbättrad Clock Aging WSClock Working Set Clock Minneshantering forts. 13
Referenssträng Antalet sidfel bestäms av i vilken ordning vi accessar olika sidor (och antal tillgängliga ramar och sidutbytesalgoritmen) En sträng av sidnummer i den ordning de refererats kallas referenssträng Ex: 1,4,7,3,5,3,8,9,0,2,1 OBS! Att om vi refererar en sida flera gånger i rad kommer det (normalt) inte att kunna generera mer än maximalt ett sidfel > inga upprepningar av samma sidnummer i referenssträngen Referenssträngar används för att utvärdera sidutbytesalgoritmer Kan skapas genom trace från verkliga processer eller med stokastiska modeller Minneshantering forts. 14
Working set - ett mått på lokalitet Informellt den uppsättning sidor en process refererar (behöver för sin exekvering) under en viss (liten) tidsrymd T stack heap text tid T Minneshantering forts. 15
Working set - vad kan vi använda det till? Working set för en process förändras över tiden Det mest intressanta måttet på working set är dess storlek Om en process inte har tillgång till så många ramar som storleken på dess working set kommer den att generera många sidfel! Sidutbytesalgoritmen bör sträva after att hålla processens/ernas working set i minnet Minneshantering forts. 16
Den Optimala sidutbytesalgoritmen Byt ut den sida som det kommer att dröja längst innan den refereras igen Optimal med avseende på antal sidfel Omöjlig att implementera i praktiska system Kan användas som jämförelse om man har tillgång till referenssträngar Minneshantering forts. 17
FIFO Om inga lediga ramar finns - byt den sida som legat längst i primärminnet Enkel men vi vet inget om den sida som slängs ut (victim-page) används eller ej! Kan ge fler sidfel om man ökar antalet tillgängliga ramar!? (Belady s anomali) Använt i VAX/VMS, Windows NT Minneshantering forts. 18
Belady s anomali Ex. referenssträng: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 # sidfel 12 10 8 6 4 FIFO OPT 2 0 0 1 2 3 4 5 6 7 # ramar Minneshantering forts. 19
Teori - stackalgoritmer Sidutbytesalgoritmer med egenskapen att de ger färre sidfel med ökat antal ramar Karaktärisering av sidutbytesalgoritm som är en stackalgoritm: För varje referens i en referenssträng är den mängd sidor som finns i primärminnet givet m ramar en delmängd av den mängd sidor som finns i minnet givet m+1 ramar Minneshantering forts. 20
Uppskatta framtiden med historia - Least Recently Used LRU byt ut den sida som det var längst sedan den användes Så bra approximation av OPT som vi enkelt kan göra Dyrbar att implementera Implementation med räknare för varje instruktion som exekverats - räknaren skrivs in i sidtabellentryt när sidan refereras Kräver sökning för att hitta sida att slänga ut NxN bitmatris Se till att en sida som nyligen lästs in inte slängs ut innan den använts (generellt problem) Vanligare att approximera Minneshantering forts. 21
Clock Enkel approximation av LRU genom en utvidgning av FIFO Idé: Second-chance med cirkulär lista Inför en referens-bit i sidtabellen Nollställd då sidan laddas in Ett-ställs då någon byte i sidan adresseras Algoritm Ha en cirkulär lista med alla sidor i primärminnet ordnad i FIFO ordning När en sida behöver slängas ut sök i listan Om sidans referensbit är satt, nollställ den och sök vidare Första sidan med nollställd referensbit är den som ska slängas ut till sekundärminnet Minneshantering forts. 22
Clock - exempel sida referensbit B 0 Page-in av sidan Y H 1 G 10 A D E 1 X 10 1 F Y K L 0 K Y 0 M 1 Minneshantering forts. 23
Förbättring av Clock Kombinera med NRU för att minska I/O Inför en modifierad-bit i sidtabellen Initialt nollställd då sidan laddas in Ett-ställs då man skriver till någon byte i sidan Algoritm: Som Clock men välj sida att slänga ut efter värdet på paret (referensbit, modified-bit) 1. (0,0) varken refererad eller modifierad 2. (0,1) inte nyligen använd men modifierad 3. (1,0) nyligen använd men inte modifierad 4. (1,1) både nyligen använd och modifierad Används i Macintosh Minneshantering forts. 24
Aging En hyfsad approximation av LRU Uppskatta när sidan senast refererades genom att: Till varje entry i sidtabellen läggs en n-bitars räknare (t.ex. n = 8) Regelbundet, t.ex vid varje klockavbrott, för alla sidor i minnet: Skifta räknaren ett steg åt höger Addera referensbiten för sidan i den vänstra biten i räknaren Vid sidfel väljs sidan med lägsta värde på räknaren att flyttas ut till sekundärminne Kräver sökning Minneshantering forts. 25
WSClock en uppskattning av working set Bestäm en tidsrymd T för vilket working set uppskattas Organisera data om sidor i primärminnet pss. som för Clock-algoritmen Algoritm: Lägg till en tidsstämpel i varje entry i sidtabellen 1 Uppdatering av referensbit: Regelbundet, t.ex. vid varje klockavbrott - nollställ alla referensbitar Minneshantering forts. 26
WSClock forts. 2 Vid sidfel: Gå igenom alla entryn för sidor i minnet Om referensbiten är satt: nollställ och uppdatera tidsstämpeln Om en sida med nollställd referensbit hittas och den refererats längre tillbaka i tiden än T tidsenheter, dvs. den är inte längre i working set: Om modifierad-biten är satt schemalägg att sidan skall skrivas till disk leta vidare Om sidan är ren läs in den nya sidan till denna ram Om man inte hittat en ren sida som inte ligger i working set på ett varv finns två möjligheter: En skrivning har schemalagts fortsätt leta till slut blir en sida ren! Annars ersätt en godtycklig ren sida om ingen sådan finns ta en godtycklig sida och släng ut (systemet är nog överlastat...) Minneshantering forts. 27
Summering av sidutbytesalgoritmer Algoritm Optimal FIFO LRU Clock Clock med NRU Aging WSClock Kommentar Inte implementerbar, användbar som jämförelse Kan slänga ut sidor som används! Bra, men svår att implementera! Realistisk, går att använda Används Effektiv approximation av LRU, används Bra och effektiv Minneshantering forts. 28
Sidbufferalgoritm - renhållning För att ett sidindelat virtuellminnessystem skall fungera bra bör det finnas relativt gott om lediga, eller åtminstonde rena ramar, för att snabbt kunna ta hand om sidfel! Hur ordnar vi det? Minneshantering forts. 29
paging deamon Process som går i bakgrunden När I/O-enheten för att skriva sidor till sekundärminnet är ledig: skriv modifierade sidor till minnet Om det finns för få lediga ramar släng ut en del sidor kom ihåg vilken sida som låg i ramen så att den vid behov (om den refereras innan ramen återanvänts) kan tas tillbaka utan att man behöver läsa den från disk Många system håller en separat lista med lediga ramar att användas vid sidfel Minneshantering forts. 30
Praktiska funderingar Hur många ramar får en process? Överlast thrashing Lokal eller global sidutbytesalgoritm?
Antal ramar (multiprogrammering) - hur många ramar ska en process få använda? Vad är minsta antal ramar en process måste ha? Minst det antal sidor som kan accessas i en enda instruktion! Ex: en instruktion med 3 st indirektadresserade operander Antag instruktionen ligger på en sida, varje adress på varsin sida och att det de pekar ut ligger på ytterligare varsin sida -> Minst 7 ramar (14 om instruktion och operander kan ligga över sidgränser) Minneshantering forts. 32
Vad gör man om man får sidfel mitt i en instruktion? Man måste kunna starta om instruktionen när den saknade sidan laddats in Hur gör man om instruktionen delvis utförts? Kan vara fallet vid automatisk increment/decrement på register Har man tur finns hårdvarustöd för Sparande av programräknare, information om automatisk increment/decrement som ev. har utförts etc. Om inte så får operativsystemskoden klara det Minneshantering forts. 33
Hur undviker man att en sida som håller på att läsas in kastas ut? Vad hindrar sidutbytesalgoritmen från att kasta ut en sida som håller på att läsas in? Skulle kunna ge allvarliga problem om man fortsätter skriva i ramen och skriver sönder en annan process sida Dessutom är en sida som håller på att läsas in inte en bra sida att välja att kasta ut eftersom den läses in för att den behövs Måste kunna låsa sidor i minnet sk. pinning eller I/O-interlock till dess inläsningen är klar Används också för OS-kod/data från att pageas ut Normalt får användarprocesser inte låsa sidor i minnet Minneshantering forts. 34
Hur många ramar ska en process få allokera? Minst så många som krävs för att kunna exekvera! Några alternativ Proportionellt mot processtorlek Min och max Minneshantering forts. 35
Global eller lokal sidutbytesalgoritm Ska sidutbytesalgoritmen vara: Lokal bara leta efter sidor att slänga ut hos processen som fick sidfel Global sidutbytesalgoritmen kan välja vilken sida som helst att slänga ut Globala algoritmer är oftast effektivast Minneshantering forts. 36
Thrashing Lokal sidutbytesalgoritm: Om en process inte får allokera tillräckligt många ramar för att hålla hela sitt working set i minnet kommer den att generera många sidfel! Om processen spenderar mer tid på sidbyten än på exekvering thrashar den Global sidutbytesalgoritm Har vi för många aktiva processer kan vi få problem med att alla processer thrashar Minneshantering forts. 37
Thrashing - exempel Sidfelsfrekvens Utfört arbete Multiprogrammeringsgrad Minneshantering forts. 38
Motverka thrashing Lokal sidutbytesalgoritm Om en process får för hög sidfelsfrekvens - Om det finns lediga ramar: låt den allokera flera - Om det inte finns lediga ramar: swappa ut den Global sidutbytesalgoritm Om systemet får för hög sidfelsfrekvens - Försök frigöra ramar - Går det inte att frigöra ramar:swappa ut processer Om en process får låg sidfelsfrekvens - ta ifrån den ramar Minneshantering forts. 39
Användning av sidfelsfrekvens sidfelsfrekvens öka antalet ramar övre gräns minska antalet ramar undre gräns antal ramar Minneshantering forts. 40
Sidtabellspost (page table entry) Sid/Ramnummer Minneshantering forts. 41
Några kvarstående frågor fork(), exec() Några fallstudier Hantering av sekundärminne
fork() & exec() Systemanropet fork() skapar en kopia av processen som exekverar fork() En process som exekverar fork() byter oftast direkt program med systemanropet exec() Normalt sett kopieras föräldraprocessens adressrymd till barnprocessen Kan man vara effektivare? Minneshantering forts. 43
fork() & exec() forts. För att spara tid kan man gör så här: Kopiera inte föräldraprocessens sidor bara sidtabellen Markera sidorna som copy-on-write Om en sida skrivs av någon process kopiera den I många UNIX system finns ett systemanrop vfork() där barnprocessen delar föräldraprocessens sidor vfork() är ett effektivt systemanrop avsedd för barnprocesser som omedelbart exekverar exec() Minneshantering forts. 44
Windows NT Demand paging med clustering clustering: flera omgivande sidor läses in vid sidfel När processen skapas får den allokera ramar efter: working-set-minimum: minsta tilldelning av ramar working-set-maximum: maximalt antal ramar som får allokeras Virtuellminneshanterare som håller en lista med lediga ramar Om systemet har för få lediga ramar tar minnehanteraren ramar från processer som har allokerat fler än working-set-minimum ramar Sidutbytesalgoritmer: En-processors x86: variant av Clock Alpha, multi-processor x86: variant av FIFO Minneshantering forts. 45
Solaris 2 Har en process pageout som frigör minne pageout har fri-lista av lediga ramar som skall vara minst desfree stor i medel över 30 s Om inte swappa ut processer Två-visares second-chance algoritm för att frigöra ramar Första visaren nollställer referensbit Om referensbiten är nollställd när andra visaren når sidan frigörs ramen (modifierade sidor skrivs till disk) 8KB sidor för användare, 4MB sidor för OS och priviligierade användare Minneshantering forts. 46
Solaris 2 forts. pageout frigör sidor med nollställd referensbit handspred (typiskt 1024 sidor) # sidor som scannas/s 8192 fastscan nollställer referensbiten 100 slowscan mängd ledigt minne Minneshantering forts. 47
Hantering av sekundärminne (disk) Kontinuerlig allokering på disk + enkel adressöversättning - svårt att hantera ökande datastorlek Möjlig utvidgning - allokera olika utrymmen för text, heap och stack + avhjälper (bara) i viss mån allokeringsproblematiken Dela upp disken i delar (lika stora som sidorna) Ha en tabell motsvarande sidtabellen för var sidor på disken lagras Minneshantering forts. 48
Sekundärminneshantering ex. Primärminne Sidor A B Disk C D Swap area Sidtabell Disk map Minneshantering forts. 49
Segmentering Det som en gång var alternativet till sidindelad minneshantering men som nu oftast kombineras med sidindelning.
Att hantera olika logiska delar av adressrymden STACK HEAP Allokera olika minnessegment för olika delar av processen Olika delar av data kan växa oberoende Adressöversättning med bas och gräns för varje segment Varje segment kan ges olika skydd (RWX) TEXT TEXT HEAP STACK Segment Minneshantering forts. 51
Adressöversättning enkel segmentering s Segment tabell gräns bas CPU s d < nej ja + TRAP: adresseringsfel Minneshantering forts. 52
Segmentering Ren segmentering: Fördel: Naturlig uppdelning av minnesrymden Nackdelar: - Kontinuerlig allokering är svårt - Kan kräva att programmeraren är mer medveten om minneshanteringsmodellen för att kunna utnyttja den Segmentering kombineras numera oftast med sidindelning Minneshantering forts. 53
Segmentering med sidindelning i 386i (Pentium) logisk adress selektor offset Segmenten sidindelade i 4KB sidor En sidtabell upp till 4MB Segment deskriptor yttre sidtabell = directory linjär adress + yttre sidtabell sida offset descriptortabell fysiskt minne sid tabell ram nummer ram offset page directory OS Föreläsning sidtabell 3, Minneshantering forts. 54
När fungerar virtuellt sidindelat minne dåligt? Om vi har dålig lokalitet så kan det ge följande problem: Många TLB-missar ger sämre prestanda (varje minnesaccess som ger upphov till en TLB-miss tar ~ dubbelt så lång tid som om vi får en träff) Kan också ge stort working-set vilket kan leda till många sidfel som tar lång tid att hantera (längre än en TLB miss) Om man överlastar maskinen så att working-set inte ryms i minnet Thrashing CPU:n och disk används mest för att göra pageout page-in Minneshantering forts. 55
Summering vad vi pratat om idag Virtuellminne med demand paging Sidutbytesalgoritmer Skapa lediga ramar paging deamon Hur allokera ramar Thrashing Exempel Segmentering Enkel segmentering Segmentering och sidindelning 386i Minneshantering forts. 56
Kommande föreläsningar C och Filsystem Minneshantering forts. 57