Virtuaalimuisti eli näennäismuisti (englanniksi virtual memory management, VMM) on muistinhallintatapa, jossa toissijaiseen muistiin viitataan kuten keskusmuistiin. Osa muistista sijaitsee tällöin fyysisesti oletusarvoista paikkaa kauempana. Näin osa prosessorin rekisteritiedoista voi sijaita emokortin keskusmuistissa (RAM) tai oletusarvoisesti keskusmuistissa sijaitseva muistisisältö esimerkiksi kovalevyllä. Tällainen ylimääräinen osoiteavaruus syntyy käyttöjärjestelmän toimesta erityisesti silloin kun oletuspaikassa sijaitseva muistikapasiteetti uhkaa käydä vähiin. Virtuaalimuisti tarvitsee toimiakseen tukea laitteistolta.

Kuva: Muistihierarkia

Muistin käyttötapa määräytyy sen mukaan kuinka nopeasti mikäkin tieto tulee olla kulloisessakin prosessin vaiheessa saatavilla. Nopeita muistipaikkoja on verrattain vähän ja ne ovat kalliita. Siksi tieto sijoitetaan mahdollisuuksien mukaan edulliseen paikkaan siten, ettei se haittaa tai hidasta ohjelman kulkua. Usein käytettävät pienemmät tiedostot sijoitetaan RAM:iin, josta ne ovat nopeasti saatavilla. Harvemmin käytettävät ja suuret tiedostot sijoitetaan puolestaan kovalevylle. Todellisessa keskusmuistissa käyttöjärjestelmä pitää vain esim. viimeksi tarvittuja muistialueita.



Motivaatio ja historia

muokkaa

Virtuaalimuistin konsepti syntyi tarpeesta hallita automaattisesti eri muistivälineitä, joihin prosessorilla ei ollut suoraan pääsyä. Menetelmän kehitti fyysikko Fritz-Rudolf Güntsch Berliinin teknillisellä yliopistolla 1956.[1] Näin yhdistyvien pikamuistien toiminnan Güntsch selosti väitöskirjassaan 1957 seuraavasti:

”Ohjelmoijan ei tarvitse huomioida pikamuistitilan olemassaoloa lainkaan  (hänen ei tarvitse edes tietää, onko sitä olemassa). Siis on vain yhdenlaisia osoitteita, joita voi käyttää ohjelmoinnissa ikään kuin olisi olemassa vain yksi muistiyksikkö.”

Muistin vähyys, sen hinta ja fyysisesti viemä tila tulivat usein vastaan - vielä aivan lähihistorian aikana. Tämä on varmasti ollut motivaattorina virtuaalimuistin kehittämiselle. Muunkaan teknologian, esimerkiksi tietokoneiden, kehitys ei olisi ollut mahdollista samalla tavalla ilman virtuaalimuistin parantelua: se piti pystyä tuottamaan halvemmin, mahduttamaan pienempään tilaan ja saattamaaan kuluttajille helpommin saatavaksi.

Virtuaalimuistin toiminta

muokkaa

Virtuaaliosoite tai looginen osoite on suorittimen käyttämä osoite, jonka muistinhallintamekanismi muuttaa fyysiseksi muistiosoitteeksi, joita virtuaalimuisti käyttää toimiakseen. Jos aktiivisen prosessin koko osoiteavaruus on keskusmuistissa, niin virtuaalimuisti toimii tavallisen muistin tavoin.

Kuten aikaisemmin mainittiin, virtuaalimuisti tarvitsee toimiakseen laitteiston tukea. Laitteiston tulee pystyä keskeyttämään ajossa oleva käsky, jos käskyn tekemä muistiviittaus ei ole mahdollinen. Tämän jälkeen suoritus siirtyy käyttöjärjestelmän ytimelle, joka tarkistaa ensin, onko kyseessä virheellinen viittaus ohjelman sallitun osoiteavaruuden ulkopuolelle, ja mikäli ei ole, noutaa halutun sivun keskusmuistiin massamuistilaitteelta eli yleensä levyltä.[2]

Keskusmuistin ongelmana on, että muisti täyttyisi jos muistiin haettaisiin jatkuvasti sivuja. Virtuaalimuisti käyttää poistoalgoritmeja sivujen hävittämiseen keskusmuistista. Poistoalgoritmitien idea on poistaa sivuja, joita ei todennäköisesti tarvita kovinkaan pian. Poistoalgoritmeja ovat muiden muassa FIFO (engl. first in, first out), joka poistaa keskusmuistissa kauiten olleen sivun, LRU (engl. least recently used), joka poistaa pisimpään käyttämättömänä olleen sivun ja DWS (engl. Denning working set), joka pystyy mukautumaan prosessin muuttuviin tarpeisiin ja ennustaa hyvin sen pisteen, jolloin pitää siirtyä sivutuksesta heittovaihtoon(engl. swapping).[3]

Toimintaperiaate

muokkaa

Nykyään eri virtuaalimuistijärjestelmille on yhteistä seuraavat piirteet:

  1. Kaikki käytetyt osoitteet käsitellään ainoastaan virtuaaliosoitteina.
  2. Muistinhallintayksikkö kääntää virtuaaliosoitteet fyysisiksi osoitteiksi.
  3. Muistitilan kokonaisuus jaetaan muistiyksiköiksi.

Eri virtuaalimuistijärjestelmät eroavat toisistaan

  1. Virtuaalimuistin koon perusteella
  2. Sivukoon perusteella
  3. Muistinhallintayksikössä tapahtuvan virtuaaliosoitteen fyysiseksi osoitteeksi tapahtuvan kääntämisen periaatteen kautta
  4. Olemattomaan sivuun perustuvaan sivuvirheeseen tapahtuvan reagointiperiaatteen mukaan
  5. Ehkä ulkoistettujen sivujen käsittelyssä [4]

Virtuaalimuisti voidaan järjestää sivutuksen (paging), segmentoinnin (segmentation) tai heittovaihdon (swapping) kautta.[5]


 
Virtuaaliosoitteet käännetään fyysisiksi osoitteiksi. Osa tiedoista voi olla tilapäisesti muistilevylle sijoitettuna.[6]

Virtuaalimuisti sivutuksen kautta

muokkaa

Periaate on seuraava:

Prosessorin ilmoittamat muistiosoitteet ovat virtuaaliosoitteita, jotka muutetaan fyysisiksi osoitteiksi muistinhallintayksikössä (memory management unit, MMU). Muistinhallintayksikkö sisältyy kaikkiin suurempiin prosessoreihin, mutta mikrokontrollereissa MMU joudutaan tarvittaessa toteuttamaan ulkoisesti. Muistinhallintayksikkö pitää päivitettävän taulukon avulla kirjaa virtuaaliosoitteen fyysisestä sijainnista.

Sivutusjärjestelmässä muistiavaruus koostuu samankokoisista sivuista, 1024 sanaa sivua kohden (1 kt). Sivukoko voi vaihtoehtoisesti olla myös tästä 2n-kerrannainen, jonka koko määräytyy käyttöjärjestelmän perusteella.[7] Sivuilla on numero. Vastaavasti keskusmuisti (RAM) koostuu samankokoisista kehyksistä (frames), 1 kt.

Sivutaulukko on luetteloitu sivujen numeroiden mukaan. Sivutaulukon meneillään oleva osa sijaitsee Cache-muistissa nopean käytettävyyden varmistamiseksi. Tässä esimerkissä prosessori tuottaa 32-bittisen osoitteen. Sivunumeroon käytetään 20 bittiä ja muistipaikkaan 12 bittiä. Tällöin sivukoko on 4 kt ja muistia voidaan hallita 4 Gt edestä.


 
Kuva:  Virtuaalimuistipaikan  osoitteen  kääntäminen virtuaaliosoitteesta (sivunumero, solu) fyysiseksi osoitteeksi (lohkonumero, solu) [8]


Huomaa vasen sarake, jolla ilmaistaan validiteetti, onko kehysnumero oikein. Järjestelmällä tulee olla mahdollisuus korjata virheet. Kolme eri tilannetta voi ilmetä:

  • Rivi on validi, jolloin sivunumeron perusteella generoidaan fyysinen osoite.
  • Rivi ei ole validi, jolloin tulee löytää vapaa kehys ja sijoittaa sivunumero siihen.
  • Rivi on validi, mutta vastaa massamuistin osoitetta, jossa sijaitsee kehyksen sisältö. Järjestelmän täytyy palauttaa nämä tiedot keskusmuistiin.[9]





[Virtuaalimuistissa ne osat muistista, jotka eivät ole aktiivisesti käytössä, ensisijaisesti kopioidaan kovalevylle talteen, muistin vapauttamiseksi. Kun niitä tarvitaan, ne kopioidaan takaisin RAM-muistiin.]

[Virtuaaliosoitteet on oleellinen osa virtuaalimuistin toimintaa, mutta järjestelmää ei lueta samalla virtuaalimuistijärjestelmäksi pelkästään virtuaaliosoitteiden perusteella.]

[Virtuaalimuistin tekninen toteutus vaatii suorittimelta erityispiirteitä, esimerkiksi muistinhallintayksikön.]


Segmentointi

muokkaa
 
Kuva: Segmentaatiossa prosessorin ilmoittama virtuaaliosoite (segmentti, solu) käännetään fyysiseksi osoitteeksi segmenttitaulukon avulla. Ohjelman pyöriessä testataan, sijaitseeko kukin kutsuttava osoite segmenttialueella; virheestä seuraa hälytys.[10]

Segmentoinnissa muistikokonaisuus lohkotaan “sopivan” kokoisiksi segmenteiksi, joiden ei tarvitse noudattaa ennalta määrättyä sivukokoa. Tällä tähdätään siihen, että muistilohkojen kokonaisuudet olisivat paremmin yhteensopivia niiden käyttötarkoituksen kanssa. Lohkominen voi tapahtua niin, että lohkot määräytyvät eri tarkoitusten mukaan: ohjelman koodi, tiedot, aliohjelmat, moduulit. Kukin looginen kohde muodostaa segmentin. Segmentissä osoitus suoritetaan siirtymällä. Osoitetietopari (segmentti, solu) muodostaa fyysisen osoitteen kahden polun avulla, segmentin alkuun ja loppuun. Alku on segmentin ensimmäisen solun sijainti ja loppu viimeinen solu:[11]

 
Kuva: Muistitilan (1) vapaa tila pienenee, kun uusi segmentti sijoitetaan aukkoon. Jäljelle jäävä muistitila (2) ei välttämättä riitä käyttöjärjestelmän seuraavaan pyyntöön.[12]

Fragmentointiongelma:

muokkaa

Sivutukseen perustuvat järjestelmät aiheuttavat sisäisen pirstoutumisen ongelman, kun muistitilaa haaskaantuu vajaasti täytettyjen sivujen vuoksi. Segmentoivilla järjestelmillä on ulkoinen pirstoutumisongelma, koska segmenttien väliin jää pienen kokonsa vuoksi hyödyntämiskelvotonta muistitilaa. Muistitilajäänteitä voidaan palauttaa käyttöön tiivistämällä segmenttijonoa, eli siirtämällä niitä, mutta se vie järjestelmäaikaa.[13]






Heittovaihto

muokkaa

Joskus on tarpeen poistaa kaikki prosessin sivut tai segmentit keskusmuistista. Tätä kutsutaan heittovaihdoksi (swapping) ja kaikki tähän kuuluvat tiedot sijoitetaan massamuistiin. Näin voidaan tehdä pitkään lepotilassa olleille prosesseille, kun käyttöjärjestelmä tarvitsee tilaa ajankohtaisiin prosesseihin.

Ohjelmakoodin sivuja tai segmenttejä ei koskaan siirretä massamuistiin. Käynnissä olevaan suoritettavaan tiedoston sivuihin tai segmentteihin tulee päällekirjoituskielto niin, ettei niitä voi siirtää edes paikallisesti kesken suorituksen. Vastaavasti ei ole mahdollista käynnistää prosessia niin kauan, kun sitä koskevia sivuja tai segmenttejä ollaan siirtämässä. Jos laitteessa on liian vähän muistia ja joudutaan ajamaan ohjelma riittämättömällä määrällä muistia, kone jäätyy. Tätä ilmiötä kutsutaan ruuhkautumiseksi (englanniksi trashing). Tämän takia heittovaihdon sijaan pyritään käyttämään sivutusta.

Kerrostaminen

muokkaa

Kerrostus on tietokoneissa ennen virtuaalimuistin laajamittaista käyttöönottoa käytössä ollut menetelmä suurien ohjelmien ajamiseksi. Ennen virtuaalimuistia tietokoneiden fyysinen muisti eli muistiavaruus oli usein suurempi kuin suorittimen viittauskyky eli osoiteavaruus. Suuret ohjelmat eivät mahtuneet suhteellisen pieniin osoiteavaruuksiin (usein 16 bittiä), joten samat muistiosoitteet piti käyttää useampaan kertaan. Kerrostuksessa ohjelman eri osat sijoiteltiin siten, että sellaiset osat, joita ei tarvittu yhtä aikaa, käyttivät samaa osaa osoiteavaruudesta.

Kerrostaminen vaati kokemusta sekä tietämystä aiheesta (Ohjelmiston sisäiset suhteet), sillä vääränlainen kerrostaminen johti virheeseen tai laitteen hidastumiseen. Kerrostettava osa ohjelmaa haettiin massamuistilaitteelta ja jos kerrostusvaihtoehtoja vaihdettiin usein tämä hidasti ohjelman toimintaa.

Virtuaalimuistin ongelmat

muokkaa

Virtuaalimuisti on oleellinen ja tarpeellinen keksintö, jotta muistia saadaan lisää, eikä muisti ole, esimerkiksi fyysisesti, niin rajattu. Paljon muistia vievät tiedostot saadaan siis pyörimään nykyään useammissa ja pienemmissäkin koneissa, kuin aikaisemmin. Vaikka muistin hinta onkin laskenut, ei se silti ole ilmaista. Varsinkin monikäyttöjärjestelmässä muistin tarve saattaa hetkellisesti olla suurikin, koska suorituksessa on kerralla useita prosesseja.

Koneen nopeus tippuu kumminkin huomattavasti, kun dataa joudutaan siirtämään edes takaisin RAM:in ja kovalevyn välillä varsinkin suurempia muistialueita käsitellessä. Käyttöjärjestelmä tekee paljon töitä siirtääkseen dataa. Suuren RAM-muistin omaava kone kuitenkin helpottaa tätä nopeusongelmaa, mikäli se on käyttäjälle tärkeää. Tavallisesti myytävissä koneissa RAM:in koko ei silti edelleenkään ole päätä huimaava, eikä käyttäjä osaa sellaista välttämättä edes vaatia. Vaikka nopeus olisikin ongelmana niin on kuitenkin järkevää, jopa pakollista, sijoittaa ison osan sisäisestä muistista vievät tiedostot virtuaalimuistiin. Muistin sijaitseminen, esimerkiksi keskusmuistissa, hämää helposti etenkin tietämättömiä tietokoneen käyttäjiä ja ostajia. Yksilö ei välttämättä tiedä näiden muistien eroja, onko sitä niin sanotusti paljon vai vähän ja miten tämä vaikuttaa nopeuteen.

Myös reaaliaikavaatimukset eli vaatimus siitä, että jonkin toiminnon suorittamisaika on ennakkoon laskettavissa rajoittavat virtuaalimuistin käyttöä. Koska sulautetut järjestelmät ovat yleensä reaaliaikaisia, niissä ei voida yleensä käyttää virtuaalimuistia.


Lähteet

muokkaa

Viitteet

muokkaa
  1. https://de.wikipedia.org/wiki/Virtuelle_Speicherverwaltung
  2. https://fi.wikipedia.org/wiki/N%C3%A4enn%C3%A4ismuisti
  3. https://fi.wikipedia.org/wiki/N%C3%A4enn%C3%A4ismuisti
  4. https://de.wikipedia.org/wiki/Virtuelle_Speicherverwaltung#Definition
  5. https://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle
  6. https://fr.wikipedia.org/wiki/Mémoire_virtuelle#/media/File:Vm1.png
  7. https://www.cs.helsinki.fi/u/niklande/opetus/S2005/kj-1-2005/luento5-6p.pdf
  8. https://fr.wikipedia.org/wiki/Mémoire_virtuelle#/media/File:Vm4.png
  9. https://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle#M%C3%A9moire_virtuelle_pagin%C3%A9e
  10. https://fr.wikipedia.org/wiki/Mémoire_virtuelle#/media/File:Vm4.png
  11. https://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle#Segmentation
  12. https://fr.wikipedia.org/wiki/Mémoire_virtuelle#/media/File:Vm8.png
  13. https://fr.wikipedia.org/wiki/M%C3%A9moire_virtuelle#Probl%C3%A8me_de_fragmentation