Le memorie nei sistemi di elaborazione

// obiettivi di apprendimento
Comprendere la classificazione funzionale delle memorie nei sistemi di elaborazione
Conoscere le unità di misura della capacità di memoria e le implicazioni dei limiti fisici
Distinguere le principali tipologie di memoria primaria e di massa
Comprendere la struttura interna dei chip, lo stack e la gerarchia delle memorie
Conoscere i meccanismi di controllo e correzione degli errori in memoria
📄
Slides
Memorie
📚
Risorse
Esercizi sulle memorie
Vedi →

Classificazione funzionale delle memorie

In ogni sistema di elaborazione la memoria non è un blocco unico — è un ecosistema di tecnologie diverse, ciascuna ottimizzata per velocità, capacità, costo e persistenza specifici. La prima distinzione fondamentale è quella funzionale.

MEMORIA PRIMARIA
Direttamente accessibile dalla CPU
Contiene dati e istruzioni in uso
Veloce — latenza in nanosecondi
Capacità limitata
Esempi: RAM, ROM, Cache
MEMORIA SECONDARIA
Archiviazione permanente
Conserva dati senza alimentazione
Lenta — latenza in millisecondi (HDD) o μs (SSD)
Capacità enorme (TB)
Esempi: SSD, HDD, NAS, SAN

Unità di misura — bit, byte, word

Tutta l’informazione digitale — testo, numeri, immagini, suoni — viene rappresentata come sequenze di bit. Il sistema di misura della memoria è rigorosamente basato su potenze di 2.

1
BIT
Unità minima — valore 0 o 1
4
NIBBLE
Mezza cifra esadecimale
8
BYTE
Unità minima indirizzabile
16/32/64
WORD
Dipende dall’architettura CPU

Multipli del byte — potenze di 2

PrefissoSimboloValore esattoApprossimazione
KilobyteKB2¹⁰ = 1.024 byte≈ 1.000 byte
MegabyteMB2²⁰ = 1.048.576 byte≈ 1 milione di byte
GigabyteGB2³⁰ = 1.073.741.824 byte≈ 1 miliardo di byte
TerabyteTB2⁴⁰ ≈ 1,1 × 10¹² byte≈ 1.000 GB
// implicazioni dei limiti fisici
La dimensione finita della memoria ha conseguenze concrete: la virgola mobile introduce approssimazioni nei calcoli, la codifica in complemento a 2 limita l’intervallo dei numeri negativi, e quando la RAM si esaurisce il sistema operativo attiva la memoria virtuale — simulando più RAM usando spazio su disco a costo di prestazioni ridotte.

Memoria primaria — RAM e ROM

RAM — Random Access Memory

La RAM è la memoria di lavoro della CPU. È volatile (perde il contenuto allo spegnimento) e offre accesso diretto: il tempo di lettura/scrittura è costante indipendentemente dalla posizione della locazione acceduta — un vantaggio fondamentale rispetto ai supporti sequenziali.

DRAM — Dynamic RAM
Usa condensatori per memorizzare i bit. Richiede un ciclo di refresh continuo per mantenere la carica — senza refresh il dato si perde. Economica e ad alta densità.
Usata in: RAM dei PC e smartphone
SRAM — Static RAM
Usa flip-flop D — circuiti bistabili che mantengono il bit senza refresh finché c’è alimentazione. Molto più veloce ma anche molto più costosa e meno densa della DRAM.
Usata in: cache L1, L2, L3

Varianti moderne di DRAM

DDR
Double Data Rate
Trasferisce dati su entrambi i fronti del clock (salita e discesa) — raddoppia la banda rispetto alla SDRAM base. Evoluta in DDR2, DDR3, DDR4, DDR5.
SDRAM
Synchronous DRAM
Sincronizzata con il clock di sistema — elimina i tempi di attesa asincroni della DRAM classica, aumentando l’efficienza del trasferimento.
LPDDR
Low Power DDR
Variante a bassissimo consumo energetico per dispositivi mobili, IoT e sistemi embedded. Presente in smartphone, tablet e laptop ARM.

ROM — Read Only Memory

La ROM è non volatile e permanente: mantiene il contenuto anche senza alimentazione. Contiene il firmware essenziale del sistema — il BIOS nei PC tradizionali, il bootloader nei sistemi embedded. I dati sono scritti una sola volta (in fabbrica o tramite procedure speciali) e non modificabili durante l’uso normale.

TipoScritturaCancellazioneUso tipico
ROMSolo in fabbricaImpossibileFirmware fisso — BIOS storici
PROMUna sola volta dall’utenteImpossibilePrototipazione, produzione limitata
EPROMRiprogrammabileUV — luce ultraviolettaSviluppo embedded anni ’80–’90
EEPROMRiprogrammabileElettrica — byte per byteConfigurazioni persistenti MCU
FlashRiprogrammabileElettrica — per blocchiSSD, chiavette USB, smartphone

Organizzazione interna della memoria

La memoria centrale è organizzata in celle (o locazioni), ognuna con un indirizzo univoco e una dimensione standard di 8 bit. Le celle sono raggruppate in word la cui dimensione varia con l’architettura (16, 32 o 64 bit).

// indirizzamento
Assoluto — specifica la posizione reale nella memoria fisica
Relativo — espresso come base + spiazzamento (offset). Alla base (registro segmento) si somma l’offset per ottenere l’indirizzo fisico. Fondamentale per la rilocazione dinamica.
// struttura di un chip di memoria
Le celle sono organizzate in matrice (righe × colonne). Un decodificatore — circuito con n ingressi e 2ⁿ uscite — seleziona la riga e la colonna giuste, attivando esattamente una cella per ogni combinazione di indirizzi.
n = 8 bit → 2⁸ = 256 locazioni indirizzabili

Lo Stack — memoria LIFO

Lo stack è una regione speciale della memoria centrale con accesso vincolato. Funziona secondo la logica LIFO (Last In, First Out): l’ultimo dato inserito è il primo ad essere estratto. Il registro SP (Stack Pointer) punta sempre alla cima dello stack — l’ultima locazione occupata.

// a cosa serve lo stack
Indirizzo di ritorno dalle subroutine
Salvataggio dei registri CPU
Passaggio dei parametri alle funzioni

Operazione PUSH — esempio dettagliato

Stato iniziale: SP = 0x1000. Vogliamo inserire il valore 0xAB.

// passaggi PUSH 0xAB
  1. SP viene decrementato: 0x1000 → 0x0FFF
  2. Il valore viene scritto: Mem[0x0FFF] = 0xAB
// stato finale
SP = 0x0FFF
Mem[0x0FFF] = 0xAB
// perché si decrementa?
Lo stack cresce verso indirizzi più bassi. L’area sopra la cima (> SP) è già occupata; l’area sotto (< SP) è libera e disponibile per nuovi push.

Operazione POP — esempio dettagliato

Stato iniziale: SP = 0x0FFF, Mem[0x0FFF] = 0xAB. Vogliamo estrarre il dato in cima.

// passaggi POP
  1. La CPU legge la cima: dato ← Mem[0x0FFF]0xAB
  2. SP viene incrementato: 0x0FFF → 0x1000
// stato finale
SP = 0x1000
dato ottenuto = 0xAB
// il dato non viene “cancellato”
Dopo la POP, Mem[0x0FFF] contiene ancora 0xAB — ma la locazione è considerata libera perché SP ora punta sopra di essa. Verrà sovrascritta alla prossima PUSH.
// stack e chiamate di funzione
Quando il programma chiama una funzione, la CPU esegue automaticamente PUSH dell’indirizzo di ritorno (valore corrente del PC) nello stack. Al termine della funzione, l’istruzione RET esegue una POP di quell’indirizzo e lo carica nel PC — riprendendo l’esecuzione esattamente dove era stata interrotta.

Memorie di massa

Le memorie di massa conservano dati e programmi in modo permanente, anche senza alimentazione. Si dividono in dispositivi collegati direttamente al sistema e sistemi accessibili in rete.

HDD — Hard Disk Drive
Dischi magnetici rotanti — la testina di lettura/scrittura si sposta fisicamente sulle tracce del disco. Grande capacità a costi contenuti, ma tempi di accesso lenti (millisecondi) per le parti meccaniche.
Capacità: fino a 20+ TB · Velocità: ~100–200 MB/s
SSD — Solid State Drive
Celle di memoria Flash — nessuna parte meccanica mobile. Velocità molto superiori all’HDD, consumi ridotti, resistenza agli urti. Costo per GB più alto ma in costante riduzione.
NVMe PCIe: fino a 7+ GB/s · SATA: ~550 MB/s

Storage in rete — NAS e SAN

NAS
Network Attached Storage
Dispositivo singolo collegato alla rete locale — permette a più utenti di accedere ai dati contemporaneamente. Spesso dotato di RAID per ridondanza. Semplice da configurare e gestire.
Ideale per: uffici, piccoli team, home server, backup centralizzato
SAN
Storage Area Network
Rete dedicata esclusivamente allo storage — più dispositivi interconnessi via fibra ottica. Prestazioni elevate, bassa latenza, gestione centralizzata di backup e distribuzione dati tra server.
Ideale per: banche dati enterprise, cloud privati, datacenter ad alto carico

La gerarchia delle memorie

Le diverse tecnologie di memoria sono organizzate in una gerarchia piramidale: salendo verso la cima aumentano la velocità e il costo, scendendo aumentano la capacità e la latenza. La CPU accede prima ai livelli superiori, poi a quelli inferiori.

REGISTRI CPU
Pochi byte — latenza 0 cicli
Velocità massima
Costo massimo
CACHE L1 / L2 / L3
KB–MB — latenza 1–50 cicli — SRAM
Veloce
Costosa
RAM (DRAM)
GB — latenza ~100 ns — DRAM
Media velocità
Medio costo
SSD / MEMORIA FLASH
TB — latenza μs/ms
Più lento
Economico
HDD / NAS / SAN
PB — latenza ms
Velocità minima
Costo minimo
// principi di località
La gerarchia funziona grazie a due principi empirici: località temporale — ciò che viene usato ora probabilmente verrà riusato presto — e località spaziale — ciò che sta vicino in memoria a un dato usato verrà probabilmente usato a breve. L’algoritmo LRU (Least Recently Used) sfrutta questi principi per decidere quale dato rimuovere quando il livello superiore è pieno.

Controllo e correzione degli errori

Durante la memorizzazione o la trasmissione dei dati possono insorgere errori causati da interferenze elettromagnetiche, variazioni di tensione o difetti fisici. Esistono tecniche per rilevare e correggere questi errori tramite bit di controllo aggiuntivi.

Codice di Hamming
Aggiunge bit di parità calcolati su sottoinsiemi specifici dei bit del dato. Consente non solo di rilevare ma anche di correggere un errore su singolo bit — il bit errato viene identificato dalla posizione che risulta sbagliata nei controlli di parità.
Usato in: RAM ECC (Error Correcting Code) per server e workstation
CRC — Cyclic Redundancy Check
Calcola una firma digitale del blocco di dati tramite divisione polinomiale. Questa firma viene trasmessa o memorizzata insieme al dato — al momento della lettura si ricalcola la firma e si confronta: una discrepanza segnala un errore.
Usato in: Ethernet, USB, ZIP, filesystem (NTFS, ext4)

Riepilogo

  • La memoria si divide funzionalmente in primaria (accessibile dalla CPU, veloce, limitata) e secondaria (permanente, capiente, più lenta)
  • L’unità base è il byte (8 bit) — la più piccola locazione indirizzabile. I multipli sono basati su potenze di 2: 1 KB = 1024 byte
  • La DRAM usa condensatori e richiede refresh — economica, usata nella RAM principale. La SRAM usa flip-flop, è più veloce — usata nella cache
  • Le varianti DDR, SDRAM e LPDDR migliorano banda, sincronizzazione e consumo energetico rispettivamente
  • Le ROM e le sue varianti (PROM, EPROM, EEPROM, Flash) sono non volatili — dal firmware fisso alle memorie Flash degli SSD
  • Lo stack è una regione LIFO gestita dal registro SP: PUSH decrementa SP e scrive, POP legge e incrementa SP
  • La gerarchia delle memorie bilancia velocità e costo: registri → cache → RAM → SSD → HDD
  • LRU e i principi di località temporale/spaziale guidano il trasferimento tra livelli
  • Il codice di Hamming corregge errori su singolo bit; il CRC rileva errori nei blocchi di dati trasmessi o archiviati

Lascia un commento