Muisti (tietokone)

Wikipediasta
(Ohjattu sivulta Rowhammer)
Siirry navigaatioon Siirry hakuun
Muistityypit
Haihtuvat muistityypit
Haihtumattomat muistityypit

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.[1] Keskusmuisti on haihtuvaa muistia, jossa ohjelma pidetään sen suorittamisen aikana, ja massamuisti on haihtumatonta muistia, jossa ohjelma on tallennettuna kun ohjelmaa ei suoriteta.[1]

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.

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.[2] Ratkaisu oli ensimmäinen korkeanopeuksinen täysin elektroninen muisti.[2]

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 (engl. core memory, josta jäänteenä suom. ydinmuisti). 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.[3]

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.[4] Kilpailijoiden käyttämä muistinosoitusmenetelmä olisi vaatinut kalliimpia piirejä kun niiden kapasiteetti kasvaa.[4]

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

Arkkitehtuurit

[muokkaa | muokkaa wikitekstiä]
Pääartikkeli: Muistiarkkitehtuuri

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.[6] Suurien tietomäärien käsittelyyn erikoistuneissa tietokoneissa voidaan käyttää perinteisen väylän sijaan ristikytkentämatriisia ja kehittynyttä kytkentäverkkoa.[7]

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ä.[7][8]

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ä.[8]

Muistihierarkia

[muokkaa | muokkaa wikitekstiä]

Tietokoneen muisti voidaan jakaa hierarkiaan seuraavasti:[9]

  1. nopea sisäinen muisti, suorittimen rekisterit ja välimuisti
  2. keskusmuisti, järjestelmän käyttämä hajasaantimuisti sekä ohjainkorttien muisti
  3. massamuisti, välittömästi käytettävissä oleva tallennuskapasiteetti, on-line
  4. massamuisti, joka ei ole välittömästi käytettävissä, off-line

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

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.[10]

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.[11] Grafiikkaprosessorien muistimalli poikkeaa tietokoneen suorittimen käyttämästä ja on huomattavasti rajatumpi käsittelytavassa.[12]

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

Muistin käyttö- ja toteutustavat

[muokkaa | muokkaa wikitekstiä]

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

[muokkaa | muokkaa wikitekstiä]

Keskusmuisti (main memory) on tietokoneohjelmien käyttämä työmuisti, jota suoritin voi käyttää.[10] 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

[muokkaa | muokkaa wikitekstiä]

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

[muokkaa | muokkaa wikitekstiä]

Muistit voidaan lisäksi jakaa kahteen luokkaan sen mukaan, häviääkö niihin tallennettu tieto virransyötön katketessa vai ei. Haihtumattomien muistien (engl. non-volatile memory) sisältö säilyy ilman virransyöttöä, haihtuvissa muisteissa (engl. volatile memory) 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

[muokkaa | muokkaa wikitekstiä]

Lukumuistin (engl. read-only memory, ROM) sisältöä ei voi muuttaa. Luku-kirjoitusmuistin tai hajasaantimuistin (engl. read-write memory, RWM, engl. random access memory RAM) sisältöä voidaan muuttaa.

Virheenkorjaavamuisti (ECC, EDAC)

[muokkaa | muokkaa wikitekstiä]
30-pinnistä SIMM-muistia, jossa yhdeksäs muistipiiri on käytössä pariteettitiedon säilömiseen.

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

EDAC (engl. Error Detection and Correction) tarkoittaa virheen ja havaitsemista ja korjaamista.[15]

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

Muistivirheet

[muokkaa | muokkaa wikitekstiä]

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.[14] Muistivirheet voivat sotkea tietokoneen käsittelemää tietoa tai jopa kaataa järjestelmän.

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

Tietoturvariskit

[muokkaa | muokkaa wikitekstiä]

Tietojen korruptoitumisen lisäksi DRAM-piireissä olevia virheitä voidaan hyödyntää tietoturvahyökkäyksissä kuten RowHammer.[17] Hyökkäys pyrkii muuttamaan käyttäjän oikeuksia aiheuttamalla virhe (bitin tilan muutos) toistuvalla muistihaulla.[17][18] DDR4-muisteissa on mukana DRAM-valmistajan omaa logiikkaa hyökkäysten torjumiseen, mutta hyökkäykset ovat edelleen mahdollisia.[19] 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.[20]

Muistimoduuleja. Ylhäältä alas: DIP, SIPP, SIMM (30 piikkiä), SIMM (72 piikkiä), DIMM ja DDR DIMM

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.[21] 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.[22]

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

Osoiteavaruus

[muokkaa | muokkaa wikitekstiä]

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.[23]

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.[24][25]

  1. a b David A. Patterson, John L. Hennessy: Computer Organization and Design: The Hardware/Software Interface, Third Edition, s. 23. Määritä julkaisija! Computer Organization and Design: The Hardware/Software Interface, Third Edition (viitattu 6.7.2018).
  2. a b Timeline of Computer History computerhistory.org. Viitattu 5.1.2021. (englanniksi)
  3. The Invention of On-Demand Data IBM. Viitattu 8.2.2020. (englanniksi)
  4. a b Chip Hall of Fame: Mostek MK4096 4-Kilobit DRAM spectrum.ieee.org. 30.6.2017. Viitattu 20.1.2020. (englanniksi)
  5. a b DVST Graphic Terminals vintagetek.org. Viitattu 21.10.2021. (englanniksi)
  6. Stokes, Jon: API Networks Launches Switch; HyperTransport Moves Closer (sivu 1) ars technica. Viitattu 13.3.2017. (englanniksi)
  7. a b Ian Mapleson: O2 Architecture sgidepot.co.uk. 4.12.2007. Viitattu 2.6.2018.
  8. a b Ulrich Drepper: What Every Programmer Should Know About Memory (PDF) akkadia.org. 21.11.2007. Viitattu 29.10.2019. (englanniksi) 
  9. a b Toy, Wing & Zee, Benjamin: Computer hardware/software architecture, s. 30. Prentice-Hall, 1986. ISBN 0-13-163502-6 Teoksen verkkoversio. (englanniksi)
  10. a b Peter J. Denning: Before Memory Was Virtual (PDF) denninginstitute.com. 1.11.1996. Viitattu 14.7.2021. (englanniksi)
  11. GPU Architectures (PDF) ec.europa.eu. Viitattu 6.12.2021. (englanniksi)
  12. Aaron Lefohn: GPU Memory Model Overview (PDF) seas.upenn.edu. Viitattu 6.12.2021. (englanniksi)
  13. Linley Gwennap: P6 Microcode Can Be Patched (PDF) ele.uva.es. 15.9.1997. Arkistoitu Viitattu 26.9.2020. (englanniksi) 
  14. a b c The Value of Using ECC Memory in Embedded Applications (PDF) lokakuu 2009. AMD. (englanniksi)
  15. a b c A. H. Johnston: Space Radiation Effects in Advanced Flash Memories (PDF) trs-new.jpl.nasa.gov. Arkistoitu Viitattu 4.1.2021. (englanniksi)
  16. a b Stephen Shankland: Google: Computer memory flakier than expected cnet.com. 7.10.2009. Viitattu 4.1.2021. (englanniksi)
  17. a b Dan Goodin: Cutting-edge hack gives super user status by exploiting DRAM weakness arstechnica.com. 10.3.2015. Viitattu 4.1.2021. (englanniksi)
  18. Flipping Bits in Memory Without Accessing Them: An Experimental Study of DRAM Disturbance Errors (PDF) users.ece.cmu.edu. Viitattu 5.1.2021. (englanniksi)
  19. Introducing Half-Double: New hammering technique for DRAM Rowhammer bug security.googleblog.com. 25.5.2021. Viitattu 25.5.2021. (englanniksi)
  20. Dan Goodin: There’s a new way to flip bits in DRAM, and it works against the latest defenses arstechnica.com. 19.10.2023. Viitattu 20.10.2023. (englanniksi)
  21. Torres, Gabriel: Inside AMD64 Architecture Hardware Secrets. Viitattu 4.10.2017.
  22. IBM Brings DDR4 Memory To Bear On Power Systems IT Jungle. Viitattu 4.10.2017.
  23. PA-RISC 2.0 Prentice-Hall, Inc.. Viitattu 19.1.2017.
  24. Sharwood, Simon: Linux 4.14 'getting very core new functionality' says Linus Torvalds The Register. Viitattu 19.9.2017.
  25. Larabel, Michael: Intel Working On 5-Level Paging To Increase Linux Virtual/Physical Address Space Phoronix. Viitattu 19.9.2017.

Aiheesta muualla

[muokkaa | muokkaa wikitekstiä]