Che materia stai cercando?

Anteprima

ESTRATTO DOCUMENTO

memoria e contiene i dati da leggere/scrivere. La seconda è data da registri a 12

bit che contengono gli indirizzi delle celle di memoria da cui bisogna

leggere/scrivere

Dettagli di Lettura/Scrittura RAM

La RAM viene utilizzata principalmente per poter leggere e scrivere il contenuto

di una locazione specifica dell’indirizzo MAR dal/nel MBR ed è formata da un

registro MAR collegato a un decodificatore le cui linee di uscita attivano sequenze

di Flip-Flop. Quando il CLOCK e la READ sono uno, l’OR delle uscite dei Flip Flop i-

esimi dei registri RAM, prese in AND con le corrispondenti linee di uscita dal

decodificatore viene calcolato in ingresso al Flip-Flop i-esimo del MBR. Poiché solo

una

coppia di linee (di uscita) dal decodificatore è ad uno, il bit i-esimo della parola di

memoria selezionata dall’indirizzo in MAR viene scritto nella cella i-esima del

MBR (per ogni i). Quando il CLOCK e la WRITE sono uno, il bit i-esimo del MBR

viene passato in ingresso al Flip-Flop set-reset i del registro RAM selezionato (in

forma s=1, r=0 se Yi ed s=0, r=1 altrimenti) attraverso collegamenti AND attivati

dall’unica linea superiore ad uno dal decodificatore.

ALU

L'Arithmetical-Logic Unit è un processore digitale preposto all'esecuzione di

operazioni aritmetiche o logiche su numeri interi. Per le operazioni in virgola

mobile, essendo più complesse, esiste un'unità dedicata chiamata Floating Point

Unit (FPU). Infatti la rappresentazione in virgola mobile è molto più complessa

della rappresentazione a complemento a due utilizzata tipicamente dalle ALU,

proprio per questo le FPU tendono ad essere molto più articolati delle ALU

includendo circuiti molto più complessi. 20

Aritmetica Binaria

L'aritmetica binaria utilizza le stesse regole dell'aritmetica decimale, con l'unica

accortezza di ricordare che la base di numerazione è 2.

Somma

Consideriamo il numero 1310 = (1101)2 e il numero 710 = (0111)2; sommandoli

otteniamo:

1101+

0111=

________

10100

in quanto 1+1 = 102, ovvero 0 con riporto di 1, 1+1+1 = 112, ovvero 1 con

riporto di 1, e così via.

Sottrazione

Consideriamo gli stessi valori presi ad esempio per l'addizione:

1101- 13-

0111= 7=

_______ ______

0110 6

Vale lo stesso principio della somma, con l'ovvia differenza che stavolta si tratta

di sottrarre i valori. Quindi otteniamo, ad esempio, che 102 -1 = 1, ovvero che

come nell'aritmetica a base 10 si possa dover ricorrere alla cifra

immediatamente più a sinistra per completare l'operazione. C’è un caso

particolare al quale bisogna fare attenzione, ovvero quando il numero delle cifre

non permette di rappresentare il risultato: in questo caso si verifica il fenomeno

dell’overflow nella propagazione del riporto. Infatti se si considerano due numeri

interi senza segno rappresentati su n bit, si verifica la condizione di overflow ogni

n

volta che il risultato supera 2 -1. Il Calcolatore non è in grado di prevenire un

errore di Overflow, in quanto può venire individuato solo dopo aver effettuato

l’operazione. 21

Supponiamo di voler effettuare la somma 71+60=131 in complemento a 2 su

8bit (=[-128,+127]). Il risultato della somma non è contenuto nel range di valori

ottenibili, quindi verrà generato un errore di Overflow. La condizione di overflow

si ha quando il risultato di un calcolo intero è un numero che in binario occupa

più bit di quelli a disposizione, di conseguenza ne viene troncata la parte più

significativa generando un risultato errato.

Moltiplicazione

La moltiplicazione avviene come quella in decimale, ma sommando i risultati in

forma binaria.

1101*

0111=

________

1101+

11010+

110100+

0000000=

_________

1011011

Divisione

Ancora una volta, la tecnica è identica alla divisione in base 10 e può essere

eseguita contando quante volte un numero può essere sottratto da un altro. Il

risultato è detto quoziente. In realtà questa operazione viene eseguita nei

calcolatori elettronici per sottrazioni ripetute utilizzando il metodo del

complemento a 2.

Celle Addizionatrici

Una cella addizionatrice è un modulo combinatorio con tre ingressi e due uscite

che opera sui bit omologhi di due parole binarie di n bit e su un bit di riporto,

producendo in uscita un bit di somma e uno di riporto. Quindi ogni coppia di

parole viene analizzata bit per bit sommando di volta in volta i bit in posizione i-

22

esima e tenendo conto del riporto dell'operazione precedente.

Le celle addizionatrici sono componenti base per costruire un circuito che realizzi

la somma di due parole binarie che codifichino interi in complemento a 2.

Semplificazione di forme SOP per una cella addizionatrice 23

Espressioni semplificate della cella addizionatrice:

• in serie: si possono ottenere moduli addizionatori sulle parole con

propagazione seriale dei riporti;

• in parallelo: ove vi è un modulo che calcola direttamente i riporti ci, dati

il riporto iniziale c0 ed i bit ai e bi delle parole a e b da somma. Una cella

addizionatrice è alla base della progettazione ALU, facilmente

interagibile con altre operazioni, controllabili attraverso collegamenti di

multiplazione.

Operazioni effettuate dai circuiti ALU

Moltiplicazione: Il circuito moltiplicatore consiste di un registro prodotto

inizializzato nei suoi LSB (Least Significant Bit, bit con peso minore) con il

moltiplicatore, un registro complicando ed un sommatore, comandati dall'unità di

24

controllo.

Divisione: viene eseguita testando se il divisore è contenuto 0/1 volte nei resti

parziali via via che si procede nell'operazione. Il test di contenimento può essere

effettuato sottraendo dal resto parziale il divisore: se il risultato è uno allora il bit

di quoziente è uno, altrimenti zero. Il circuito divisore consiste di un registro

resto/quoziente inizializzato con il dividendo, un registro divisore ed un

sommatore comandati dall'unità di controllo.

INTRODUZIONE ARCHITETTURA DI VON NEUMANN

L'architettura di Von Neumann è formata da 4 elementi base: CPU, Memoria, Bus

di sistema e periferiche di I/O. In questa architettura i bus di sistema hanno il

compito di fornire la capacità di comunicare a tutti gli altri elementi, le

periferiche, come abbiamo già visto, permettono l'interazione con l'utente, la

memoria RAM (Random Access Memory) ospita i dati che devono, stanno

venendo e saranno elaborati e la CPU si occupa dell'elaborazione.

La CPU (Central Processing Unit) si compone di 5 elementi fondamentali:

1. C.U. (Unità diControllo)

2. A.L.U. (UnitàAritmetico-Logica)

3. Registri diMemoria 25

4. F.P.U. (Floating PointUnit)

5. P.C. (ProgramCounter)

L'Unità di Controllo legge le istruzioni del programma in esecuzione dai registri di

memoria, determinandone quale sarà la prossima azione da eseguire e inviando

di conseguenza segnali all'A.L.U. o ai BUS affinché vengano eseguite le

operazioni richieste. Terminate queste operazioni, i dati elaborati vengono scritti

nuovamente nei registri. Gli unici dati su cui la CPU può lavorare sono quelli

contenuti nei registri, che sono proprio per questo la tipologia di memoria più

veloce nel calcolatore, per quanto di dimensioni ridotte, se paragonata alla

memoria RAM o a un dispositivo di archiviazione. La F.P.U. è l'unità dicalcolo per i

valori in virgola mobile e il P.C. contiene l'indirizzo di

memoria della prossima istruzione da eseguire. Il clock di sistema è un orologio

che è in grado di inviare segnali elettrici scandendo la frequenza di lavoro del

sistema. È necessario anche per la corretta sincronizzazione di tutti gli elementi

del sistema stesso.

La memoria si differenzia in due categorie fondamentali: la Memoria ad Accesso

Casuale e la Memoria ad Accesso Sequenziale. La prima categoria include

HardDisk, RAM, CD, DVD, Pen-drivee così via, e si basa sul principio della

disposizione dei dati in maniera casuale nello spazio fisico, di modo da poter

accedere ai dati alla stessa velocità indipendentemente dalla loro collocazione.

Ovviamente il dispositivo tiene traccia in un'apposita struttura dati degli indirizzi

dimemoria dei dati su cui lavora; in questo modo, nota la posizione dei dati,

diventa facile accedervi. La memoria ad accesso sequenziale comprende nastri

magnetici e bobine e dè tanto più veloce tanto più i dati sono scritti vicino al

punto di lettura, ma diventa lenta manmano che ci si allontana da esso.

Una seconda divisione che si può fare per lememorie è in base all'utilizzo che se

ne fa o in base alle caratteristiche fisiche: abbiamo infatti la Memoria Centrale

(RAM e ROM) e la Memoria di Massa (Hard Disk, Floppy, Pen-Drive, CD, DVD)

oppure la divisione in memorie magnetiche (ovvero dispositivi che polarizzano il

materiale ferro-magnetico di cui è composto il supporto, come un hard disk, per

conservare le informazioni) e le memorie ottiche (che vengono lette e scritte

tramite l'utilizzo di un laser).

La Memoria ROM (Read-OnlyMemory) è una memoria in sola lettura contenente il

BIOS (Basic Input Output System) del calcolatore, ovvero il software che cerca il

Sistema Operativo nella memoria di massa del calcolatore e lo carica in RAM,

rendendo così possibile l'avvio del sistema operativo stesso.

La Memoria RAM è una tipologia di memoria volatile ad accesso casuale. I dati

quindi vengono conservati solo fintanto che permane una tensione elettrica

attraverso i moduli di memoria. 26

Le memorie Cache sono dispositivi di memorizzazione ultra-veloci. Hanno

capacità limitate di immagazzinare dati e sono usate nelle fasi relative

all'elaborazione-esecuzione di un dato o gruppo di dati. Sono memorie

temporanee che accolgono i dati prima di essere elaborati velocizzando così il

processo.

Il Registro di indirizzo (MAR) a 12 bit contiene l’indirizzo che indica la locazione di

memoria da leggere o scrivere, mentre il registro buffer di memoria (MBR) di 21

bit contiene i dati, le istruzioni o gli indirizzi da leggere o scrivere in memoria.

I vari moduli funzionali (CPU, RAM, unità di I/O) sono collegati attraverso speciali

linee di comunicazione, i BUS. Un Bus consiste di diverse linee di ingresso e

uscita che possono essere attivate o disattivate dai segnali di controllo inviati

dalla CU, permettendo così la trasmissione dei dati. I Bus possono essere di 3

tipi: di interruzione i-Bus (trasmette un segnare OR dei flags, se il valore è 1

esiste un'unità che richiede un trasferimento dati alla CPU), di stat of-Bus

(segnala lo stato di unità alla CPU quando il selettore riconosce che è stata

selezionata da una richiesta) e di comando c-Bus (trasmette al decodificatore di

comandi i segnali di CU generati in funzione del codice operativo diiscrizione).

Le periferiche I/O sono connesse ai bus tramite apposite interfacce e possono

essere:

• Periferiche di Input: permettono di inserire dati nel calcolatore (mouse,

tastiera).

• Periferiche di Output: permettono di visualizzare i dati in uscita dal

calcolatore (monitor, stampante).

• Periferiche di Input/Output: permettono sia di inserire sia di ricevere dati

(monitor touch screen, stampante multifunzione).

Le componenti di un’unità I/O sono:

• il selettore di unità, che abilita l'esecuzione dell'operazione quando

riconosce che l'istruzione lo richiede; il riconoscimento avviene tramite

un indirizzo specificato nei bit meno significativi dell'istruzione che

richiede ilservizio;

• il decodificatore di comandi, che interpreta l'operazione richiesta dalla

CPU, ovvero riceve i segnali di controllo generati dalla CU;

• il Data Buffer, che è un registro utilizzato dal dispositivo I/O per leggere

e/o scrivere dati; 27

• il flag di unità, che segnala alla CPU quando l'unità I/O è abilitata ad

effettuare un trasferimento dati tra RAM e Data Buffer.

Cenni di Multiprogrammazione

In un sistema di calcolo che supporta la multiprogrammazione l'insieme dei

processi muta in funzione dell'esecuzione del “ciclo di vita” di ogni singolo

processo. Ogni “fase” di questo ciclo di vita è uno stato del processo.

Un processo può vertere in uno di questi stati base:

• NEW – il processo viene creato o inizializzato

• READY - il processo è pronto per essere eseguito

• RUNNING – il processo è in esecuzione

• WAITING – il processo è sospeso in attesa di un altro evento

• HALTED – il processo termina la sua esecuzione

Alla creazione del processo, questi è nello stato NEW. Quando viene dichiarato

pronto per l'esecuzione, il processo passa da NEW a READY. Attraverso i moduli

del sistema operativo, lo scheduler e il dispatcher, passa così allo stato di

RUNNING e se nel tempo che gli viene concesso riesce ad eseguire tutte le sue

istruzioni passa allo stato HALTED, altrimenti se esaurisce il tempo o necessita,

ad esempio, di un input, passa allo stato WAITING. Quando il processo è pronto

per riprendere la sua esecuzione torna nello stato READY, dove può poi ritornare

al RUNNING, riprendendo dal punto di interruzione e continuando così questo

ciclo fino al naturale termine dell'esecuzione (HALTED), dove la memoria

occupata dal processo viene liberata.

Il sistema è realizzato col fine di eseguire programmi, ovvero sequenze finite di

istruzioni volte alla risoluzione di un problema

Classificazione delle istruzioni SEC-XR

Nell'architettura SEC-XR le istruzioni hanno un formato standard: i primi bit

formano il codice operativo volto ad identificare l'istruzione, seguiti dal registro

dell'indice dei dati e dall'indirizzo in memoria in cui si andrà a lavorare.

Abbiamo 4 tipi di istruzioni:

• aritmetico-logiche: realizzano operazioni di calcolo sui dati contenuti in

RAM e registry di CPU

• accesso alla memoria: consentono di trasferire dati tra registri di CPU e

RAM 28

• controllo di flusso: permettono di rendere non lineare l'esecuzione delle

istruzioni di un programma

• input/output: consentono di assumere dati in ingresso e produrre dati in

uscita

Vediamole ora più dettagliatamente:

Aritmetico/logiche:

• ENT,0,Y - carica il dato all'indirizzo Y nell'accumulatore (A←0Y);

• ADD,0,Y – somma il contenuto dell'indirizzo di memoria Y con

l'accumulatore, salvando il risultato nell'accumulatore (A←A+M(Y));

• SUB,0,Y – come ADD, ma viene fatta un'operazioni di sottrazione

sull'accumulatore (A←A- M(Y));

• MULT,0,Y – moltiplica il contenuto dell'accumulatore con il valore di

indirizzo Y (A ← A*M(Y));

• DIV,0,Y – divide il contenuto dell'accumulatore con il valore di indirizzo Y

(A←A/M(Y));

• ALS,0,Y – shift di una posizione a sinistra del

valore contenuto nell'accumulatore (A ← A*2);

• ARS,0,Y - shift di una posizione a destra del valore contenuto

nell'accumulatore (A←[A/2]);

• NEG,-,- - cambia il segno del dato contenuto nell'accumulatore (A ← -A).

Accesso alla Memoria

• LDA,0,Y – carica il contenuto della posizione di indirizzo Y

nell'accumulatore (A←M(Y));

• STA,0,Y – carica il contenuto dell'accumulatore in RAM all'indirizzo Y(M(Y)

←A).

Controllo di Flusso

• JUMP,0,Y – esegue l'istruzione del programma corrente all'indirizzo Y

(salto condizionato: PC

• ← Y);

• JZA,0,Y–comeJUMP,ma solo se l'accumulatore contiene “0” (salto

condizionato: IFA=0PC ← Y);

• JPA,0,Y – come JUMP, ma solo se l'accumulatore contiene un valore

maggiore di 0 (salto condizionato: IF A>0 PC ←-1);

• JNA,0,Y – come JUMP, ma solo se l'accumulatore contiene un valore

29

minore di 0 (salto condizionato: IF A<0 PC ←-1);

• HLT,0,0 – arresto dell'elaborazione (PC ←-1).

• Set di Istruzioni RAM

• LOAD – carica dalla memoria in accumulatore (R0) STORE – salva il

contenuto di R0 in memoria

• ADD, SUB, MULT, DIV – operazioni di somma, sottrazione, moltiplicazione

e divisione

• READ – legge un dato in input WRITE – scrive un dato in output

JUMP – salto non condizionato

• JGTZ – salto se l'accumulatore contiene un valore maggiore di “0”

JZERO – salto se l'accumulatore contiene il valore“0”

• HALT – termine del programma

Microsequenze

L’esecuzione di istruzioni di programma comporta una sequenza di trasferimenti

di informazioni tra gli elementi di memoria. Le specifiche delle attività

identificabili, a livello hardware, che realizzano tali trasferimenti/elaborazioni di

informazioni sono dette microsequenze.

L'esecuzione si realizza in due fasi: fetch e execute. Nella fase FETCH l'istruzione

indicata dal Program Counter viene importata dalla ram e in quella EXECUTE

viene eseguita. Mentre la prima è identica per ogni tipo di istruzione, la seconda

varia in funzione dell'istruzione stessa.

La fase FETCH si sviluppa a sua volta in due momenti: nel primo l'indirizzo

contenuto nel P.C. viene posto nel bus indirizzi permettendo alla CPU di

identificare la cella di memoria contenente

l'istruzione da eseguire; nel secondo i dati vengono inseriti nel bus e trasferiti nel

Registro Istruzioni della CPU (I.R.). Il decodificatore di istruzioni provvede alla

decodifica permettendo alla logica di controllo di generare i segnali necessari per

eseguire effettivamente l'istruzione. Durante questa fase il contenuto del P.C.

viene aggiornato per passare all’istruzione successiva. Questa pratica viene

chiamata Address Modification e consente alle istruzioni (con codice operativo

LDA, STA, ADD, SUB, MUL e DIV) di indicizzare gli indirizzi di memoria attraverso i

contenuti dei registri R0-R7 (per default il contenuto di R0 è sempre 0). 30

Architettura MIPS

Un’architettura di tipo differente, che più si adatta a descrivere i modelli di

architetture attuali, è un’architettura di tipo MIPS. L’architettura MIPS

(Microprocessor without Interlocked Pipeline Stages) viene progettata nei prim

ianni ’80 e prodotta da MIPS Technologies negli anni’90. Mentre l’architettura di

Von Neumann era formata da 8 registri di CPU, l’architettura MIPS ha 32 registri

di CPU da 32 bit e come per l’architettura vista in precedenza il registro zero

contiene sempre 0. Per denotare i registri si usano nomi simbolici preceduti da $.

Alcuni registri sono riservati:

I registri della RAM dell’architettura MIPS sono formati da 32 bit per l’indirizzo del

registro e 32 bit (4 byte contigui) per i dati. Inoltre supporta la codifica in virgola

mobile con singola e doppia precisione (rispettivamente 32 bit e 64 bit). Ulteriore

differenza con l’architettura semplificata è che supporta molte più istruzioni,

divise in tre formati.

Istruzioni in formato R 31

Formato per le operazioni algebriche R:

• add $1, $2, $3 – somma il contenuto dei registri 2 e 3 e salva il risultato

nel registro 1;

• sub $1, $2, $3 – sottrae il contenuto del registro 3 dal contenuto del

registro 2 e salva il risultato nel registro 1;

• slt $1, $2, $3 – predispone un salto condizionato settando il registro 1 se

il contenuto del registro 2 è minore del contenuto del registro 3,

altrimenti effettua il reset del registro 1.

Istruzioni in formato I

• Formato per le istruzioni di salto condizionato e di trasferimento dati

dalla RAM e dai registri CPU. I dati a 32 bit sono divisi in 4 campi:

• lw $1, 100($2) – (load word) salva il contenuto della locazione di

memoria di indirizzo 100+

• $2 nel registro 1;

• sw $1, 100($2) – (store word) salva il contenuto del registro 1 nella

locazione di memoria di indirizzo 100 +$2;

• beq $1, $2, L – salta all’istruzione con etichetta L se I contenti dei

registry 1 e 2 sono uguali;

• bne $1 , $2, L – salta all’istruzione con etichetta L se I contenuti dei

registry 1 e 2 sono distinti.

Istruzioni in formato J

Formato per le istruzioni di salto non condizionato. I dati a 32 bit sono divisi in 2

soli campi:

-- OP;

-- ADDRESS.

Esempi di Istruzioni 32

Formato R

add $1,$2,$3

Salva nel registro 1 la somma dei contenuti dei registri 2 e 3.

mul $1,$2,$3

Salva nel registro 1 il prodotto dei contenuti dei registri 2 e 3.

Formato I

beq $1,$2,L1

Va all'istruzione con etichetta L1 se i contenuti dei registri 2 e 3 sono uguali.

bne $1,$2,L1

Va all'istruzione con etichetta L1 se i contenuti dei registri 2 e 3 sono diversi.

Formato J

j L

Salta all'istruzione con etichetta L.

Allocazione di Memoria

La memoria di un programma MIPS viene suddivisa in segmenti, ognuno dei quali

viene utilizzato per un particolare scopo. Quelli principali sono:

I. segmento testa: è collocato nella zona inferiore, contiene I codici dei

programmi

II. segmento dati: contiene i dati globali dei programmi ed è suddiviso in dati

statici, contenenti strutture dati e dati dinamici, allocati durante l'esecuzione

III. segmento stack: è collocato nella zona superiore e contiene i dati locali

delle funzioni 33

Le dimensioni delle aree di memoria riservate ai dati dinamici posso arrivare a

occupare tutto lo spazio libero, motivo per cui è difficile dimensionarle a priori.

Convenzioni di Utilizzo dei Registri

Le convenzioni sull'utilizzo dei registri sono seguite (e definite) dai

programmatori di comune accordo, con lo scopo di standardizzare nomi e

funzioni attribuiti a determinati registri:

• I registri $at($1), $k0($26) e $k1($27) sono riservati all’ assemblatore

ed al sistema operativo e non andrebbero mai usati dai programmi

• I registri $a0-$a3($4-$7) sono usati per passare fino a quattro argomenti

ad un sottoprogramma

• I registri $v0 e $v1 ($2 e $3) sono usati per restituire argomenti al

programma chiamante

• I registri $t0-$t9 ($8-$15 ed $24-$25) sono di salvataggio temporaneo

• I registri$s0-$s7 ($16e$23) sono di salvataggio permanente e servono

per memorizzare dati la cui vita non èlimitata

• Il registro $gp ($28) è un puntatore globale che fa riferimento ad un

blocco di memoria da 64 K

• Il registro $sp ($29) è il puntatore allo stack e fa riferimento alla prima

cella libera

• Il registro $fp ($30) è il puntatore all’ area di attivazione di procedura

• Il registro $ra ($31) viene aggiornato in modo da contenere l’indirizzo di

rientro

I/O MIPS

Il programma MIPS accede a due unità di ingresso uscita, un’unità di ricezione

che legge i caratteri introdotti da tastiera ed una di trasmissione che scrive

caratteri sullo schermo. Le operazioni di ingresso/uscita sono gestite dal sistema

operativo i cui contenuti sono allocati in memoria principale. Attraverso l’utilizzo

di un programma si possono leggere i caratteri inseriti dall’utente e visualizzare

eventuali uscite sulla finestra di console. Si usano chiamate di sistema (syscall)

34

per scrivere su o leggere da console. Il programma deve caricare il codice della

chiamata di sistema nel registro $v0 e gli argomenti nei registri $a0-$a3. Le

chiamate di sistema che forniscono un valore in uscita mettono il risultato in $v0,

e se si usano le chiamate di sistema occorre disabilitare l’opzione mapped I/O.

Esempio di traduzione Assembler MIPS

Procedura in C:

int power (int base,

int n) { int i, p;

i = 0; p = 1;

while (i < n) {

p = p *

base; i = i

+ 1;

}

}

Procedura in Assembler

Assumiamo: $a0 = base; $a1 = n; $t0 = i;

$t1 = flag; $s0 = p 35

Salvataggio registri:

sub $sp, $sp, 12

sw $s0, 0($sp)

sw $t1, 4($sp)

sw $t0, 8($sp)

add $t0, $0, $0

addi $s0, $0, 1

Corpo del programma:

LOOP:

slt $t1, $t0, $a1 # i >= n esco dal ciclo

beq $t1, $0, EXIT

mul $s0, $s0, $a0

# p = p * base;

addi $t0, $t0, 1 # i = i + 1;

j LOOP

EXIT:

add $v0, $s0, $0 # p nel registro di ritorno

lw $s0, 0($sp)

# ripristino dei registri l w $t1, 4($sp) lw

$t0, 8($sp) add

$sp, $sp, 12 jr,

$ra 36

Planimetria MIPS

La planimetria MIPS consiste di PC, memoria istruzioni, ALU, CU (separata

dall'ALU), banco registri e memoria dati.

L’istruzione [31-26] è l’input della CU e rappresenta il campo a 6 bit che contiene

il codice operativo.

L’istruzione [25-21] rappresenta il registro sorgente RS per le istruzioni in

formato R e per le istruzioni beq (branch on equal) e sw (store word) e

rappresenta il registro di base per le istruzioni lw (load word) e sw.

L’istruzione [20-16] rappresenta il registro sorgente RT per le istruzioni in formato

R e per le istruzioni beq e sw e, inoltre, rappresenta il registro destinazione

dell’istruzione lw.

L’istruzione [15-11] rappresenta il registro destinazione RD per le istruzioni in

formato R.

L’istruzione [15-0] rappresenta l’offset per le istruzioni beq, lw e sw. L’offset è

detto anche spaziamento ed è dato dalla costante nell’istruzione di trasferimento

moltiplicata per quattro (ciò perché nell’architettura MIPS vige il vincolo di

allineamento: le parole devono iniziare con indirizzi multipli di quattro). Per

ottenere l’indirizzo al byte, l’offset va sommato al registro di base.

Gli output della CU sono divisi in segnali per controllare i multiplexer (RegDst,

MemtoReg, ALUSrc), segnali che controllano la scrittura e la lettura (MemRead,

37

MemWrite, RegWrite), il segnale di controllo per i salti condizionati (Branch) ed il

segnale di controllo per l’ALU (ALUop, che indica se l’operazione da eseguire è

una somma, una sottrazione oppure se deve essere determinata dal contenuto

del campo funzione).

Il segnale di controllo PCSRC è l’input di un multiplexer, che determina da dove

prendere il successivo valore del PC, ed è l’output di una porta AND utilizzata per

combinare il segnale di salto condizionato e l’uscita zero dell’ALU, che dipende

dall’esecuzione dell’operazione dell’ALU.

Le fasi di esecuzione di una singola istruzione passano da due (fetch e execute) a

cinque:

I. Prelievo dell'istruzione: corrisponde alla fase di fetch. Poiché i dati in

RAM sono divisi in byte, il PC viene incrementato di 4 da un

addizionatore;

II. Decodifica dell'istruzione, lettura dei registri sorgente e calcolo

dell'indirizzo di salto;

III. Calcolo del risultato;

IV. Scrittura del risultato nel registro destinazione ed accesso alla memoria;

V. Scrittura del risultato in memoria.

Per eseguire un'istruzione bisogna attendere che termini l'esecuzione

dell'istruzione precedente, quindi il tempo di esecuzione sarà dato dalle “n”

istruzioni moltiplicate per le “m” fasi necessarie per ogni istruzione.

Ovviamente questo comporta un’esecuzione potenzialmente molto lenta, motivo

per cui è stata concepita l'architettura MIPS con pipelining.

MIPS con Pipelining 38

L'architettura MIPS con pipelining è strutturata come una catena di montaggio:

nel caso in cui le istruzioni siano indipendenti tra loro, è possibile iniziare

l'esecuzione di un'istruzione senza attendere la terminazione di quella

precedente. Nel caso ci fossero istruzioni dipendenti potrebbero verificarsi

situazioni incoerenti con la logica di programmazione, chiamate “alee”. È

compito del programmatore risolvere le alle organizzando le istruzioni in maniera

tale da evitare che si generi conflitto, anche ritardando artificialmente

l'esecuzione di alcune istruzioni.

Le principali tecniche di risoluzione delle alee sono lo stallo e il bypassing: il

primo prevede di ritardare il caricamento delle istruzioni tramite istruzioni

speciali chiamate NO_OP, che rendono temporaneamente inattive le unità,

mentre il secondo prevede l'utilizzo di apposito hardware per correggere

eventuali situazioni incoerenti.

Il tempo impiegato per eseguire n istruzioni con m fasi nell'architettura con

pipelining è di n+m-1 cicli di clock, quindi consente un risparmio notevole di

tempo rispetto all'architettura senza pipelining (che ricordiamo essere n*m).

Prestazioni di un'Architettura

È possibile valutare le prestazioni di un'architettura da due punti di vista: per un

utente corrispondono a prestazioni maggiori tempi di risposta più bassi, ovvero la

richiesta del minor tempo possibile per l'esecuzione di un compito, mentre per un

centro di calcolo le prestazioni migliori sono rappresentate dal maggior numero

di compiti svolti in un'unità di tempo. Ovviamente questi due aspetti possono

influenzarsi vicendevolmente. Possiamo considerare le prestazioni di un

39

calcolatore x in base al tempo di esecuzione con la formula

prestazioni(x)=1/tempo di esecuzione(x);

quindi, se considerassimo un secondo calcolatore y, potremmo calcolare quale

sia migliore con la relazione

prestazioni(x)/prestazioni(y)=tempo di esecuzione(y)/tempo di

esecuzione(x);

nel caso di un tempo di esecuzione (x) minore del tempo di esecuzione (y)

avremmo la dimostrazione che il calcolatore con prestazioni migliori è x, e

viceversa.

Il discorso appena fatto vale se il calcolatore NON lavora su più programmi

contemporaneamentee quindi se possiamo intendere il tempo di esecuzione

come assoluto. Se il calcolatore invece esegue più programmi

contemporaneamente possiamo sapere quanto tempo impiega per eseguire un

singolo programma tramite il tempo di CPU, che ci è dato dai cicli di clock * il

tempo di clock. Il tempo di clock a sua volta è dato dalla relazione 1/frequenza

di clock. Queste informazioni sono rese note dal produttore della CPU e sono

riportate nel manuale dell'architettura. Un metodo diffuso per aumentare le

prestazioni è la pratica dell'overclocking: come il nome stesso suggerisce,

consiste nell'aumentare la frequenza di clock al fine di far diminuire il tempo di

clock, aumentando così le operazioni eseguite; lo svantaggio primario di questa

pratica è che induce una maggiore produzione di calore e un maggior dispendio

di energia, rischiando così di danneggiare le componenti stesse.

La precedente definizione non tiene conto del numero di istruzioni eseguite,

quindi è possibile scrivere un'altra relazione che ne tenga conto.

Possiamo calcolare le istruzioni eseguite come

Cicli di clock = numero di istruzioni * Cicli per Istruzione

Il valore dei Cicli per Istruzione (che chiameremo CPI) varia in base

all'architettura del calcolatore e può venire ricavata tramite appositi strumenti

sia software che hardware, ottenendo così un valore medio. Da questo evinciamo

quindiche

Tempo di CPU = numero di istruzioni * CPI * Tempo di Clock

Ma questa definizione non è del tutto esatta, in quanto non tiene conto del fatto

che classi di istruzioni diverse possono avere tempi di clock diversi. A questo

40

punto la nostra relazione diventa

Cicli di Clock = Σin=1(CPIi*num.Ii)

dove CPIi indica i cicli di clock appartenenti alla i-esima classe, e num.Ii indica il

numero di istruzioni della classe i-esima.

Per testare adeguatamente le prestazioni di un'architettura si cerca di riprodurre

situazioni di carico (workload), utilizzare metriche miste in base alla tipologia di

istruzione eseguita oppure eseguire una valutazione su prototipi di confronto,

chiamati benchmark.

Un’alternativa per valutare le prestazioni di un’architettura sono gli valuta ed i

MIPS.

Gli MFLOPS (milioni di istruzioni per secondo in virgola mobile) si utilizzano per

valutare le prestazioni in base a programmi eseguiti su architetture diverse. I

MIPS (milioni di istruzioni per secondo) dipendono dal numero di istruzioni

eseguite, si utilizzano per confrontare due architetture se si esegue lo stesso

gruppo di istruzioni e misurano la frequenza di esecuzione di un certo numero di

istruzioni.

Il MIPS viene calcolato come 6

MIPS = (numero di istruzioni / tempo di esecuzione) * 10

Lo svantaggio di questo metodo è che non è possibile confrontare calcolatori che

eseguono istruzioni diverse, in quanto non tiene in conto le caratteristiche delle

operazioni eseguite, inoltre il MIPS può cambiare in base in base al programma

eseguito.

Gerarchie di Memoria

I programmi godono delle proprietà di località Spaziale che Temporale; in virtù di

ciò sono venute a crearsi delle tecniche basate su queste proprietà. Nel caso

della località temporale possiamo dire che è molto probabile che un'istruzione

verrà referenziata nuovamente a breve e, nel caso della località temporale, che è

molto probabile che vengano referenziate istruzioni vicine a quella attualmente

in esecuzione. Per sfruttare al meglio questi principi la memoria di un calcolatore

viene realizzata seguendo una gerarchia. Essendo, a parità di dimensioni, più

costose le memorie più veloci, normalmente si opta per avere poca memoria

molto veloce e più memoria più lenta per ammortizzare i costi. Allo stesso

tempo è opportuno gestire la memoria in maniera tale da dare l'impressione

41

all'utente di avere una memoria caratterizzata da grande velocità e grandi

dimensioni.

Il livello inferiore ha una maggiore capacità di memorizzazione ed un minor costo

per la realizzazione (rispetto al livello superiore). L’unico svantaggio è che

necessita di maggiore tempo perl’accesso.

La Dinamic Random Access Memory e le Static Random Access Memory formano

la memoria principale del calcolatore. La SRAM viene utilizzata per i registri della

CPU ed è sostanzialmente più veloce della s, ma anche di molto più costosa in

quanto utilizza più transistor per ogni bit di memoria. Viste queste differenze è

opportuno, quindi, utilizzare la SRAM, più piccola ma più veloce, in maniera più

“legata” al processore e la DRAM come memoria più grande per i dati da

elaborare. L'obiettivo è quello di fornire all'utente memoria veloce come quella

più costosa e spaziosa come quella più economica; questo obiettivo può essere

raggiunto lavorando adeguatamente sulle gerarchie di memoria, copiando i dati

solo tra elementi di memoria “adiacenti” tra loro e posizionando le memorie più

veloci, piccole e costose più vicine possibile al processore, lasciando quelle man

mano più lente e grandi più in basso nella gerarchia. Un blocco, ossia la minima

quantità di dati trasferibile, diretto alla CPU, deve essere precedentemente

trasferito dalla RAM o dalle memorie di massa in memoria cache. Se dopo aver

effettuato la richiesta di trasferire i dati, si accerta che il dato è presente, viene

determinato un successo (hit). Nel caso opposto, viene determinato un fallimento

(miss). A tal proposito, vengono definiti due tempi:

• Hit time, ovvero il tempo necessario per accedere al livello superiore;

• Miss time, ovvero il tempo necessario per trasferire un blocco dal livello

inferiore a quello superiore.

La frequenza di miss può diminuire se il blocco diventa maggiore (si sfrutta il

principio di località spaziale), ma può anche aumentare se la dimensione del

blocco diventa troppo grande in confronto alla dimensione totale della memoria

cache. Un incremento dei miss determina quindi una diminuzione delle

prestazioni della memoria cache.

Blocchi, Successi, Fallimenti

La frequenza dei successi (hit rate) corrisponde alla frazione di accessi alla

42

memoria che hanno trovato il dato richiesto nel livello superiore; spesso questo

valore viene utilizzato come indice delle prestazioni della memoria gerarchica. La

frequenza dei fallimenti (missrate) indica invece la frazione di accessi alla

memoria che non hanno trovato il dato richiesto.

Il tempo di successo (hit time) è il tempo di accesso al livello superiore della

gerarchia di memoria, che comprende anche il tempo necessario a stabilire se il

tentativo di accesso si risolve in un successo o in un fallimento.

La penalità di fallimento (misstime) è il tempo necessario a sostituire un blocco

nel livello superiore con un altro blocco preso al livello inferiore e a passare le

informazioni contenute in questo nuovo blocco al processore.

La penalità di fallimenti è composta dal tempo di accesso per accedere alla prima

parola del blocco dopo che è stato rilevato il fallimento e dal tempo di

trasferimento per trasferire le altre parole del blocco. Il tempo di accesso è legato

al tempo di latenza del livello inferiore, mentre il tempo di trasferimento è legato

alla larghezza di banda del canale tra i due livelli di memoria.

Cache

L'origine del termina cache risale alla distinzione gerarchica tra registri d iCPU e

memoria principale, ma con gli anni è diventato un termine utilizzato per

indicare una tipologia di memoria che trae vantaggio dalla località degli accessi.

Il meccanismo di funzionamento è semplice: il processore cerca i dati

esclusivamente nella cache e, se non lo trova, questi vengono trasferiti nella

cache stessa dalla memoria. Ovviamente nel caso in cui i dati cercati siano già

presenti il risultato ottenuto è una velocità di esecuzione di gran lunga maggiore.

Occorre quindi definire dei meccanismi per sapere se un dato è nella cache e nel

caso sia presente come trovare la sua posizione ed accedervi.

Esistono vari modi di far corrispondere gli indirizzi in memoria delle parole che

cerchiamo e le locazioni nella cache. La locazione può essere ad accesso diretto,

associativa a N-vie o completamente associativa. Nella cache ad indirizzamento

diretto ogni locazione di memoria corrisponde esattamente a una locazione della

cache.

Nella cache set associativa a N-vie In una cacheset-associativa a n vie, ogni

blocco può essere messo in un numero prefissato n di posizioni all’ interno di un

insieme. Una cache set-associativa a n vie è costituita da numerosi insiemi(set),

ognuno dei quali comprende n blocchi. Ogni blocco della memoria corrisponde ad

un unico insieme della cache ed il blocco può essere messo in uno qualsiasi degli

n elementi dell’insieme, quindi, la ricerca deve essere effettuata su tutti gli

elementi dell’insieme. 43

Nella cache completamente associativa un blocco di memoria può essere messo

in una qualsiasi posizione della memoria cache e, in virtù di ciò, tutti i blocchi

devono essere esaminati durante la ricerca.

Ogni elemento della cache può venire memorizzato in diverse locazioni, quindi si

rivela necessario aggiungere un meccanismo di tag (etichette) alla cache stessa.

Queste etichette contengono le

Informazioni necessarie a determinare se la parola cercata è presente all'interno

della cache, incluso un bit all'interno delle etichette che ne sancisce la validità

(ad esempio in fase di boot la cache è vuota, quindi i tag conterebbero valori

senza senso).

Prestazioni della Memoria

Per calcolare le prestazioni della memoria cache bisogna tener conto del tempo

di CPU. T CPU = (Cicli esecuzione CPU + Cicli di stallo dovuti alla memoria) *T

CLOCK

I cicli di stallo dovuti alla memoria sono dovuti ai miss e sono pari alla somma dei

Cicli di stallo in lettura e di Cicli di stallo in scrittura. 44

Cicli di stallo in lettura = (Letture / Programma) * f miss in lettura * miss time in

lettura

Cicli di stallo in scrittura = (Scritture / Programma) * f miss in scrittura *miss time

in scrittura + numero di stalli del buffer di scrittura.

Il numero di stalli del buffer di scrittura è dato dalla frequenza delle scritture e da

quanto tempo intercorre tra di esse.

Input/Output

I dispositivi di Input/Output, detti anche periferiche, consistono di dispositivi

meccanici e elementi combinatori e di memoria, sono responsabili dell'inter

azione tra utente e calcolatore e permettono di assumere dati in ingresso e/o

restituire dati in uscita. Più che parti integranti del calcolatore sono

considerati terminali specializzati nella codifica/decodifica dei dati scambiati tra

calcolatore e utente. Questi dispositivi sono composti generalmente da tre

componenti: il dispositivo hardware vero e proprio, una componente di controllo

detta anche controller e una componente software chiamata driver.

Il controller coordina le funzionalità di periferica, processore e memoria al fine di

consentire il corretto funzionamento della periferica stessa, ricevendo gli ordini

dal processore e trasferendoli alla periferica. Normalmente risiede all'interno del

computer, piuttosto che all'interno della periferica, e svolge il suo lavoro tramite

connettori appositi che consentono la comunicazione con il dispositivo

interessato. Comunemente le periferiche e il processore lavorano in maniera

asincrona, in quanto non è possibile prevedere in che momento saranno inseriti

dati da parte dell'utente; per questo motivo alcune periferiche hanno un piccolo

controllo reinterno che gestisce una memoria di buffer, che conserva i dati in

attesa che il processore possa elaborarli o in cui accumula i dati da mostrare in

output.

Essendo la periferica un semplice mezzo di notifica dell'avvenimento di un dato

evento, questa non basta da sola affinché l'evento venga correttamente

elaborato dal calcolatore. Qui infatti subentra il driver che, una volta ricevuto il

segnale binario in cui è stato tramutato l'evento fisico, lo “traduce” in dati

elaborabili, consentendo inoltre la configurazione della periferica. Ogni periferica

necessita, ovviamente, di un driver specifico per il suo funzionamento, che deve

essere quindi installato prima che la periferica possa essere considerata

operativa. 45


ACQUISTATO

1 volte

PAGINE

58

PESO

3.60 MB

AUTORE

meccag

PUBBLICATO

6 mesi fa


DETTAGLI
Corso di laurea: Corso di laurea in Scienze e tecnologie informatiche
SSD:
A.A.: 2018-2019

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher meccag di informazioni apprese con la frequenza delle lezioni di Architettura dei calcolatori elettronici e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Basilicata - Unibas o del prof Carpentieri Marco.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Architettura dei calcolatori elettronici

Riassunto Architettura dei calcolatori elettronici
Appunto
Tesina Architettura dei Calcolatori Elettronici
Appunto
Reti dei calcolatori - Sintesi
Appunto
Tesina Architettura dei Calcolatori Elettronici
Appunto