Muistinhallinta (2-A)

Muistinhallinta on käyttöjärjestelmän yksi oleellisimmista tehtävistä. Modernissa KJ:ssa tähän kuuluu virtuaaliosoitteiden ja -muistin hallinta. Muistinhallintaan liittyy myös vahvasti turvallisuusaspekti sillä useamman prosessin (tai käyttäjän) koneessa pitää pystyä erottamaan prosessit toisistaan ja näin estää tietojen vuoto.

Keskusmuisti on sellainen tietovarasto, johon ohjelmat viittaavat välittömästi -- ilman että niiden täytyy määritellä jokin tietoväline, jolla tieto on. Tällaistakin muistia voi olla eri lajeja, joista tietoturvan kannalta on tärkeää erottaa sellainen muisti, jota voi vain lukea (ROM) sellaisesta, jota prosessit voivat ainakin periaatteessa päästä kirjoittamaan. Edellisellä olevaan tietoon voidaan luonnollisesti luottaa jälkimmäistä enemmän. Välimuotoja ovat EPROM, EEPROM (vrt. toimikortit) ja WROM (Write once memory).

Virtuaaliosoite

Virtuaalimuisti on suorittimen käyttämä osoite jonka muistinhallintamekanismi (riippuu käyttöjärjestelmästä) muuttaa fyysiseksi osoitteeksi. Osoiteavaruus muodostuu siis virtuaaliosoitteista ja muistiavaruus on fyysistä (RAM) muistia. Nykykoneissa osoiteavaruus on yleisesti suurempi (ram+swap) kun aiemmin tilanne oli toisinpäin

Virtuaaliosoitteiden yksi tärkeimmistä hyödyistä on niiden tarjoama oma muistiavaruus, eräänlainen hiekkalaatikko, jokaiselle sovellukselle. Näin sovellus ei näe eikä pysty suoraan viittaamaan niille alueille mitkä eivät sille kuulu.

Virtuaalimuisti

Modernin käyttöjärjestelmän ominaisuuksiin kuuluu lähes aina virtuaalimuisti. Virtuaalimuisti on fyysisen muistin (RAM) jatke joka sijaitsee massamedialla.

  • Virtuaalimuistin yhteydessä on otettava huomioon oheismuistin (levyn) erillisyys -- pääseekö sinne joku laitteiston kautta, jääkö sinne jotain selkokielistä, jos kone kaatuu?
  • Virtuaalimuisti tarvitsee KJ:lta tuen virtuaaliosoitteille.
  • Luku levyltä erittäin hidasta verrattuna keskus- ja välimuistiin.
  • Fyysisestä muistista siirto massamedialle poistoalgoritmeilla, esim. FIFO.

Sivutus

Virtuaaliosoitteiden ansiosta ohjelma voi myös varata muistia eri kohdista muistia eikä siis tarvitse yhtenäistä suurta viipaletta vaikka se siis siltä sovellukselle näyttääkin. Osa sovelluksen muistista voi siis olla massamedialla ja osa fyysisessä muistissa, kuten usein onkin.

Välimuisti

Oheismuistien ja varsinaisen keskusmuistin lisäksi KJ hallinnoi vielä cache- eli välimuistia. Se on kaikkein nopein muistityyppi ja sinne pyritään hakemaan keskusmuistista sellaisia tietoja, joita prosessin kohta ennakoidaan käyttävän. Cache ei siis asetu oheis- ja keskusmuistin vaan keskusmuistin ja rekistereiden väliin. (Vrt. www-selauksen cache tai DNS:n cache.)

Käyttö

Keskusmuistin varsinainen käyttö tapahtuu, kun KJ saa käyttäjän prosessilta muistiviittauksen V. Tällöin tapahtuu jotain seuraavista: KJ

  • pilkkoo ja kokoaa V:n uudestaan sen mukaan, mitä se on lukenut erilaisista viittaustauluista;
  • lisää kantaosoitteen V:ssä olevaan suhteelliseen osaan ("offsettiin");
  • tarkastaa, osuuko V alueelle, joka on sallittu prosessille. Tässä toteutuu viitemonitorin idea.

Nämä toimet riippuvat muistin rakenteessa, jossa on seuraavanlaisia mahdollisuuksia.

  • Jos käyttäjiä on vain yksi (kuten toimikortissa), hänen prosessi(e)nsa erottamiseen käyttöjärjestelmän muistialueesta riittää kiinteä raja (aita, 'fence'), jonka toiselle puolelle ei sallita viittauksia. Luonnollinen toteutus käyttää suhteellisia osoitteita, jotka päivitetään ('relocation') todellisiksi vasta ohjelmaa ladattaessa.
  • Useamman käyttäjän tapauksessa tarvitaan sekä ala- että yläraja ja lisäksi, koska prosesseilla on yleensä dynaamista dataa, tarvitaan rajat myös sille.
  • Jos prosessien pitää voida käyttää muistia yhteisesti, tai jos tietty prosessi haluaa suojata osan viittaamastaan muistista esim. kirjoittamiselta, voidaan muistiyksiköt (sanat tai jotkin suuremmat mutta silti pienet kokonaisuudet) varustaa pääsynvalvontabiteillä. Tällainen ns. 'tagged architecture' kuluttaa muistia, mutta on joustava. Eduista huolimatta se ei ole yleistynyt, lähinnä yhteensopivuusperinteen takia. (Vrt. kuitenkin prosessoreiden NX- tai XD-bitin vaikutus.)
  • Segmentointi: ohjelma (ja data-alueet) jaetaan osiin, jotka ovat loogisia nimettyjä kokonaisuuksia ja jotka sijoitetaan muistiin yhtenäiselle alueelle. Käyttöjärjestelmä pitää yllä osoitetaulua ja kaikki muistiviittaukset tapahtuvat sen kautta, mikä mahdollistaa monenlaiset turvatarkastukset (myös usean viittaavan prosessin osalta). Toisaalta pitää vahtia varsinkin dynaamisia viittauksia segmentin ulkopuolelle. Segmentoinnin toteutuksessa on oma vaivansa ja lisäksi se aiheuttaa muistin pirstoutumista. Unixissa segmentointi on tiukan käytännöllistä: joka prosessilla on vain segmentit "text" ohjelmakoodille, "data" ei-ajettavalle ohjelman osuudelle kuten muuttujille ja vakioille ja "stack" eli vaihtuvankokoinen pino tilapäiselle datalle.
  • Sivutus ('paging') jakaa ohjelman vakiokokoisiin palasiin, jotka sijoitetaan muistiin ja joihin viitataan segmenttien tavoin. Muisti täyttyy tarkasti ja sivurajan ylitys pysyy kätevästi kurissa osoitteen ylivuotona uudelle sivulle. Käyttöjärjestelmä huolehtii sivujen jakamisesta, mutta ei pysty vastaavalla tavalla eriyttämään niihin pääsyn valvontaa kuin segmentoinnissa.
  • Sivuttamalla segmenttejä saavutetaan molempien järjestelmien etuja. Hintana on tietenkin lisävaihe viittausten toteutuksessa.
  • Jos käytössä on virtuaalimuisti, sivutaulussa on myös läsnäolobitti. Jos se on 0 ja operaatio on lukeminen, tapahtuu läsnäolokeskeytys ('page fault') ja prosessi jää odottamaan, kunnes sivu on haettu oheismuistista. Vaikka kyseessä olisi kirjoitusoperaatio, sivu pitää jossain vaiheessa hakea kokonaan, jotta se voidaan muutetussa muodossa kirjoittaa takaisin.

-- JukkaKoskinen?

SivuTiedotLaajennettu edit

Vaativuus Perus
Valmius Valmis
Tyyppi Ydin
Luokitus Uhkat
Mitä Luottamuksellisuus
Miltä Ihmisetön uhka
Missä Organisaatio
Kuka Titu-ammattilainen
Milloin Ennakolta
Miksi Hyvä tapa
Print version |  PDF  | History: r3 < r2 < r1 | 
Topic revision: r3 - 19 Nov 2010 - 19:24:45 - NikoKurtti
 

TUTWiki

Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TUTWiki? Send feedback