Muistihierarkia ja virtuaalimuisti
Muistihierarkia
Tietoa talletetaan tietokonejärjestelmiin hyvin monella eri tasolla. Lähtökohta eri tasojen käytölle on periaate, että pienempi muisti on nopeampaa ja suurempi muisti on halvempi toteuttaa. Tämä on johtanut muistihierarkiaan, jonka olennaisia osia illustroitiin Juustokakkuesimerkillä (ks. luku 1).
Muistihierarkiassa on kolme selkeää tasoa. Sisimpänä ovat suorittimen kanssa samalla piirikortilla toteutetut muistit, keskimmäisellä tasolla yhdessä järjestelmässä (samassa kotelossa?) olevat nopeahkot muistit. Uloimpana verkossa olevat tai samassa järjestelmässä olevat hyvin hitaat laitteet.
Kaikkien sisimpänä samalla mikropiirillä suorittimen laiterekistereiden kanssa ovat nopeimmat välimuistit. Esimerkiksi, nopeimmat tason L1 ja L2 välimuistit voivat olla toteutettuna samalla mikropiirillä suorittimen kanssa, mutta vähän hitaammat tason L3 ja L4 välimuistit voivat sijaita omilla mikropiireillään välittömästi suorittimen vieressä.
Keskusmuisti sijaitsee samalla piirikortilla (emolevyllä) suorittimen kanssa ja on yhteydessä siihen väylän kautta. Keskusmuistin käyttö on huomattavasti (esim. 50x) hitaampaa kuin rekistereiden, mutta keskusmuisti on kooltaan huomattavasti suurempi (esim. 1 GB) kuin rekisterijoukko (esim. 0.5 MB). Välimuistiteknologian avulla keskusmuisti saadaan tuntumaan lähes yhtä nopealta kuin rekisterit.
Uusi flash-teknologiaan perustuva SSD (Solid State Disk) -massamuisti on usein vielä toteutettu kovalevyn lailla ulkoisena massamuistina, mutta se voi sijaita myös valmiiksi asennettuna emolevyllä. SSD-massamuisti on yleensä toteutettu niin, että se näyttää samalta kuin pyörivä kovalevy, vaikka onkin selvästi nopeampi (esim. 10x). Samasta teknologiasta on myös nopeampi versio, NVMe (NVM Express, Non-Volatile Memory). SSD:ssä (ja NVMe:ssä) on nopeuden lisäksi suurena etuna kovalevyyn verrattuna se, että siinä ei ole helposti vikaantuvia liikkuvia osia.
Ihmisen kanssa kommunikointiin tarkoitetut laitteet (esim. näppäimistö tai hiiri) kuuluvat myös järjestelmän "sisäisiin" laitteisiin, mutta ne ovat yleensä vielä monta kertaluokkaa hitaampia kuin massamuistit. Yleensä ihminen toimii sekunnin aikaskaalassa, mutta joiden graafisten käyttöliittymien kautta toiminta voi olla huomattavasti nopeampaa.
Järjestelmän ulkopuoliset muistit toimivat nekin sekunnin aikaskaalassa, koska tiedon siirtoon verkon läpi kuluu niin paljon aikaa. Tällaisia muistijärjestelmiä ovat organisaatioiden omat levypalvelimet ja erilaiset internetin pilvipalvelimet. Teoriassa tiedon hakeminen maapallon toiselta puolelta kestää tietenkin aika kauan aikaa, mutta käytännössä tieto haetaan useimmiten lähempänä olevasta www-välimuistista.
Jotkut järjestelmän laitteet (esim. magneettinauha) ovat yhtä hitaita kuin järjestelmän ulkopuoliset muistit ja niitä käsitellään myös samalla tavalla. Jako järjestelmän sisäisiin ja ulkoisiin laitteisiin on keinotekoinen - parempi tapa olisi luokitella laitteita niiden sijainnin mukaan väylähierarkiassa.
Virtuaalimuisti
Käytännössä ohjelman suorituksen aikana tiedot tulee säilyttää joko keskusmuistissa tai massamuistissa. Massamuisti on voi olla tuhat kertaa niin suuri kuin keskusmuisti, kun taas keskusmuisti voi olla miljoona kertaa niin nopea kuin massamuisti. Käyttöjärjestelmän virtuaalimuistiteknologia (virtual memory) antaa ohjelman käyttöön näennäisen muistialueen, joka on lähes yhtä nopea kuin keskusmuisti, mutta yhtä suuri kuin massamuisti.
Virtuaalimuisti on toteutettu kaikissa nykyisissä yleiskäyttöisissä käyttöjärjestelmissä (esim. Windows, Linux ja MacOS). Ratkaisu on kaksitasoinen. Kaikki ohjelman tiedot pidetään massamuistissa (virtuaalimuistin tukimuistissa) ja vain kulloinkin tarvittavat muistialueet pidetään keskusmuistissa. Tietoja kopioidaan yksi muistilohko eli sivu (page) kerrallaan aina tarvittaessa keskusmuistin ja tukimuistin välillä sillä tavoin, että lähes aina viitatut muistialueet löytyvät keskusmuistista. Ei tietenkään ole mitenkään yksinkertaista ennustaa etukäteen, mitä muistialueita kukin ohjelma tarvitsee keskusmuistiin lähitulevaisuudessa.
Jos ohjelma suoritusaikana viittaa muistipaikkaan, joka ei ole keskusmuistissa, tapahtuu sivunpuutoskeskeytys (page fault). Se on yksi etukäteen määritellyistä keskeytystyypeistä. Sivunpuutoskeskeytyksen yhteydessä sen aiheuttanut prosessi siirretään odotustilaan ja viitattu muistialue (ja sen lähialueita) kopioidaan tukimuistista keskusmuistiin, minkä jälkeen kyseinen prosessi pääsee takaisin suoritukseen. Tällöin se suorittaa saman konekäskyn uudelleen, mutta tällä kertaa viitattu tieto löytyy keskusmuistista. Tähän kaikkeen kuluu suhteellisesti ottaen hyvin paljon aikaa, mutta toivottavasti sivunpuutoskeskeytyksiä ei tapahdu kovin usein.
Jokaisen muistiviitteen kohdalla täytyy siis tarkistaa, onko viitattu muistialue keskusmuistissa ja missä siellä se mahdollisesti sijaitsee. Tällaista osoitteenmuunnosta ei voi tehdä yleensä ohjelmallisesti (usealla konekäskyllä), koska se hidastaisi suoritusta liikaa. Osoitteenmuunnosten tekemiseen nopeasti suorittimella (sen MMU:ssa) on oma erityislaitteistonsa, TLB (Translation Lookaside Buffer), joka toimii välimuistin tavoin. Useimmiten osoitteenmuunnos löytyy TLB:stä, mikä tekee virtuaalimuistijärjestelmien toiminnan mahdolliseksi. TLB-hudin (TLB miss) yhteydessä osoitteenmuunnos täytyy tehdä tavallisilla konekäskyillä muistissa olevia osoitteenmuunnostaulukoita (sivutaulu tai segmenttitaulu) käyttäen. Samalla tietenkin kopioidaan tehty osoitteenmuunnos TLB:hen.
Virtuaalimuistin toteutuksessa on muutamia eri tapoja. Yleensä tukimuistista kopioidaan vakiokokoisia muistilohkoja (sivuja) kerrallaan ja muistilohkojen koko (sivun koko) sopii hyvin yhteen käytössä olevan tukimuistin toteutukseen. Toinen vaihtoehto on tehdä kerralla kopioitavista muistilohkoista vaihtelevan kokoisia segmenttejä, jolloin ne taas sopivat paremmin yhteen prosessien hallinnoimien eri kokoisten muistialueiden (esim. koodisegmentti, datasegmentti tai pino) kanssa. Osoitteenmuunnos voidaan toteuttaa monitasoisena, jolloin siinä voi olla sekaisin segmentointia ja sivutusta. Lisäksi osoitteenmuutokseen voi liittyä aikaisemmin esitetty kanta- ja rajarekistereiden käyttö.
Virtuaalimuistin toteutukseen liittyy huomattava määrä käyttöjärjestelmän ohjelmistoa, mutta emme käsittele sitä tällä kurssilla tämän enempää. Virtuaalimuistijärjestelmän toiminta esitellään tarkemmin yliopiston käyttöjärjestelmäkurssilla.
Muistathan tarkistaa pistetilanteesi materiaalin oikeassa alareunassa olevasta pallosta!