Muisti (tietokone)

**Muisti** on tietokoneen osa, johon voidaan tallentaa tietoa. Tieto voidaan tallentaa sähkövarauksina, magneettisina varauksina tai optisesti luettavaan muotoon.

Tietokoneen muisti voidaan jakaa karkeasti primääriin ja sekundaariseen muistiin eli keskusmuistiin ja massamuistiin. Keskusmuisti on haihtuvaa muistia, jossa ohjelma pidetään sen suorittamisen aikana, ja massamuisti on haihtumatonta muistia, jossa ohjelma on tallennettuna kun ohjelmaa ei suoriteta.

Tietokoneen muistin kapasiteetti mitataan bitteinä tai tavuina. Muistipiirien kapasiteetti ilmoitetaan yleensä bitin monikertoina, keskusmuistin kapasiteetti tavun monikertoina. 1980-luvulla mikrotietokoneissa oleva muistimäärä ilmoitettiin kilotavuina, nykyisissä älypuhelimissa on gigatavuja muistia ja supertietokoneissa on petatavuja muistia.

Modernissa tietokoneessa on muistia keskusmuistin lisäksi muun muassa näytönohjaimessa, oheislaitteissa kuten verkkokortissa, suorittimen sisäistä välimuistia ja niin edelleen.

## Historia

Ensimmäisten tietokoneiden keskusmuisti oli toteutettu releillä tai elektroniputkilla. Massamuistina käytettiin paperisia reikänauhoja. 1940- ja 1950-luvuilla kehitettiin elohopeamuistit, joissa tieto tallennettiin akustisesti putken päästä toiseen eteneviin ääniaaltoihin.

Williams-putki oli katodisädeputki, jota käytettiin muistin tavoin: piste säilyi sekunnin murto-osan ennen haihtumistaan. Ratkaisu oli ensimmäinen korkeanopeuksinen täysin elektroninen muisti.

Magneettiset muistit syrjäyttivät muut muistitekniikat 1950-luvun lopulta lähtien. Keskusmuistina käytettiin aluksi rumpumuistia, jossa tieto tallennetaan nopeasti pyörivän rummun pinnalle. Ne hävisivät kuitenkin nopeasti ferriittirengasmuistille (, josta jäänteenä ). Rengasmuisti koostuu pienistä ferriittirenkaista, joissa oleva magneettikenttä voi vaihtaa suuntaa myötäpäivään tai vastapäivään. Jokaiseen renkaaseen voidaan siis tallentaa yksi bitti.

Muita muistityyppejä olivat kuplamuisti ja kalvomuisti.

MOS-tekniikkaan perustuvan puolijohdemuistin (DRAM) keksi Robert Dennard vuonna 1966 ja sai sille patentin vuonna 1968.

Yksi mikropiiri kykeni aluksi tallentamaan 1024 bittiä. Se oli huima parannus ferriittirengasmuisteihin verrattuna ja mikropiirit syrjäyttivät nopeasti rengasmuistit.
Mostekin kehittämä menetelmä muistisolujen osoittamiseen mahdollisti hintojen pitämisen alhaisempana kapasiteetin kasvaessa, mikä vaikutti merkittävästi niiden suosioon. Kilpailijoiden käyttämä muistinosoitusmenetelmä olisi vaatinut kalliimpia piirejä kun niiden kapasiteetti kasvaa.

Ennen DRAM-muistien hintojen laskua näytön virkistykseen perustuvat rasterigrafiikkaa käyttävät näytöt olivat kalliita.  Tektronixin päätteet pitivät kuvaa näytöllä omalla tekniikkallaan.

## Arkkitehtuurit

Tietokoneiden muistikäsittelyn ratkaisut vaihtelevat käyttötarkoituksen mukaan. Suurtietokoneet ja supertietokoneet sekä klusterit käyttävät erilaisia ratkaisuja kuin tavalliset henkilökohtaiset tietokoneet tai sulautetut järjestelmät.

Muisti on yleensä kytketty suorittimeen suoritinväylällä tai kytkentäverkolla. Nykyään käytetään moniprosessointiin soveltuvia pakettikytkentäisiä ratkaisuja, joita ovat esimerkiksi HyperTransport ja QuickPath.
Suurien tietomäärien käsittelyyn erikoistuneissa tietokoneissa voidaan käyttää perinteisen väylän sijaan ristikytkentämatriisia ja kehittynyttä kytkentäverkkoa.

Arkkitehtuurista riippuen muistin käyttötapa vaihtelee ja on useita tapoja luokitella arkkitehtuurit: UMA-arkkitehtuurissa esimerkiksi näyttö- ja grafiikkatoimintoja käsittelevät piirit voivat pystyä jakamaan keskusmuistia suorittimen kanssa, kun taas NUMA-arkkitehtuurissa viive muistin käytössä riippuu sen fyysisestä etäisyydestä.

Oheislaitteiden ja muistin välinen yhteys on aiemmin vaatinut suorittimen apua, mutta DMA:n käyttö on mahdollistanut muistin käytön ilman suorittimen keskeytystä.

## Muistihierarkia
Tietokoneen muisti voidaan jakaa hierarkiaan seuraavasti:
# nopea sisäinen muisti, suorittimen rekisterit ja välimuisti
# keskusmuisti, järjestelmän käyttämä hajasaantimuisti sekä ohjainkorttien muisti
# massamuisti, välittömästi käytettävissä oleva tallennuskapasiteetti, *on-line*
# massamuisti, joka ei ole välittömästi käytettävissä, *off-line*

Hierarkian tasot eroavat vasteajoissa, käytetyssä teknologiassa ja ohjaukseen tarvittavassa monimutkaisuudessa.

Tietokoneen suoritin ei voi suoraan käyttää kuin sen sisäistä muistia sekä keskusmuistia, mistä johtuen ohjelmat on ladattava keskusmuistiin suorittamista varten. Näennäismuisti mahdollistaa massamuistin käytön keskusmuistin jatkeena.

Ohjainkorteilla on usein omaa muistia. Esimerkiksi näytönohjaimilla on näyttömuistia (Video RAM) ja grafiikkaprosessoreilla on omat rekisterit ja omaa välimuistia sekä muuta muistia. Grafiikkaprosessorien muistimalli poikkeaa tietokoneen suorittimen käyttämästä ja on huomattavasti rajatumpi käsittelytavassa.

Suorittimen sisäistä muistia on myös mikro-ohjelmalle varattu SRAM-muisti, jota käytetään tietyissä suoritinperheissä.

## Muistin käyttö- ja toteutustavat

Tietokoneen muistijärjestelmä toteutetaan tavallisesti käyttämällä useita erilaisia komponentteja muistin eri osien käyttötarpeiden mukaisesti. Muistit voidaan luokitella usean eri kriteerin perusteella eri tyyppeihin:
* välimuisti tai keskusmuisti käyttötarkoituksen mukaan
* hajasaanti-, suorasaanti ja sarjasaantimuisteihin muistin hakutavan perusteella
* lukumuisteihin (ROM) ja luku-/kirjoitusmuisteihin (RAM) sen mukaan voidaanko muistiin kirjoittaa vai ei
* haihtuviin ja haihtumattomiin muisteihin tiedon keston mukaan (*volatile*, *non-volatile*)
* tallennusvälineen (media) perusteella levy-, nauha- tai puolijohdemuisteihin, ks. massamuisti

### Keskusmuistit

Keskusmuisti (*main memory*) on tietokoneohjelmien käyttämä työmuisti, jota suoritin voi käyttää. Ohjelmat ja niiden käyttämät tiedot pitää hakea työmuistiin ennen kuin prosessori voi suorittaa tai käyttää niitä. Nykyään keskusmuistina käytetään DRAM-tyyppisiä puolijohdemuisteja.

Keskusmuistin toimintaa nopeutetaan tallentamalla sen useimmin käytetyt osat keskusyksikön yhteyteen sijoitettuun välimuistiin. Välimuistina käytetään SRAM-tyyppistä puolijohdemuistia.

Muistityypit voidaan yhdistää niin, että niitä kaikkia voidaan käyttää samaan tapaan. 

### Muistin saantitavat

Muistit jaetaan niiden saantitavan mukaan kahteen luokkaan, *suorasaantimuisteihin* sekä *sarjasaantimuisteihin*. 
Sarjasaantimuistit käyttävät yleensä tietovälineenä nauhaa, suorasaantimuistit levyä. Sarjasaantimuisteissa koko nauhan sisältö voidaan joutua kelamaan lukupään ohi ennen kuin haluttuun tietoon päästään käsiksi. Suorasaantimuisteissa tietoalkio voidaan hakea suoraan sen osoitteen perusteella. Nykyisissä kiintolevyissä hakuaika on alle kymmenen millisekuntia. Lukupää siirtyy parissa millisekunnissa halutulle uralle ja koko uran sisältö voidaan lukea muutamassa millisekunnissa.

Hajasaantimuistit (engl. random access memory, RAM) erotetaan joskus omaksi luokakseen. Niissä minkä tahansa muistialkion haku tapahtuu mikrosekunnin murto-osassa. Hajasaantimuistit on nykyisin toteutettu puolijohteilla eikä niissä ole liikkuvia osia. Hajasaantimuisteja käytetään tavallisesti tietokoneen keskusmuistissa.

### Haihtumattomat muistit

Muistit voidaan lisäksi jakaa kahteen luokkaan sen mukaan, häviääkö niihin tallennettu tieto virransyötön katketessa vai ei. Haihtumattomien muistien () sisältö säilyy ilman virransyöttöä, haihtuvissa muisteissa () ei.

Perinteisessä puolijohdemuisteissa tieto on tallennettu sähkövarauksina ja tieto haihtuu niiltä nopeasti virransyötön katketessa. Levy- ja nauhamuisteissa tieto on tallennettu magneettisesti tai optisesti ja se säilyy ilman tehonsyöttöä. Ne sopivatkin hyvin massamuisteiksi.

On myös olemassa puolijohdemuisteja (ROM, PROM, tai EPROM), joilta tieto ei häviä tai se häviää hyvin hitaasti. Niille tieto voidaan tallentaa joko valmistusvaiheessa tai sähköisesti erillisen tallennuslaitteen avulla. Nykyisin käytetään tavallisesti EEPROM-tyyppisiä flash-muisteja, joille lukeminen ja kirjoittaminen onnistuu lähes keskusmuistin tapaan.

Haihtumattomia muistityyppejä on kehityksessä useita kuten FeRAM ja MRAM.

### Lukumuisti ja hajasaantimuisti

Lukumuistin (, ROM) sisältöä ei voi muuttaa. Luku-kirjoitusmuistin tai hajasaantimuistin (, RWM,  RAM) sisältöä voidaan muuttaa.

### Virheenkorjaavamuisti (ECC, EDAC)

Varhainen virheen havaitseminen DRAM-muisteissa perustui pariteettibittiin.
Myöhempi virheenkorjauskoodia käyttävä ECC-muisti perustuu Hamming-koodiin ja korjaa yhden bitin virheen sekä havaitsee kahden bitin virheen.

EDAC () tarkoittaa virheen ja havaitsemista ja korjaamista.

Eräät DRAM-muistit käyttävät monimutkaista sisäistä rakennetta, joka tekee virheen korjaavan EDAC-ominaisuuden toteuttamisesta vaikeampaa.

## Muistivirheet
Muistivirheet ovat bittien tilojen muuttumista toiseksi. Yleisimmät syyt muistin korruptoitumiseen ovat sähkömagneettiset häiriöt järjestelmässä tai sen välittömässä ympäristössä. Taustasäteilyn vaikutuksen on kuitenkin, enenevässä määrin, todettu muistivirheiden aiheuttajaksi. Muistivirheet voivat sotkea tietokoneen käsittelemää tietoa tai jopa kaataa järjestelmän.

Muistivirheitä esiintyy useissa muistityypeissä, mukaan lukien DRAM ja Flash-muisti.
Googlen tutkimuksen mukaan virheet ovat yleisempiä kuin on raportoitu. Googlen mukaan ”kovat” virheet ovat tyypillisempiä kuin ”pehmeät”: kovat virheet ovat korjaamattomia kun taas pehmeät ovat hetkellisiä tapahtumia kuten taustasäteilyn aiheuttamia.

### Tietoturvariskit
Tietojen korruptoitumisen lisäksi DRAM-piireissä olevia virheitä voidaan hyödyntää tietoturvahyökkäyksissä kuten RowHammer.
Hyökkäys pyrkii muuttamaan käyttäjän oikeuksia aiheuttamalla virhe (bitin tilan muutos) toistuvalla muistihaulla.
DDR4-muisteissa on mukana DRAM-valmistajan omaa logiikkaa hyökkäysten torjumiseen, mutta hyökkäykset ovat edelleen mahdollisia. RowPress on edistyneempi hyökkäysmenetelmä, joka perustuu rivin jättämiseen avoimeksi pidemmäksi aikaa ja hyötyy korkeammista lämpötiloista. Aiemmat keinot kuten virheenkorjaava muisti (ECC) ja muistin uudelleen virkistäminen (Target Row Refresh, TRR) eivät ole riittävän tehokkaita uudemmalta hyökkäykseltä suojautumiseen.

## Muistityypit

Keskusmuistin toteutustapa on DRAM-tyyppinen *dynaaminen* muisti haihtuva muisti. Tämä tarkoittaa sitä, että muistia on koko ajan virkistettävä, etteivät tiedot katoa. Joissain erikoistapauksissa keskusmuisti voi olla DRAM-muistin sijasta staattinen SRAM-muisti, jossa tiedot pysyvät virkistämättä. Suorittimen sisäinen välimuisti on tyypillisesti SRAM-muistia. Useita muistipiirejä löytyy myös virheenkorjaavana ECC-versioina, jotka käyttävät virheenkorjauskoodia.

Muistipiirin tyypin kuten DDR3 tai DDR4 määrittelee muistiohjain, joka on ollut erillinen mikropiiri emolevyllä (pohjoissilta, *northbridge*), mutta on yhä useammin integroituna suorittimeen. Varhaisimmat integroitua muistiohjainta käyttävät suorittimet olivat DEC Alpha 21066 ja HP PA-7300LC. Muita integroitua muistiohjainta käyttäviä suorittimia ovat AMD:n Athlon 64, IBM:n POWER5 ja Sun Microsystemsin UltraSPARC T1.

IBM:n Power8-suorittimet käyttävät Centaur DIMM (CDIMM) muistimoduuleja, joissa puskuripiirit ovat muistimoduuleilla integroituna suorittimen sijaan. 

Sulautetut järjestelmät voivat käyttää useaa muistityyppiä kuten SDRAM, SRAM ja ROM.

## Osoiteavaruus
Suorittimen toteutus rajoittaa miten paljon fyysistä muistia prosessori pystyy osoittamaan. 32-bittisellä osoiteväylällä voi osoittaa 4 Gt (232) ja 48-bittisellä 256 Tt muistia.
PA-RISC tukee 16 eksatavun muistiavaruutta.

Osoiteavaruus voi rajoittaa paljonko sovellus voi saada tietokoneen fyysisestä muistista käyttöönsä ja miten se näkee sen.
Yhden prosessin näkemä muistiavaruus on riippuvainen käyttöjärjestelmästä ja prosessorista muistisivujen ja näennäismuistin avulla: Linux-ytimeen on lisätty viisitasoinen muistisivutus, jolla maksimimuistimäärä kasvaa petatavuihin.

## Katso myös
* Puskurimuisti
* Video RAM

## Lähteet
*http://news.cnet.com/8301-30685_3-10370026-264.html 

### Viitteet

## Aiheesta muualla