Kaks 8 GB DDR4-2133 ECC 1.2V RDIMM-i
**Veaparandusega mälu** ehk **ECC-mälu** (ingl. k. *Error-correcting code memory*, lühidalt *ECC memory*) on teatud tüüpi arvuti andmete säilitamise seade, mis leiab ja parandab mälus tekkinud vigu. 

ECC-mällu on integreeritud veaparandusloogika ning selle kiibil olev algoritm parandab ühebitiseid vigu käigult: andmed, mis loetakse igast sõnast on alati samad nagu andmed, mis sinna kirjutatud olid, isegi siis, kui üks või rohkem salvestatud bitte on ümber pööratud valesse olekusse. Andmete parandus toimub kiibis endas ilma märgatavate viivituste või latentsusajata, samal ajal protsessorist sõltumata.

Suurem osa veatõrjekoodita mäludest ei suuda tekkinud vigu avastada, kuid leidub ka paarsustoega ECC-ta mälusid, mis leiavad küll vead, kuid ei paranda neid.

Emaplaat ja protsessor peavad toetama ECC-veaparandust, muidu töötavad ECC-moodulid ilma veaparanduseta.

Erinevused
----------

ECC DIMM-il on tavaliselt 9 mälukiipi mõlemal poolel, üks rohkem kui veaparanduseta DIMM-il
DIMM-il (ingl. k. *Dual in-line Memory Module*) on alati peal mingi arv mälukiipe. Individuaalsed kiibid võivad kasutada nelja (x4), kaheksat (x8) või 16 (x16) biti laiust andmesiini. Signaalirajad mälukontrolleris on otse mälukiipidega ühendatud (puhverdamata DIMM-idel), kuid x4 kiibid on siinkohal kasutud – neid saab kasutada vaid koos puhverdatud kiipidega.

Mälupiirkonnal, mis on unikaalselt adresseeritav vaid mälukontrolleri poolt, on 64 biti laiune (veaparanduseta) andmesiin ning süsteemidel, mis toetavad ECC-d, lisatakse veaparanduseks 8 bitti, mis teeb andmesiini 72 bitti laiaks. ECC-ta mälumoodulitel on kaheksa x8 kiipi (koosneb kaheksast füüsilisest kiibist) ning ECC-ga mälumoodulil on neid üheksa. x4 (4 biti laiune) DIMM koosneks aga 16 füüsilisest kiibist ning kui tegu on veaparandusega mälumooduliga, siis oleks kiipe 18 (16 bitis andmed, kahes bitis veaparandusinfo).

Vigade tüübid
-------------

Ühebitine mälu viga on andmete viga serveri väljundis või toodangus ning vigade säilimine võib anda suurt mõju serveri jõudlusele. Mälus esineb kahte tüüpi ühebitiseid vigu: riistvaralised (ing. k. *hard error*) ja tarkvaralised (ing. k. *soft error*) vead.

Riistvaralised vead võivad tekkida näiteks liigse temperatuuri muutumise, pingestressi või füüsilise stressi tekitamisest mälu osadele.

Tarkvaralised vead tekivad, kui andmed kirjutatakse või loetakse erinevalt, kui algselt kavatsetud – näiteks pinge muutumine emaplaadil, kosmiline kiirgus või radioaktiivsus võivad tekitada muutusi mälu bittides. Kuna bitid säilitavad oma programmeeritud väärtuse elektrilise laengu kujul, siis seda tüüpi häired võivad muuta mälu biti laengut, tekitades nendes vea. Serverites võivad seda tüüpi vead tekkida andmekandjates, protsessori tuumas, läbi võrguühenduse ning erinevat tüüpi mälus.

Vea tagajärg sõltub süsteemist. Süsteemides, kus ECC puudub, võib rike viia kokku jooksmiseni või isegi andmete hävinguni. Suurtes tootmiskohtades on mälus tekkinud vead põhilised riistvaralised põhjused masinate kokku jooksmisel. Mäluvead võivad tekitada ka turvariske. Serverites ja muudes arvutitest sõltuvates töökohtades, kus andmete hävimine ja süsteemirike peab igal juhul välditud olema (nt. finantssektor, teadustööd), eelistatakse seetõttu tihti kasutada ECC-mälu.

Tööpõhimõte
-----------

Andmetöötluses võetakse info vastu ja saadetakse bittides – kõige väiksem andmeüksus, informatsiooni põhiühik – mida esitatakse binaarkoodina, kasutades kas ühtesid või nulle. Kui bitid on kokku grupeeritud, moodustavad need binaarkoodi või "sõna", mis on andmeüksused, mille poole pöördutakse või mida liigutatakse mälu ja protsessori vahel.

Enne ECC-mälu kasutusele tulekut kasutati vigade leidmiseks paarsust. Andmeid hoitakse arvutis tavaliselt 8-bitistes gruppides. Kui vigade leidmiseks kasutatakse paarsust, lisatakse juurde veel üks, üheksas bitt, mida kutsutakse paarsusbitiks.

Kui mällu kirjutatud andmed on kujul 10110001, siis lisatud bitt teeb binaarkoodist 10110001**0**, kus viimane esitatud null on paarsusbitt, mida kasutatakse mälus tekkivate vigade leidmiseks. Kui binaarkoodis leiduvate ühtede summa on paarisarv (mitte arvestades paarsusbitti), siis kutsutakse seda paaris paarsuseks, mis leidub vigadevabal koodil. Kui andmetes leidub rike, muutub paarsusbitt valeks ning annab teada, et ülekande käigus tekkis viga. Paarsusel on aga kaks piirangut – see suudab tuvastada vaid paarituid vigu ning laseb paarisarvulistel vigadel mööduda. Samuti ei suuda paarsus vigu parandada, vaid ainult tuvastada.

| 7 bitti infot | (1-bittide arv) | 8 bitti koos paarsusega |
| --- | --- | --- |
| paaris | paaritu |
| 0000000 | 0 | 0000000**0** | 0000000**1** |
| 1010001 | 3 | 1010001**1** | 1010001**0** |
| 1101001 | 4 | 1101001**0** | 1101001**1** |
| 1111111 | 7 | 1111111**1** | 1111111**0** |

Neid probleeme saab parandada kasutades DRAM-mooduleid, millele on lisatud lisaks mälubitte ja mälukontrollereid, mis neid bitte kasutavad. Täiendavaid bitte kasutatakse selleks, et salvestada paarsust või kasutada veatõrjekoodis. ECC on "pikendus" paarsusele, sest see kasutab mitut paarsusbitti, mis on määratud suurematele andmegruppidele mitte ainult vigade leidmiseks, vaid ka nende parandamiseks. Selle asemel, et anda üks paarsusbitt iga kaheksa biti andmete jaoks, kasutab ECC 7-bitist koodi, mis on automaatselt genereeritud iga 64 biti RAM-i salvestatud andmete jaoks. Kui süsteem loeb salvestatud 64 bitti, siis genereeritakse teine 7-bitine kood, mida võrreldakse algselt loodud 7-bitise koodiga. Koodide võrdsuse puhul on andmed vigadeta, vastasel juhul otsib süsteem üles, kus viga tekkis ning suudab selle parandada, võrreldes omavahel kahte genereeritud 7-bitilist koodi. Viga parandatakse automaatselt ning salvestatakse selle toimumine. Sel juhul süsteemi kasutust viga ei mõjuta. Seda meetodit kutsutakse Reedi-Solomoni koodiks.

Hammingu(4,7) koodi 4 andmebitti (d1, d2, d3, d4) ja 3 paarsusbitti (p1, p2, p3)
Samuti kasutatakse ECC-mällu integreeritud Hammingu koodi, tänu millele suudavad mälu moodulid tuvastada ja parandada tekkinud vigu. Hammingu kood on kodeerimisteoorias lineaarne veaparanduskood, mis kodeerib neli bitti andmeid seitsmesse bitti, lisades juurde kolm paarsusbitti. Tänu lisatud kolmele kontrollbitile suudab Hammingu algoritm parandada iga ühebitise tekkinud vea või avastada kõik ühe- ja kahebitised vead.

Hammingu ja RS-koodi võrreldes on andmesideks kahest tõhusam Reedi-Solomoni kood selle madala kodeerimiskeerukuse astme ja kõrge kodeerimissuhte tõttu. Hammingu kood on arvutuslikult lihtsam, kuid suudab korraga tuvastada kuni 3 viga ning parandada vaid ühe. Reedi-Solomoni kood võib aga parandada samaaegselt mitu andmetes tekkinud viga.

Tänu ühebitiste vigade leidmisele ja parandamisele aitab ECC-serveri mälu säilitada ja hoida andmed rikkumata, takistada andmete häving ning ära hoida süsteemi kokku jooksmine ning muud süsteemitõrked.

Vahemälu
--------

Paljud protsessorid kasutavad veaparanduskoode kiibil oleva vahemälu jaoks, kaasa arvatud Intel Itaniumi, AMD Athloni ja Opteroni protsessorid.

Alates aastast 2006 on EDC/ECC ja ECC/ECC kaks kõige levinumat vahemälu vigate kaitseviise kasutusel kommertsmikroprotsessorites. EDC/ECC kasutab vea leidmise koodi (EDC, ingl. k. *Error Detection Code*) esimese taseme vahemälu puhul. Kui viga on leitud, siis andmed taastatakse ECC-kaitstud teise taseme vahemälustt. ECC/ECC kasutab ECC-kaitstud esimese taseme ja ECC-kaitstud teise taseme vahemälu. Protsessorid, mis rakendavad EDC/ECC-d, kirjutavad alati info teise taseme vahemällu, kasutades *write-through* tehnikat (vahemälus kutsub iga muudatus esile sünkroonse andmete uuendamise põhimälus). Seetõttu vea leidmisel esimese taseme vahemälust lugemise ajal on andmete koopia alati teisest tasemest kättesaadaval.

Puhvermälu
----------

Puhvermälu kasutab tehnoloogiat, mis on tihti paaris, aga mitte otse seotud, ECC-mäluga. Puhvermälul on "puhver", mis asub RAM-i ja süsteemi mälu kontrolleri vahel ning vähendab mälukontrolleri koormust.

Puhverdamata mälu korral pöördub mälukontroller otse mälupankade juurde. Puhverdatud ECC-mälu puhul aga suheldakse kõigepealt puhvermäluga ning alles seejärel pöördutakse mälupankade poole. Seetõttu võtavad juhised umbes ühe protsessori takti rohkem aega, kuid koormus protsessori mälukontrollerile on seeläbi väiksem. Puhvermälu tagab, et üheaegselt saab kasutada rohkem mälumooduleid, kui see tavaliselt võimalik oleks.

Kuigi ECC RAM ei ole alati puhverdatud, siis peaaegu kõik puhvermälud on ECC-d. Põhjuseks on, et süsteemid, mis kasutavad suurt mälumahtu, peavad peaaegu alati stabiilsust väga tähtsaks.

Puudused
--------

ECC on disainitud olema stabiilsem kui traditsiooniline RAM ja rikkekontrollid on seda ka tõestanud. Samas aga leidub ka ECC-l puudusi. Esiteks ei toeta iga arvuti ECC-mälu. Suurem osa serverite ja tööjaamade emaplaatidest nõuavad ECC RAM-i kasutamist, kuid suurem osa lauaarvutite süsteemidest ei tööta ECC-ga või on nende ECC-funktsioonid blokeeritud.

Teiseks probleemiks on maksumus. Kuna ECC-RAM vajab lisaks ühte mälukiipi ning selle ehitus on keerulisem, siis on veaparandusega mälu hind ka 10–20% kõrgem kui traditsioonilise RAM-i hind.

Samuti on veaparandusega mälu vähesel määral aeglasem kui veaparanduseta RAM. Paljud mälude tootjad ütlevad, et ECC-RAM võib olla umbes 2% aeglasem kui traditsiooniline mälu. Seda põhjustab aeg, mis tuleb lisaks, kui süsteem viib läbi veakontrolli, tehes kindlaks, ega mälus rikkeid tekkinud ei ole. Kui võrrelda omavahel protsessoreid Intel Core i7 4771 3.5 GHz Quad Core 8MB ja Intel Xeon E3-1275 V3 3.5 GHz Quad Core 8MB, näitab reeper jõudluses 2,2% erinevust.

| Veaparandusega mälu | Veaparanduseta mälu |
| --- | --- |
| Leiab vead automaatselt ning parandab need | Ei suuda vigu parandada, kuid mõned on võimelised neid leidma |
| Kallim hind | Odavam hind |
| 2% aeglasem jõudlus | 2% kiirem jõudlus |
| Sobib kõige paremini süsteemidele, kus töötatakse eriti tähtsate andmetega (serverid, tööjaamad) | Sobivaim tavakasutuseks (kodusüsteem) |

Viited
------

1. ↑  "ECC RAM". *intelligentmemory.com* (inglise). Originaali arhiivikoopia seisuga 12.02.2019. Vaadatud 01.05.2017.
2. 1 2 3  Werner Fischer. "RAM Revealed". *admin-magazine.com* (inglise). Vaadatud 01.05.2017.
3. 1 2 3 4 5  "What is ECC memory?". *crucial.com* (inglise). Originaali arhiivikoopia seisuga 28.04.2017. Vaadatud 01.05.2017.
4. ↑  Bianca Schroeder, Eduardo Pinheiro, Wolf-Dietrich Weber. "DRAM Errors in the Wild: A Large-Scale Field Study" (pdf). *cs.toronto.edu* (inglise). Vaadatud 01.05.2017.`{{netiviide}}`: CS1 hooldus: mitu nime: autorite loend (link)
5. 1 2 3 4 5  Matt Bach (05.11.2013). "Advantages of ECC Memory". *pugetsystems.com* (inglise). Vaadatud 01.05.2017.
6. ↑  Chukwuma Okeke (detsember 2015). "A Comparative Study between Hamming Code and Reed-Solomon Code in Byte Error Detection and Correction" (pdf). *academia.edu* (inglise). Vaadatud 01.05.2017.
7. ↑  Nathan N. Sadler, Daniel J. Sorin. "Choosing an Error Protection Scheme for a Microprocessor's L1 Data Cache" (pdf). *people.ee.duke.edu* (inglise). Vaadatud 01.05.2017.
8. ↑  Patrick Kennedy (09.03.2011). "Unbuffered versus Registered ECC Memory – Difference between ECC UDIMMs and RDIMMs". *servethehome.com* (inglise). Vaadatud 01.05.2017.