Una breve introduzione
06/10/2012 Matteo Ceserani
Tutto ciò che segue è ESTREMAMENTE
semplificato…
06/10/2012 Matteo Ceserani
I dati in ingresso e i risultati delle
elaborazioni in uscita sono sempre codificati
in binario come stringhe di bit (0/1)
ELABORATORE
Informazione in ingresso
Dati
Informazione in uscita
Risultati
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
Un calcolatore elettronico è un complesso circuito per l’elaborazione automatica dell’ informazione.
La CPU (o le CPU) è il cuore del sistema, svolge nei fatti le operazioni che costituiscono l’elaborazione.
La memoria di sistema serve per memorizzare i dati e i risultati dell’elaborazione.
Sempre la memoria di sistema contiene il codice delle istruzioni da eseguire sui dati (programmi)
Le periferiche di I/O ricevono i dati dall’esterno (Input) e forniscono in uscita i risultati dell’elaborazione (Output).
I diversi elementi sono collegati attraverso un insieme di linee elettriche che prendono complessivamente il nome di bus di sistema.
06/10/2012 Matteo Ceserani
Che tipo di operazioni è in grado di svolgere
una CPU?
Aritmetica intera
Logica delle proposizioni
Aritmetica decimale
Altre operazioni binarie
Rotazioni di bit
Swap
Istruzioni speciali
SIMD
…
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
L’esempio sopra riportato si riferisce a un
microprocessore molto semplice
Un microcontrollore
31 istruzioni
Nella figura precedente ci sono quasi tutte
Prendiamo l’instruction set reference della
architettura Intel a 32 bit
978 pagine
Circa 340 istruzioni
Alcune davvero sofisticate
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
Programmare
Innanzitutto
occorre
progettare il
funzionamento
del
programma
dal punto di
vista logico
Es. diagrammi
di flusso
06/10/2012 Matteo Ceserani
Programmare
Si sceglie quindi
un linguaggio di
programmazione
tramite il quale
stendere il codice
del programma
Es. Linguaggio C
06/10/2012 Matteo Ceserani
Programmare
Si utilizza un
particolare
software per
tradurre il
linguaggio di
programmazione
in linguaggio
macchina
Compilatore
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
Il codice macchina ha caratteristiche che dipendono fortemente da quelle dell’hardware su cui il software dovrà essere eseguito
Non solo: anche i sistemi operativi sono molto differenti tra di loro
Il programmatore deve conoscere l’ambiente hardware e software in cui il suo programma dovrà funzionare
Il codice macchina ottenuto non è portabile su altre piattaforme
Una situazione alternativa: Java
06/10/2012 Matteo Ceserani
La JVM (Java Virtual Machine) è un particolare software che simula un hardware virtuale standard, su cui vengono eseguiti i programmi scritti in Java
Esiste una Java Virtual Machine per ogni piattaforma hardware (32 bit, 64 bit) e per ogni sistema operativo (Win, Linux, MacOS, Android etc…)
Si realizza così la portabilità del codice, e il programmatore si può astrarre da hardware e sistemi operativi
Altro esempio: Microsoft Visual Basic e il .NET Framework
Limitato al solo ambiente Windows
Realizza la sola portabilità hardware
Le specifiche però sono aperte: volendo…
06/10/2012 Matteo Ceserani
La RAM è composta da celle di memoria che possono contenere ciascuna un certo numero di bit (in genere 8: un Byte)
Ogni cella di memoria è individuata dal suo indirizzo, un numero progressivo che parte da 0.
Le linee per i dati (D) sono bidirezionali e permetto la lettura e la scrittura delle celle di memoria che compongono la RAM.
Le linee A (Address) servono per fornire alla RAM gli indirizzi delle celle da cui si vuole leggere o in cui si vuole scrivere.
Il segnale CS (Chip Select) abilita il dispositivo.
I segnali RD e WR servono ad avviare un’operazione di lettura o di scrittura.
06/10/2012 Matteo Ceserani
Ciclo di lettura
RD 1
A Indirizzo della cella di memoria da leggere
CS 1
Dopo un certo tempo (ns) il contenuto della cella di indirizzo A è disponibile sulle linee D
Ciclo di scrittura
WR 1
A Indirizzo della cella di memoria in cui scrivere
D Parola di bit da scrivere nella cella
CS 1
Dopo un certo tempo (ns) la parola di bit posta in ingresso sulle linee D è memorizzata nella cella di indirizzo A
06/10/2012 Matteo Ceserani
Le linee del bus si dividono logicamente in tre gruppi Linee che trasportano dati e istruzioni (bidirezionali)
Linee che trasportano indirizzi di celle di memoria e di periferiche (unidirezionali)
Altre linee di controllo (unidirezionali)
06/10/2012 Matteo Ceserani
Per permettere l’interfacciamento della CPU
con la memoria
le linee D degli integrati di RAM vengono
collegate al bus dei dati
Le linee A degli integrati di RAM vengono
collegate al bus degli indirizzi
Le linee CS, RD e WR vengono collegate a tre
linee in uscita del bus dei controlli
È sempre la CPU a gestire le letture e le
scritture in memoria
Eccezione: DMA (Direct Memory Access) ma è
un’altra storia
06/10/2012 Matteo Ceserani
Qual è la dimensione massima della memoria
RAM di un sistema di elaborazione?
20 bit 1 MB
32 bit 4 GB
64 bit 2097152 TB
Perché?
ML 2L = dimensione della memoria (parole, in genere Byte)
M = dimensione del bus degli indirizzi (numero di linee)
06/10/2012 Matteo Ceserani
Unità di misura Definizione In byte
1 Byte 8 bit 1
1 KB 1024 Byte 1024
1 MB 1024 KB 1048576
1 GB 1024 MB 1073741824
1 TB 1024 GB 1099511627776
Perché 1 Byte è composto da 8 bit?
Perché si procede di 1024 in 1024?
06/10/2012 Matteo Ceserani
Le periferiche di Input e Output in linea di
massima funzionano come delle celle di
memoria:
Possiedono un indirizzo e le corrispondenti linee
A da collegare al bus degli indirizzi
Possono essere lette (Input) o scritte (Output)
dalla CPU attraverso le loro linee D collegate al
bus dei dati
Possiedono linee di abilitazione (CS) e di lettura
e scrittura (RD, WR)
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
Una CPU funziona ripetendo continuamente quello che si chiama CICLO DI MACCHINA
Approssimativamente un ciclo di macchina corrisponde all’esecuzione di un’istruzione da parte della CPU
Il ciclo di macchina si divide in due parti fondamentali: Fase di FETCH Caricamento da parte della CPU del codice
dell’istruzione da eseguire
Fase di EXECUTE Esecuzione da parte della CPU dell’istruzione il cui
codice è stato caricato nella fase di fetch
06/10/2012 Matteo Ceserani
UC: Unità di Controllo
Circuito elettronico molto complesso
Responsabile sia della fase di Fetch che di quella di Execute
Produce i segnali di comando che determinano l’esecuzione delle istruzioni (fanno parte del bus dei controlli)
IR: Instruction Register
contiene il codice dell’istruzione da eseguire
È una cella di memoria
PC: Program Counter
contiene l’indirizzo della cella di RAM che contiene il codice della prossima istruzione da eseguire
È una cella di memoria
06/10/2012 Matteo Ceserani
MAR: Memory Address Register
cella di memoria per l’interfacciamento con il
bus degli indirizzi
MDR: Memory Data Register
cella di memoria per l’interfacciamento con il
bus dei dati
06/10/2012 Matteo Ceserani
La fase di Fetch si ripete sempre uguale
Passi della fase di Fetch
MAR PC
Bus degli indirizzi MAR
CS 1
RD 1
MDR Bus dei dati
IR MDR
PC PC + 1
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
La fase di Execute è diversa per ogni
istruzione che la CPU è in grado di eseguire
In realtà può essere distinta in due fasi
UC legge il contenuto di IR e lo decodifica,
producendo i corrispondenti segnali di comando
La RAM, le periferiche e le altre parti interne
della CPU si attivano in risposta ai segnali di
comando per eseguire l’istruzione
Vediamo un esempio, si spera semplice
ADD R0,R1,R2
R0 R1 + R2
06/10/2012 Matteo Ceserani
Registri di uso generale Celle di memoria
Possono essere utilizzate per memorizzare qualsiasi valore Dati
Risultati
…
ALU: Unità Aritmetico Logica Svolge calcoli matematici e logici su numeri interi e
espressioni logiche
Viene affiancata da una FPU (Floating Point Unit) per il calcolo in virgola mobile
Accumulatore Cella di memoria speciale
Contiene sempre uno dei due operandi della ALU
In esso viene posto il risultato delle operazioni svolte dalla ALU
06/10/2012 Matteo Ceserani
Dopo la decodifica da parte di UC i passi sono i seguenti Accumulatore R1
Accumulatore Accumulatore + R2
R0 Accumulatore
Questa fase di Execute non coinvolge in alcun modo la memoria di sistema… Possiamo nel frattempo svolgere la fase di Fetch
successiva (Pipeline)
Esistono ovviamente istruzioni che hanno bisogno di accedere alla memoria di sistema per essere eseguite
06/10/2012 Matteo Ceserani
06/10/2012 Matteo Ceserani
Altro esempio… ADD [3F55],R0,R1
Il risultato della somma del contenuto di R0 e R1 viene memorizzato nella cella di memoria di indirizzo 3F55H = 16213D = 0011111101010101B
I passi sono i seguenti Accumulatore R0
Accumulatore Accumulatore + R1
WR 1
MAR 3F55H
MDR Accumulatore
CS 1
Somma
Scrittura in memoria
06/10/2012 Matteo Ceserani
Durante la somma si può eseguire il fetch
dell’istruzione successiva (il bus è libero)
Durante la scrittura della memoria si può
utilizzare la ALU per un’altra operazione (il
bus non si può utilizzare perché è occupato)
L’efficienza della pipeline è uno dei fattori
principali per l’incremento delle prestazioni
della CPU
Un altro fattore è il parallelismo
Più CPU che lavorano in parallelo possono
svolgere più istruzioni contemporaneamente
06/10/2012 Matteo Ceserani
Come è fatto un software? Un esempio in
linguaggio C…
1. float CalcoloMedia(int N){
2. float Somma;
3. Somma = 0;
4. for(i=0;i<N;i++){
5. scanf(“%d”,&Numero);
6. Somma = Somma + Numero;
7. }
8. Somma = Somma / N;
9. return Somma;
10. }
06/10/2012 Matteo Ceserani
Ordine di esecuzione…
3.
4. 5. 6.
4. 5. 6.
4. 5. 6.
4. 5. 6.
4. 5. 6.
4. 5. 6.
4. 5. 6.
4. 5. 6.
4. 5. 6.
8.
9.
N = 9
06/10/2012 Matteo Ceserani
Principio di località spaziale
Se si sta eseguendo l’istruzione memorizzata
nella cella di memoria di indirizzo X, è probabile
che la prossima istruzione da eseguire sia
memorizzata nella cella di indirizzo X + 1
Principio di località temporale
Se si sta eseguendo un’istruzione, è probabile
che la stessa istruzione venga rieseguita dopo
breve tempo
Perché caricare continuamente dalla
memoria di sistema lo stesso codice, tenendo
occupati i bus?
06/10/2012 Matteo Ceserani
Per sfruttare i principi di località spaziale e temporale si è introdotta nelle CPU la memoria cache
Si tratta di una memoria molto veloce integrata nella CPU
I tempi di accesso alla cache sono molto inferiori a quelli di accesso alla RAM di sistema
Il codice di una istruzione (o un dato) vengono dapprima cercati dalla CPU nella cache
Se il dato o l’istruzione vengono trovati (cache hit) la CPU risparmia un accesso alla memoria esterna
Se il dato o l’istruzione non vengono trovati (cache miss) la CPU accede alla memoria esterna, carica il dato o l’istruzione e li copia anche nella cache
06/10/2012 Matteo Ceserani
Statisticamente l’utilizzo della cache riduce drasticamente il numero di accessi alla memoria di sistema
Per ottimizzare le prestazioni si utilizza una cache gerarchica (almeno due livelli, ma anche tre)
L1: livello più interno. Ogni CPU possiede la sua cache L1 privata, a volte divisa in cache per i dati e cache per le istruzioni. Dimensioni dell’ordine delle decine di KB.
L2: livello più esterno. Di solito condivisa tra tutte le CPU del microprocessore. Dimensioni dell’ordine di qualche MB.
L3: in alcuni casi il livello più esterno è il terzo. In tal caso la cache L2 non è condivisa, mentre lo è la L3.
06/10/2012 Matteo Ceserani
I sistemi operativi gestiscono l’esecuzione di molti programmi contemporaneamente (multitasking)
Questa gestione deve essere completamente trasparente al programmatore
Il programmatore non si deve dover preoccupare del multitasking: scrive il codice come se il suo programma possa disporre del processore in maniera esclusiva
Ovviamente solo un programma può essere in esecuzione in un certo istante (almeno su una singola CPU)
I diversi processi vengono posti in esecuzione a rotazione, assegnando a ciascuno di essi una piccola quantità di tempo di processore (quanto di tempo)
L’utente ha la sensazione che i programmi vengano eseguiti parallelamente tra loro
06/10/2012 Matteo Ceserani
Stati di un processo Running Il processo è in esecuzione, sta utilizzando il
processore.
Ready Il processo dispone di tutte le risorse necessarie all’esecuzione ma non dispone del processore.
Wait Il processo è in attesa della disponibilità di una certa risorsa (es. operazioni di I/O). In generale il tempo di attesa può essere indefinito.
Init Fase di creazione e inizializzazione di un processo.
End Termina l’esecuzione.
Abort Terminazione anormale del processo. Viene generato un file di dump (copia della memoria) per l’analisi dell’applicazione volta a determinare l’errore.
06/10/2012 Matteo Ceserani
Ready Running
End
Abort
Wait Init
Manca una
risorsa
06/10/2012 Matteo Ceserani
La gestione dei processi in attesa o pronti
per l’esecuzione è compito del sistema
operativo (uno dei più importanti)
La CPU e il sistema di elaborazione in
generale devono però supportare il
meccanismo di rotazione dei processi
Oggi il multitasking è uno standard per tutti i
calcolatori
Almeno dal PC in su…
Arduino non ha nemmeno un sistema operativo!
06/10/2012 Matteo Ceserani
Obiettivo: far sì che ciascun processo abbia
l’illusione di disporre dell’intera memoria
indirizzabile dal processore
Questo di solito vuol dire superare il limite
della memoria fisicamente presente sulle
macchine, mantenendo il solo vincolo legato
alla dimensione del bus degli indirizzi
Si noti che questo deve verificarsi per
ciascun processo in esecuzione sulla
macchina
06/10/2012 Matteo Ceserani
Conservare in memoria centrale solo le porzioni di codice e dati che presumibilmente saranno necessarie e/o evolveranno in un prossimo futuro
Occorre farlo in maniera assolutamente trasparente al programmatore
Duplice divisione della memoria: Si divide lo spazio di memoria del programma (limitato solo
dalla dimensione del bus indirizzi) in pagine logiche di dimensione fissa
Si divide lo spazio fisico di memoria (fissato dall’hardware) in pagine fisiche aventi la stessa dimensione di quelle logiche
Meccanismo della paginazione: mappare le pagine logiche necessarie in un certo istante
all’esecuzione di un processo su corrispondenti pagine fisiche
Una MMU (Memory Management Unit) si occupa della traduzione degli indirizzi logici nei corrispondenti indirizzi fisici.
06/10/2012 Matteo Ceserani
B
D E
A
C
F
G
A
B
C
D
E
G
H
F
0
1
2
3
4
5
6
7
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MEMORIA
LOGICA
MEMORIA
FISICA
0 1 2 3 4 5 6 7
v
v
v v
i
i i
i
3
6
10 11
TABELLA
DELLE
PAGINE MEMORIA DI
SWAP
Pagina
fisica
Bit di
validità
H
06/10/2012 Matteo Ceserani
Il processo è convinto di poter accedere a tutta
la memoria indirizzabile
Richiede l’accesso a una cella appartenente a
una certa pagina logica
Consultando una tabella delle pagine si controlla
se la pagina logica è presente in quel momento
in memoria centrale
Se non è presente la si carica da una memoria di
swap (di solito una parte del disco)
Se necessario si scarica dalla memoria centrale
una pagina logica ritenuta meno utile
06/10/2012 Matteo Ceserani