La memoria è quella parte di computer dove sono memorizzati programmi e dati.
BIT (BInary digiT)
L'unità base della memoria è il BIT (BInary digiT), una variabile che può assumere solo 1 o 0.

Infatti un computer “ragiona” unicamente interpretando gruppi di bit, cioè comandi rappresentati da sequenze di “0” e di “1” (es. 00101100).
Siccome la numerazione binaria richiede due soli valori distinti, risulta il metodo più affidabile per codificare l’informazione digitale.
Indirizzi di memoria
La memoria è costituita da un certo numero di celle (o locazioni), dove ognuna può memorizzare informazioni.
La cella rappresenta la più piccola unità indirizzabile.
Tutte le celle hanno lo stesso numero di bit (di solito espresso in byte) , infatti una cella da bit, essa può contenere una qualsiasi delle combinazioni. (es. cella da 8 bit , può contenere 256 combinazioni → 00000000 fino a 11111111).
I byte possono essere raggruppati in parole (o WORDS), ovvero unità di dati che il processore può elaborare in una singola operazione. La dimensione di una word dipende dall’architettura del sistema.
Ogni cella ha un numero identificativo chiamato indirizzo della cella . Una memoria ha celle , suoi indirizzi svarieranno da a .
Ordinamento dei byte
I bytes di una parola posso essere scritti :
- SX → DX : ==BIG-ENDIAN==
- DX → SX : LITTLE-ENDIAN
ovvero il modo in cui i dati (words) vengono memorizzati nella memoria del computer.
Il byte più significativo (MSB) è il byte che ha il peso maggiore , ovvero quello che si trova all’estrema sinistra del numero. Il byte meno significativo (LSB) è il byte che ha il peso minore, ovvero quello che si trova all’estrema destra del numero.
es. 0x12345678
0x12(msb)0x78(lsb)
Big-Endian
Nel formato big-endian , il byte più singnificativo viene memorizzato all'indirizzo di memoria più BASSO.
Quindi avremo →
| indirizzo: | 0x1000 | 0x1001 | 0x1002 | 0x1003 |
|---|---|---|---|---|
| contenuto: | 0x12 | 0x34 | 0x56 | 0x78 |
Little-Endian
Nel formato little-endian , il byte più singnificativo viene memorizzato all'indirizzo di memoria più ALTO .
Quindi avremo →
| indirizzo: | 0x1000 | 0x1001 | 0x1002 | 0x1003 |
|---|---|---|---|---|
| contenuto: | 0x78 | 0x56 | 0x34 | 0x12 |
Codici di correzione di errore
Di solito i computer possono commettere degli errori, a causa di picchi di tensione sulle linee di alimentazione o altro. Per proteggersi da tali errori le memorie utilizzano dei codici di rivelazione e/o correzione degli errori , dove vengono aggiunti dei bit extra ad ogni parola di memoria.
Allora ad una parola di memoria con bit vengono aggiunti bit di controllo → parola di codice (o ==CODEWORD==) di .
Quando viene letta la parola dalla memoria, vengono controllati questi bit aggiuntivi per rilevare un errore ( e correggerlo in caso ), tutto attraverso una determinata procedura ( es. Hamming ).
La DISTANZA DI HAMMING tra due codeword è uguale al numero di differenze tra bit corrispondenti e per calcolarlo basta fare lo XOR (OR ESCLUSIVO) bit a bit e contare quanti bit = 1.
esempio → 1 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 -------------- 0 0 1 1 1 0 0 0 = 3 bit
Inoltre la percentuale di overhead decrementa al crescere della dimensione della parola →

Memoria cache
Squilibro di velocità tra CPU e memoria
Da una parte i progettisti di CPU creano architetture avanzate ( con pipeline per esempio ) che aumentano la velocità delle CPU. Dall’altra parte i progettisti di memorie, tendono ad aumentare la capacità delle memorie, ma non la loro velocità. squilibro → quando la CPU richiede un dato dalla memoria , deve aspettare molti giri di clock prima di riceverlo.
Gli ingegneri non possono inserire nei chip delle CPU memorie veloci , siccome questo aumenterebbe la dimensione e quindi anche il prezzo.
La soluzione è quindi combinare (CPU in mezzo) :
- piccola quantità di memoria veloce → cache
- grande quantità di memoria lenta → memoria principale in questo modo si ottiene un bilancio tra velocità e capacità di memoria ad un costo ragionevole.
La CACHE memorizza le parole di memoria che vengono utilizzate più frequentemente.

Quando la CPU ha bisogno di una parola :
- controlla la cache , se c’è buono (cache hit) la legge direttamente da qui → molto veloce.
- non è presente nella cache (cache miss) , la richiede dalla memoria principale → lento, ma una volta ottenuta, la copia nella cache per accessi futuri.
Principio di località temporale e spaziale
Il successo dell’utilizzo della cache si basa sul principio di località , ovvero il modo in qui i programmi tendono a :
- località spaziale : accedere ai dati o istruzioni che si trovano vicini in memoria.
- ( es. istruzioni di un programma sono eseguiti in modo sequenziale )
- località temporale : ripetere l’accesso sugli stessi dati o istruzioni dopo poco tempo.
- ( es. i loop ripetono le stesse istruzioni più volte )
Infatti quando la CPU accede ad una parola in memoria, non memorizza nella cache solo quella parola , ma memorizza anche le parole vicine.
Assemblaggio e tipi di memoria
A partire dagli anni 90, i moduli di memoria vengono realizzati con 8 o 16 chip montati su una scheda a circuiti stampati :
- SIMM (Single Inline Memory Module)
- DIMM (Double Inline Memory Module)
SIMM
Questi moduli hanno una singola riga di connettori (chip) su un lato della scheda:
- trasferiscono 32 bit / ciclo di clock
- 72 contatti
- poco utilizzati oggi
DIMM
Questi moduli hanno due righe di connettori (chip) su ciascun lato della scheda:
- trasferiscono 64 bit / ciclo di clock
- 240 contatti (120 x 2 lati)
- moduli utilizzati oggi → DDR3
La capacità totale di una scheda dipende dal numero di chip e dalla loro capacità.
Per esempio, una SIMM con 8 chip da 256 MB l’uno, ha una capacità totale di 2 GB.

Nei computer portatili , per le dimensione ridotte si usano le SO-DIMM (Small Outline DIMM) che mantengono le stesse funzionalità delle DIMM.
Inoltre alcuni modelli di memoria includono due chip destinati al controllo degli errori, ma il loro utilizzo è molto basso, quindi al giorno d’oggi alcuni non includono questa funzionalità.

Gerarchie di memoria
La soluzione tradizionalmente adottata per memorizzare una grande quantità di dati , è di organizzare gerarchicamente la memoria.


Infatti muovendosi verso il basso aumentano due parametri chiave:
- tempo di accesso
- capacità di memorizzazione
Infatti i registri della CPU sono le memorie piu piccole ( ordine dei byte ), più veloci ( ordine dei ns ) e le più costose. Mentre i nastri magnetici e i dischi ottici sono le memorie più grandi, lente ed economiche - ovviamente la capacità dipende dal budget disponibile all’utente.
Tra memoria centrale e disco magnetico c'è una grande spaccatura perché si passa da circa 10 ns fino ad almeno 10 ms
