Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
La gerarchia delle memorie
1. INTRODUZIONE
Fin dal principio dell'era dell'informatica i programmatori hanno sperato di avere a disposizione una quantità illimitata di memoria che fosse al contempo veloce.
Il principio di località sta alla base del comportamento dei programmi in un calcolatore; un programma, in un certo istante di tempo, accede soltanto a una porzione piccola del suo spazio di indirizzamento.
- Località temporale: se si accede a una determinata locazione di memoria, è molto probabile che vi si acceda di nuovo dopo poco tempo.
- Località spaziale: se si accede a una determinata locazione di memoria, è molto probabile che si acceda alle locazioni vicine a essa dopo poco tempo.
Il principio di località viene sfruttato strutturando la memoria di un calcolatore in forma gerarchica. La gerarchia delle memorie consiste in un insieme di livelli di memoria, ciascuno caratterizzato da una diversa velocità.
dimensione.Blocco: unità minima di informazione che può essere presente o assente in una cache.
Se il dato richiesto dal processore è contenuto in uno dei blocchi presenti nel livello superiore, si dice che la richiesta ha avuto successo, e si indica con hit.
Se il dato richiesto dal processore non viene trovato nel livello superiore della gerarchia, si dice che la richiesta fallisce, e si indica con miss. In questo caso, per trovare il blocco con il dato richiesto bisogna accedere al livello inferiore della gerarchia.
Il tempo di hit è il tempo di accesso al livello superiore della gerarchia, e comprende anche il tempo necessario a stabilire se il tentativo di accesso si risolve con una hit o una miss.
La penalità di miss è il tempo necessario a sostituire un blocco del livello superiore con un nuovo blocco, caricato dal livello inferiore della gerarchia, e a trasferire i dati contenuti in questo blocco al processore.
15. LA GERARCHIA DELLE MEMORIE2.
MEMORIE CACHE
Per mappare una memoria centrale di 2 parole sono necessari n bit di indirizzo.
n: bit di indirizzo in memoria centrale.
La memoria viene suddivisa in blocchi di 2 byte, perciò sono necessari k bit per identificare una parola nel blocco.
k: indice della parola nel blocco.
Per mappare una memoria cache di 2 blocchi sono necessari m bit per identificare il blocco.
m: indice del blocco in cache.
etichetta blocco parola n-m-k m k
2.1. Cache a indirizzamento diretto
È una cache in cui a ogni locazione della memoria principale corrisponde una e una sola locazione di memoria della cache.
# blocco cache = # blocco memoria MODULO # dei blocchi di cache
Più blocchi di memoria centrale possono essere caricati nello stesso blocco di memoria cache, generando dei conflitti.
Ogni posizione della cache include:
- valid bit, che indica se questa posizione contiene o meno dati validi
- campo etichetta, che contiene il valore che identifica univocamente l’indirizzo di
memoria corrispondente ai dati memorizzati- campo dati, che contiene una copia dei dati. 25. LA GERARCHIA DELLE MEMORIE
2.2. Cache associative
Nelle cache completamente associative non è presente nessuna relazione tra indirizzo di memoria centrale e posizione nella cache; posso posizionare il blocco ovunque nella cache.
Struttura all'indirizzo di memoria di n bit, con blocchi di cache di 2 byte:
- m- m bit meno significativi dell'indirizzo individuano il byte nel blocco della cache
- n-m bit più significativi sono l'etichetta.
Per ricercare un dato nella cache è necessario confrontare tutte le etichette presenti in cache con l'etichetta dell'indirizzo di memoria richiesto.
2.3. Cache set-associative
È una cache in cui i suoi blocchi sono divisi in gruppi; ogni blocco della memoria centrale corrisponde a un unico gruppo della cache, ed il blocco può essere messo in uno qualsiasi degli elementi di questo gruppo.
Si eliminano i
- conflitti dell'indirizzamento diretto.
- n-(m+k+b) m k b
- per individuare il per individuare la per individuare il bytecome etichetta gruppo (indice del parola all'interno del all'interno dellagruppo) blocco parola
- 2.4. Strategie di scrittura di un blocco
- Write through: l'informazione viene scritta sia nel blocco del livello superiore (cache) sia nel blocco di livello inferiore (memoria centrale).
- i fallimenti in lettura non si tramutano in scritture in memoria.
- Write back: l'informazione viene scritta sono nel blocco di livello superiore (cache), e il livello inferiore viene aggiornato solo quando avviene la sostituzione del blocco.
- per ogni blocco è necessario un bit che indica se il blocco è stato modificato o meno.
- non si hanno aggiornamenti ripetuti delle stesse celle di memoria (aggiorno solo una volta).
- 2.5. Prestazioni di una cache
- Tempo di CPU = (#cicli di esecuzione CPU + #cicli di stallo della memoria) x durata del ciclo
- Accessi alla
memoria
Cicli di stallo della memoria = x frequenza di miss x penalità di miss
Programma
Istruzioni Miss= x x penalità di miss
Programma Istruzioni
AMAT = tempo medio di accesso alla memoria per singola istruzione= Durata di una hit + frequenza di miss x penalità di miss
3A. DA C AD ASSEMBLER
1. PROCESSO DI TRADUZIONE
- Analisi sintattica e trattamento degli errori
Sul linguaggio sorgente di alto livello, si verifica se il programma è sintatticamente corretto e si correggono eventuali errori.
- Generazione del codice macchina
Il programma viene tradotto in linguaggio macchina informa simbolica
- Assemblaggio e collegamento
Assemblaggio: l'istruzione simbolica viene tradotta in codifica binaria.
Collegamento: vengono uniti diversi moduli eseguibili.
1.1. Istruzioni e pseudo-istruzioni
Istruzioni: sono istruzioni del linguaggio Assembly che hanno un corrispondente 1 a 1 con le istruzioni dell'ISA.
Pseudo-istruzioni: alzano il livello di astrazione per l'utente
Il tuo compito è formattare il testo fornito utilizzando tag html.
ATTENZIONE: non modificare il testo in altro modo, NON aggiungere commenti, NON utilizzare tag h1;
esono più intuitive, ma devono essere tradotte componendo piùistruzioni dell’ISA.
1.2. Sistema operativo e modello di memoria
Per il sistema operativo il processo tipico ha tre segmenti essenziali:
- codice: main e funzioni utente
- dati: variabili globali e dinamiche
- pila: area di attivazione con indirizzi, parametri, registri salvati e variabili locali.
Il codice e i dati sono segmenti dichiarati nel programma, mentre il segmento di pila vienecreato al lancio del processo.
1A. DA C AD ASSEMBLER
2. VARIABILI
Per tradurre da linguaggio sorgente a linguaggio macchina, bisogna definire un modello diarchitettura “run-time” per memoria e processo.
Le convenzioni del modello run-time comprendono:
- collocazione e ingombro delle diverse classi di variabile
- destinazione di uso dei registri.
Il linguaggio assembler ha istruzioni, memoria interna (registri) e memoria esterna (RAM)indirizzabile al byte.
Ogni variabile corrisponde a un indirizzo di memoria che contiene il
indirizzo fisso, stabilito dall'assemblatore.Le variabili globali sono allocate a partire dall'indirizzo: 0x10000000
.
Per puntare al segmento "dati statici" si utilizza il registro global pointer inizializzato $gp
, all'indirizzo 0x10008000
.
Esempio:
int a = 1; A: .word 1 # 1 valore iniziale int b; B: .word # non inizializzata int vet[10]; VET: .space 40 # 10 elementi x 4 byte
2.2. Variabile locale
Una variabile locale può essere gestita in vari modi, a seconda del tipo di variabile.
- Tipo scalare o puntatore: in un registro del blocco $t0 - $t1
, altrimenti nell'area di attivazione della funzione.
- Tipo scalare ma acceduta tramite puntatore: nell'area di
attivazione della funzione.- Tipo array / struct: nell'area di attivazione dellafunzione.
2A. DA C AD ASSEMBLER
2.3. Parametri di funzioni
I primi quattro parametri vanno passati nei registri gli eventuali parametri$a0, $a1, $a2, $a3;rimanenti vanno impilati a cura del chiamante.
Il valore in uscita della funzione (return) va restituito nel registro $v0.
3. FUNZIONI
La chiamata a funzione ha come effetto la creazione di un record di attivazione sullo stack:ad ogni chiamata/attivazione viene creato un record che verrà deallocato dallo stack al terminedel sottoprogramma.
Nel caso di sottoprogrammi annidati i record vengono impilati sullo stack e l'ultimocorrisponde al sottoprogramma correntemente in esecuzione.
Il record di attivazione è associato in modo opportuno alle seguenti informazioni: parametri,indirizzo di ritorno, informazioni per gestire lo spazio allocato, variabili locali e valore di ritorno.
Il programma chiamante deve:- mettere i valori dei parametri da
passare alla procedura nei registri$a0
- $a3
. Utilizzare l'istruzione jal
per saltare alla procedura e salvare il valore dell'indirizzo (PC+4) dell'istruzione successiva nel registro $ra
.
La funzione chiamata deve:
- allocare lo spazio di memoria necessario per memorizzare i dati e per l'esecuzione (record di attivazione)
- eseguire il compito richiesto
- memorizzare il risultato nei registri $v0
- $v1
- restituire il controllo al chiamante con l'istruzione jr $ra
.
3.1. Side effect: salvataggio dei registri
Le procedure possono avere bisogno di utilizzare dei registri per le proprie operazioni. Questi registri potrebbero contenere dei valori che il chiamante vorrebbe utilizzare successivamente e che verrebbero modificati. È quindi necessario fare in modo che:
- salvataggio: i registri che serviranno successivamente al chiamante vengono salvati
- esecuzione: la procedura viene eseguita
- ripristino: i registri salvati vengono ripristinati dallamemoria.
Chiamante Chiamato
Registri temporanei: Registri variabili locali:
$t0 - $t7 $s0 - $s7
Registri argomento: Registro frame pointer:
$a0 - $a3 $fp
Registri di ritorno: Registro return address:
$v0 - $v1 $ra
3A. DA C AD ASSEMBLER
3.2. Annidamento e ricorsione
Ogni volta che invochiamo viene riscritto con l'indirizzo dell'istruzione di ritorno: perjal, $ra
cui se le procedure sono annidate si perde il valore precedente.
Per questo è necessario salvare il valore precedente di $ra prima di ogni jal.
4. STACK (PILA)
Lo stack è una struttura dati dinamica costituita da una coda LIFO (Last-in-first-out) che permette di allocare uno spazio di memoria