Vediamo dal punto di vista concettuale come funzionano Le Memorie nei sistemi di elaborazione, come vengono realizzate fisicamente e come vengono classificate
architettura-sistemi-di-elaborazione.zip (170 download )
Sommario
-
Le Memorie
- Classificazione funzionale
- La capacità della memoria
- Unità di misura della capacità di memoria
- Limiti e implicazioni della memoria
- Tipologie di memoria primaria
- Organizzazione della memoria centrale
- Indirizzamento
- Struttura interna di un chip di memoria
- Accesso alla cella
- Lo Stack
- Esempio dettagliato di POP
- Considerazioni
- Memorie a semiconduttore
- La RAM
- Memorie di massa
Le Memorie
Classificazione funzionale
Dal punto di vista funzionale, si distinguono due principali tipologie di memoria:

La capacità della memoria
In informatica, tutte le informazioni – numeri, testi, immagini, audio – sono rappresentate come sequenze di bit.
-
Bit (binary digit): unità elementare dell’informazione, può assumere il valore
0
o1
.- Esempio di codifica fisica:
-
0
→ 0 Volt -
1
→ 5 Volt
-
- Esempio di codifica fisica:
- Byte: sequenza di 8 bit, unità minima indirizzabile della memoria.
- Nibble: 4 bit
- Word: può variare (16, 32, 64 bit) a seconda dell’architettura del sistema.

Unità di misura della capacità di memoria
Le unità di misura sono multipli del byte. In ambito informatico, si utilizzano potenze di 2:

⚠️ Nota: Sebbene nel linguaggio comune “kilo” indichi 1000, in informatica 1 kilobyte = 1024 byte, poiché le architetture digitali si basano su potenze di 2.
Limiti e implicazioni della memoria
Nonostante la capacità della memoria sia sempre maggiore, essa rimane limitata, e ciò ha diverse implicazioni:
- Approssimazioni numeriche: la rappresentazione in virgola mobile (standard IEEE 754) può generare errori di precisione.
- Rappresentazione dei numeri negativi: la codifica in complemento a 2 è vincolata al numero fisso di bit.
- Memoria virtuale: quando la memoria fisica non è sufficiente, il sistema operativo utilizza porzioni di memoria secondaria per simulare una memoria centrale più ampia.
Tipologie di memoria primaria
RAM (Random Access Memory)
- È volatile: perde i dati quando il sistema è spento.
- Accesso diretto: il tempo per accedere a una locazione è costante e indipendente dalla posizione.
- Utilizzata per:
- Caricare programmi in esecuzione
- Conservare variabili e dati temporanei
Da un punto di vista circuitale l’elemento più piccolo della memorie RAM è il flip flop
Schema del flip-flop D (elemento base della RAM)


Il flip-flop D è un circuito bistabile che memorizza un bit. L’uscita Q
assume il valore dell’ingresso D
al fronte del segnale di clock T
e lo mantiene fino al fronte successivo, anche se D
cambia.
ROM (Read Only Memory)
- Permanente: i dati non vengono cancellati allo spegnimento.
- Contiene firmware essenziale, come il BIOS nei PC.
- È di sola lettura (in fase di utilizzo): i dati vengono scritti una sola volta (in fabbrica o via software).
Organizzazione della memoria centrale
La memoria centrale è strutturata in celle (locazioni), ognuna delle quali ha:
- Un indirizzo univoco
- Una dimensione standard (es. 8 bit)
- È organizzata in parole (word)
Indirizzamento
- Indirizzo fisico (assoluto): posizione reale a partire da 0.
-
Indirizzo relativo (logico): posizione rispetto a un punto base (
base
) e uno spiazzamento (offset
).
Esempio: Una locazione con indirizzo assoluto 5
può essere rappresentata come (2, 3)
, cioè offset 3
dalla base 2
.

Struttura interna di un chip di memoria
Un circuito integrato di memoria (chip) include:
- Celle di memoria organizzate in matrice (righe e colonne)
- Circuiti di decodifica per la selezione delle celle
Funzionamento del decodificatore
Un decodificatore è un circuito logico con n ingressi e 2n uscite in cui, per ogni configurazione di ingresso, una sola uscita è attiva.

A ogni incrocio riga-colonna della matrice è presente un elemento di memoria (concettualmente un flip-flop) che viene selezionato.

Solo una uscita alla volta è attiva, in base alla configurazione degli ingressi.
Accesso alla cella
Per accedere a una locazione di memoria occorrono:
- L’indirizzo nel MAR (Memory Address Register)
- L’indirizzo sul bus degli indirizzi
- I segnali:
- CS (Chip Select)
- R/W (Read/Write)
Questi segnali abilitano la lettura o scrittura sulla cella selezionata.
Lo Stack
Lo stack è una sezione particolare della memoria centrale riservata alla gestione dinamica dei dati temporanei. Viene utilizzato dalla CPU principalmente per:
- memorizzare dati temporanei,
- salvare l’indirizzo di ritorno dalle subroutine,
- conservare il contenuto dei registri durante le chiamate di funzione.
Lo stack è gestito con una politica LIFO (Last In, First Out), ovvero l’ultimo dato inserito sarà il primo a essere rimosso, proprio come in una pila di oggetti: l’ultimo oggetto collocato in cima è il primo a essere rimosso.
Il registro speciale SP (Stack Pointer) contiene l’indirizzo della cima dello stack, ovvero l’ultima locazione utilizzata. È la CPU a gestire automaticamente lo stack nelle operazioni PUSH e POP.

Meccanismo di funzionamento

⚠️ Nota importante: nello stack, le locazioni di memoria vengono utilizzate a partire da un indirizzo iniziale verso indirizzi più bassi.
Esempio dettagliato di PUSH
Supponiamo che il registro SP (Stack Pointer) inizialmente contenga l’indirizzo 0x1000
. Questo indica che la cima attuale dello stack è la locazione di memoria all’indirizzo 0x1000
.
Operazione: PUSH 0xAB
Obiettivo: inserire il valore 0xAB
nello stack.
Passaggi eseguiti dalla CPU:
-
Decremento di SP
Il registro SP viene decrementato di 1 unità (assumendo uno stack byte-oriented), passando da0x1000
a0x0FFF
.
Questo perché nello stack, lo spazio viene allocato verso indirizzi più bassi. -
Scrittura in memoria
Il valore0xAB
viene memorizzato nella nuova locazione indicata da SP, cioèMemoria[0x0FFF] = 0xAB
.
Stato finale:

Esempio dettagliato di POP
Partendo dalla situazione precedente, il registro SP contiene il valore 0x0FFF
, che punta alla locazione dove si trova il dato precedentemente inserito (0xAB
).
Operazione: POP → risultato = Memoria[0x0FFF]
Obiettivo: prelevare il dato presente in cima allo stack.
Passaggi eseguiti dalla CPU:
-
Lettura dalla memoria
La CPU legge il contenuto della locazione di memoria indicata da SP, cioèMemoria[0x0FFF]
, ottenendo il valore0xAB
. -
Incremento di SP
Dopo la lettura, il registro SP viene incrementato di 1 unità, passando da0x0FFF
a0x1000
.
Questo indica che la locazione0x0FFF
è ora libera e potrà essere sovrascritta in una futura operazione PUSH.
Stato finale:

Codice ASM per le due operazioni:
PUSH
SP = 0x1000
PUSH 0xAB
↓
SP = 0x0FFF
Memoria[0x0FFF] = 0xAB
POP
SP = 0x0FFF
POP → risultato = Memoria[0x0FFF]
↓
SP = 0x1000
Considerazioni
- Lo stack è essenziale per la gestione delle chiamate a subroutine (funzioni): l’indirizzo di ritorno viene salvato nello stack, così da permettere il corretto ripristino dell’esecuzione.
- È anche usato per memorizzare i parametri delle funzioni e lo stato dei registri durante l’esecuzione di codice annidato o ricorsivo.
- Una cattiva gestione dello stack può portare a errori come lo stack overflow, ovvero il superamento del limite inferiore dello stack (indirizzo più basso).
Memorie a semiconduttore
La memoria centrale di un sistema di elaborazione è realizzata con tecnologia a semiconduttori. Le memorie a semiconduttore si distinguono in due grandi categorie:
Memorie volatili
Sono memorie che perdono il contenuto quando viene meno l’alimentazione elettrica. In questa categoria rientra la RAM (Random Access Memory), che può essere di due tipi principali:
- DRAM (Dynamic RAM): utilizza un transistor e un condensatore per ogni cella; richiede un aggiornamento periodico (refresh) per mantenere i dati.
- SRAM (Static RAM): impiega dei flip-flop per mantenere le informazioni senza bisogno di refresh. È più veloce, ma più costosa e ingombrante rispetto alla DRAM.
Memorie non volatili
Sono memorie che mantengono i dati anche in assenza di alimentazione elettrica. Queste memorie sono spesso utilizzate per contenere firmware o software di sistema, come il BIOS. Appartengono a questa categoria:
- ROM (Read Only Memory): memoria a sola lettura.
- PROM (Programmable ROM): programmabile una sola volta.
- EPROM (Erasable PROM): cancellabile tramite raggi UV e successivamente riprogrammabile.
- EEPROM (Electrically Erasable PROM): cancellabile e riprogrammabile elettricamente.
- Memoria flash: più veloce ed efficiente delle EEPROM. Utilizza celle multilivello per registrare più bit con un singolo transistor. È la tecnologia alla base di dispositivi di archiviazione come SSD, chiavette USB e memorie interne di smartphone e tablet. Quando utilizzata come sola lettura prende il nome di flash ROM.

La RAM
La RAM (Random Access Memory) è la memoria centrale volatile di un sistema. Può essere letta e scritta, ma i dati vengono persi allo spegnimento del dispositivo. Il termine “random access” si riferisce alla possibilità di accedere direttamente a qualsiasi cella di memoria in un tempo costante, indipendentemente dalla sua posizione.
Tipi di RAM
DRAM – Dynamic RAM
- Ciascuna cella è costituita da un transistor e un condensatore.
- Richiede un refresh continuo per mantenere i dati.
- Le versioni moderne includono:
- DDR (Double Data Rate): sfrutta due canali per raddoppiare la velocità di trasferimento.
- SDRAM (Synchronous DRAM): sincronizzata con il clock esterno del sistema.
- LPDDR (Low Power DDR): progettata per dispositivi mobili e IoT, ottimizzata per basso consumo energetico.
SRAM – Static RAM
- Utilizza flip-flop, non necessita di refresh.
- Maggiore velocità rispetto alla DRAM, ma anche costo e ingombro superiori.
- Utilizzata principalmente nelle memorie cache.
Memorie di massa
Le memorie di massa sono dispositivi di archiviazione permanente, utilizzati per salvare dati e programmi anche in assenza di alimentazione. Hanno una capacità molto elevata e possono essere:
- Collegate direttamente al sistema (es. HDD, SSD)
- Raggiungibili tramite rete (storage di rete)

Tipologie di storage in rete
- NAS (Network Attached Storage): dispositivo singolo, con sistemi di ridondanza, accesso limitato e velocità contenute.
- SAN (Storage Area Network): sistema complesso ad alte prestazioni, composto da molteplici dispositivi collegati in fibra ottica, pensato per numerosi utenti.
Gerarchia delle memorie
Le memorie sono organizzate in una gerarchia secondo la velocità di accesso e la capacità. I livelli più alti sono più veloci ma meno capienti, mentre quelli inferiori sono più lenti ma più economici e spaziosi.

Ordine di accesso della CPU:
- Cache: accesso immediato; se il dato è presente (hit), viene inviato alla CPU.
- Memoria centrale (RAM): se il dato è presente, viene copiato nella cache.
- Memoria di massa: solo se non disponibile nei livelli superiori; il dato viene caricato nella RAM.
Lo scopo della gerarchia è ridurre al minimo gli accessi ai livelli inferiori, migliorando le prestazioni.
Principi di località
Quando la CPU cerca un’informazione, essa viene reperita secondo i principi di località, che definiscono quali dati conviene trasferire nei livelli superiori:
- Località temporale: se un dato è usato ora, è probabile che venga riutilizzato a breve.
- Località spaziale: se un dato è usato ora, è probabile che vengano usati anche i dati vicini in memoria.
Terminologia:
- Un accesso riuscito si chiama hit.
- Un accesso fallito si chiama miss.
- Dalla RAM alla cache si trasferiscono blocchi.
- Dal disco alla RAM si trasferiscono pagine.
Algoritmo LRU (Least Recently Used)
Quando si deve liberare spazio in un livello di memoria superiore, si può applicare l’algoritmo LRU, che elimina l’informazione meno recentemente utilizzata. Tale algoritmo è anche utilizzato dal sistema operativo per la gestione della memoria virtuale, allo scopo di simulare una RAM più capiente.
Controllo degli errori in memoria
Durante la trasmissione o memorizzazione dei dati, possono verificarsi errori. Esistono tecniche che, mediante bit di controllo aggiuntivi, permettono di:
- Rilevare errori: i codici che individuano solo la presenza di errori sono detti codici rilevatori.
- Correggere errori: i codici in grado anche di correggere l’errore sono detti codici rilevatori e correttori.
Esempi di tecniche di controllo
- CRC (Cyclic Redundancy Check): utilizza un algoritmo matematico per calcolare un codice di controllo, come una “firma digitale” del dato.
- Codice di Hamming: consente la correzione di errori su un singolo bit grazie all’aggiunta di bit di parità. Il numero di bit aggiuntivi cresce in funzione del numero di bit da proteggere (es. per 4 bit, occorrono 3 bit aggiuntivi).
Lascia un commento