Håndtering av minne i et OS
Hva er det som skal håndteres? Minnehåndtering (memory management) utføres av de delene av systemet som har ansvar for å håndtere maskinens primærminne Primærminnet (aka hovedminne, internminne, RAM eller bare minne ) er den eneste delen av maskinen som er direkte tilgjengelig for CPU: CPU leser instruksjonene som skal utføres fra RAM Alle data som CPU jobber med leses fra/lagres i RAM Primærminne inkluderer ikke CPU-cache, ROM, grafikk- RAM, RAM-disker, cache-ram i disk-kontrollere etc. Primærminne er en begrenset ressurs som må fordeles til prosessene som OS-et håndterer
Hvem gjør minnehåndteringen? Maskinvare for minneaddressering internt i CPU (memory management unit / MMU) sørger for riktig lesing/skriving i RAM Operativsystemets programvare håndterer fordelingen av minne mellom prosesser Run-time systemer (JVM) holder rede på variablene som brukes i et (Java-)program
Hvorfor er minnehåndtering viktig? Uten god minnehåndtering virker ikke en datamaskin som den skal: Feil i minnet gir bugs som er umulige å finne/rette opp Dårlig minnehåndtering gir lav ytelse og treg maskin Usikre minnesystemer åpner for virus og malware Moderne OS har derfor svært komplekse og kompliserte systemer for å håndtere minne ordentlig. Alt som en programmerer gjør handler om minnehåndtering både koden og dataene ligger i RAM under kjøring av programmet.
Noen mulige feil i minnehåndtering Overflow (for store tall): Må ikke skrive utenfor tallets tildelte minneområde. Memory leak (minnelekkasje): Minne som ikke lenger brukes frigis ikke til gjenbruk (av program eller OS), spiser opp all RAM. Segmentation fault: En prosess prøver å lese/skrive minne som det ikke har tilgang til. OS må ikke tillate dette og bør/skal terminere prosessen. Buffer overflow: Prosess har fylt opp tildelt minneområde, men fortsetter å skrive utenfor i områder som tilhører andre prosesser eller OS(!). Gir feil/system crash og gjør systemet sårbart.
Hovedoppgaver i minnehåndtering Holde rede på status (tildelt eller ledig) for alle minnecellene Bestemme hvordan RAM skal fordeles mellom prosesser som konkurrerer om å få tildelt minne: Hvem skal få tildelt minne? Når skal en prosess få tildelt minne? Hvor mye skal en prosess tillates å få? Finne passende deler av minnet ved tildeling Frigjøre minne som ikke lenger er i bruk Beskyttelse og deling av minne mellom prosesser
Noen forenklinger Ser (stort sett) bare på minnehåndtering på OS-nivå: Ikke detaljer om (Intel) CPU-adressering, binær tallregning, MMU, relokasjon av prosesser etc. * Bruker (for det meste) en lineær modell for å beskrive RAM: Antar at hele primærhukommelsen ligger som en endimensjonal tabell en søyle av minneceller Antar at vi kan adressere RAM omtrent som vi indekserer en tabell/array i Java, fra lave til høye adresser Antar at prosesser får tildelt minneområder som er en sammenhengende del av RAM-tabellen. * Læreboken forteller mer om adressering av RAM og minnehåndtering i hardware
Beskyttelse av minneområder For hver prosess lagrer OS'et info. om minneområdet i registre i CPU når prosessen kjører: En segment-indeks, angir start på minneområdet En grense, angir størrelse på minneområdet Gir relokerbar kode med relativ adressering, som er uavhengig av hvor i RAM minneområdet faktisk er plassert OS'et bruker verdiene i registrene til å nekte prosessene tilgang til RAM utenfor deres eget minneområdene CPU-registre er beskyttet i user mode * Prosessene kan ikke endre data om eget minneområde Kun OS har tilgang til registrene * : MS-DOS hadde ikke beskyttelse av minneområdedataene mye systemfeil
Deling av minne mellom flere prosesser Delvis overlappende minneområder: Brukes ikke: Fungerer bare for to prosesser, hvis hver prosess kun har ett sammenhengende minneområde Ved tre eller flere prosesser må minst en av prosessene dele hele sitt minneområde med andre Helt overlappende minneområder: Prosessene deler hele minneområdene de er tildelt Prosessene har identisk innhold i grense- og segmentregistrene Brukes bl.a.for alle trådene i en prosess Bedre løsning (segmentert minnehåndtering): Prosessene kan tildeles flere minneområder Et eller flere av de tildelte minneområdene kan deles