# Calcolatori elettronici/Introduzione alle memorie

Calcolatori elettronici
Copertina Tutti i moduli · Sviluppo
    CopertinaCalcolatori elettronici/Copertina
* L'evoluzione dei sistemi di elaborazioneCalcolatori elettronici/L'evoluzione dei sistemi di elaborazione
* Il progetto di circuiti logiciCalcolatori elettronici/Il progetto di circuiti logici
* I processoriCalcolatori elettronici/I processori
* Architettura 8086Calcolatori elettronici/Architettura 8086
* Unità di controlloCalcolatori elettronici/Unità di controllo
* Introduzione alle memorieCalcolatori elettronici/Introduzione alle memorie
* Le memorie ad accesso casualeCalcolatori elettronici/Le memorie ad accesso casuale
* Le memorie cacheCalcolatori elettronici/Le memorie cache
* Le memorie ad accesso serialeCalcolatori elettronici/Le memorie ad accesso seriale
* La memoria virtualeCalcolatori elettronici/La memoria virtuale
* La gestione dei dispositivi input/outputCalcolatori elettronici/La gestione dei dispositivi input/output
* Intel 8255Calcolatori elettronici/Intel 8255
* Intel 8259Calcolatori elettronici/Intel 8259
* I busCalcolatori elettronici/I bus
* Le architetture a pipelineCalcolatori elettronici/Le architetture a pipeline
* Assembler 8086
          IntroduzioneCalcolatori elettronici/Introduzione
   * Informazioni generaliCalcolatori elettronici/Informazioni generali
   * Istruzioni di trasferimento datiCalcolatori elettronici/Istruzioni di trasferimento dati
   * Istruzioni aritmeticheCalcolatori elettronici/Istruzioni aritmetiche
   * Istruzioni per il controllo del flussoCalcolatori elettronici/Istruzioni per il controllo del flusso
   * Istruzioni per la manipolazione dei bitCalcolatori elettronici/Istruzioni per la manipolazione dei bit
   * Le procedureCalcolatori elettronici/Le procedure
   * Istruzioni per il controllo del processoreCalcolatori elettronici/Istruzioni per il controllo del processore
   * Formato delle istruzioni macchina, tempi di esecuzioneCalcolatori elettronici/Formato delle istruzioni macchina, tempi di esecuzione
Modifica il sommario
Accanto al processore e alle periferiche vi è un sotto-sistema di memoria. Si deve cercare un compromesso tra:
* prestazioni, ovvero il tempo di accesso a dati e istruzioni da parte del processore;
* costo.
Siccome la velocità dei processori raddoppia ogni anno e mezzo mentre quella delle memorie (in particolare i colpi di clock di attesa a ogni accesso) ogni dieci, gli accessi in memoria penalizzano sempre di più le prestazioni di processori veloci.

## Livelli di memorie

Le memorie sono caratterizzate dalla località dei riferimenti (= accessi): le applicazioni non accedono uniformemente all'intera memoria, ma statisticamente nella finestra temporale l'esecuzione delle istruzioni rimane limitata entro una certa zona della memoria (su istruzioni vicine), e analogamente la lettura/scrittura di dati interessa per un certo tempo solo alcuni dei dati. Perciò la maggior parte degli accessi in memoria non avviene in celle isolate, ma a un blocco di celle di memoria consecutive:
* località temporale: se all'istante $t$ il programma accede a una cella di memoria, è probabile che nell'istante successivo $t+D$ acceda di nuovo alla stessa cella;
* località spaziale: se all'istante $t$ il programma accede alla cella di memoria all'indirizzo $X$, è probabile che nell'istante successivo $t+D$ acceda alle celle vicine all'indirizzo $X+e$.
L'accesso allo stack è esclusivamente locale: le celle vengono possono essere accedute solo in modo consecutivo tramite le operazioni di push e pop.
Si possono quindi ottimizzare le prestazioni della memoria suddividendola in più livelli: le memorie di livello superiore, più piccole ma più veloci e costose per bit, sono destinate al blocco di dati e istruzioni su cui l'applicazione sta operando correntemente. Si deve però u­sare un meccanismo efficiente per posizionare i dati e le istruzioni nel livello corretto.
Al primo livello si trovano i registri, che costituiscono la memoria interna del processore: sono realizzati con RAM statiche e sono estremamente costosi.
All'interno della modulo RAM si distinguono una memoria cache veloce e la memoria principale vera e propria, realizzata con RAM dinamiche. Altre memorie cache sono utili all'interno del processore o montate sulla scheda madre.
La memoria secondaria è molto più capiente ma molto più lenta (es. dischi fissi). L'accesso è molto più complesso: il programma non può accedervi direttamente, ma richiede la chiamata a procedure offerte dal sistema operativo.
Memorie off-line come le chiavette richiedono anche operazioni meccaniche per l'accesso (es. inserimento nella porta USB).

## Parametri
### Costo

Più aumenta la velocità più aumenta il costo. Quando bisogna minimizzare le dimensioni fisiche (es. SoC), si somma il costo di progetto.

### Prestazioni
#### Tempo di accesso

Il tempo di accesso (o latenza) è il tempo richiesto per soddisfare la richiesta dell'utente di lettura o scrittura:
* lettura: è il tempo che intercorre tra l'istante in cui il processore fornisce l'indirizzo e l'istante in cui la memoria fornisce l'MFC, che è il segnale di controllo che avvisa che il dato è stato letto;
* scrittura: è il tempo che intercorre tra l'istante in cui il processore fornisce il dato e l'istante in cui la memoria riceve il dato.
Un'efficiente gestione dei livelli di memoria riduce i tempi di accesso: i dischi magnetici e ottici hanno infatti un elevato tempo di accesso a causa di limitazioni meccaniche.
Alla fine dell'accesso non è detto che la memoria sia già pronta per iniziare un altro ciclo, cioè per leggere/scrivere un nuovo dato.

#### Tempo di ciclo

Il tempo di ciclo è il tempo che intercorre tra un ciclo di accesso e l'altro, cioè tra l'istante in cui la memoria principale riceve la richiesta di lettura/scrittura e l'istante in cui la memoria risulta pronta per una nuova lettura/scrittura. Ad esempio, nella scrittura è necessario aspettare che la memoria, dopo aver ricevuto il dato dal processore, lo scriva internamente. Il tempo di ciclo è quindi più lungo del tempo di accesso, o al più uguale.

#### Tasso di trasferimento

L'accesso alle memorie secondarie non avviene a singoli byte ma a blocchi (dell'ordine di kilobyte), perché si devono effettuare delle operazioni meccaniche preliminari di preparazione che richiedono un primo tempo di accesso per avviare la lettura/scrittura del blocco. Pertanto si deve cercare di minimizzare il numero degli accessi sfruttando il più possibile l'accesso a blocchi → il tasso di trasferimento di una memoria secondaria è la velocità di lettura sequenziale del blocco, e si misura in bit per secondo (bps).

### Altri parametri

* consumo
* portabilità
* dimensione

## Modi di accesso

* accesso casuale: (es. RAM) ogni byte ha un indirizzo, e il tempo di accesso è lo stesso per qualsiasi byte;
* accesso sequenziale: (es. nastri) il tempo di accesso dipende da quanto l'ordine di accesso segue l'ordine in cui sono memorizzati i da­ti;
* accesso diretto: (es. disco) ogni blocco ha un indirizzo, e l'accesso è casuale per l'individuazione del blocco e sequenziale all'interno del blocco stesso;
* accesso associativo: a ogni parola è associata una chiave binaria; le memorie ad accesso associativo sono molto costose.

## Conservazione dei dati

L'alterabilità è la possibilità di modificare la memoria: le ROM non hanno alterabilità, le RAM sì.
La volatilità è l'incapacità di mantenere i dati memorizzati alla rimozione dell'alimentazione.
In una memoria con tecnologia Destructive Readout, i dati dopo che vengono letti vengono cancellati dalla memoria → vanno persi se non vengono riscritti successivamente in memoria.
Alcune memorie dinamiche hanno bisogno periodicamente di operazioni di refreshing, cioè di lettura e immediata riscrittura di tutti i dati, affinché non vadano persi.
Le memorie possono avere dei guasti, cioè delle differenze di comportamento da quello previsto; comprendono mancanze di risposta o bit scritti con valore sbagliato (per cause come le radiazioni). I guasti permanenti persistono a ogni tentativo, e non sono più riparabili; i guasti transitori capitano una volta sola. Le frequenze di guasto si dicono rispettivamente Mean Time To Failures (MTTF) e Mean Time Between Failures (MTBF).