Pagina 1 di 30 Teoria dell`Informazione: SHANNON Nel 1948

Teoria dell’Informazione: SHANNON
Nel 1948, Shannon (matematico e informatico USA) pubblico' uno dei suoi piu'
importanti articoli, "A Mathematical Theory of Communication", col quale dava
vita alla teoria dell'informazione. Anche in questo caso la motivazione era pratica:
come trasmettere informazione senza che sia confusa o danneggiata* con il
rumore presente in un canale di trasmissione? Per analizzare correttamente
questo problema, egli capi' che era necessario trovare una definizione formale del
concetto di "informazione".
La sua teoria afferma che la quantita' di informazione in un messaggio non ha
niente a che fare con il suo contenuto ed il suo significato, ma soltanto con la
quantita' di zeri e di uno necessari per trasmetterlo, tramutando analoghe
affermazioni teoriche dall’Algebra di Boole.
Questo fu un punto di vista completamente nuovo, perche' fino a quel momento
gli ingegneri pensavano alle telecomunicazioni esclusivamente come la
trasmissione di onde elettromagnetiche attraverso un canale. Ma nessuno aveva
mai teorizzato che ogni tipo di messaggio, indipendentemente dalla sua natura
(immagini, suoni, parole), potesse essere sempre ridotto a 0 e 1.
Al giorno d'oggi, in cui sugli stessi cavi dove viagga la voce del telefono passano
anche pagine Web, MP3 e filmati, questa idea ci sembra ovvia. Ma le sue radici
sono nella pubblicazione di Shannon, in cui per la prima volta compare la parola
"bit".
Shannon mostro' anche che se ad un messaggio vengono inseriti dei bit di
informazione aggiuntiva, questi possono essere usati per correggere errori ed
assicurare la corretta trasmissione anche in un canale con un livello di rumore
molto elevato. Quesa idea e' stata sviluppata negli anni successivi fino a
raggiungere gli attuali codici a correzione d'errore.
In generale in una trasmissione digitale se il rumore non supera una certa soglia
quantizzata il segnale viene trasmesso correttamente.
* ad esempio il bit di parità per controllare se la trasmissione e’ stata regolare
Pagina 1 di 30
Entropia e Ridondanza
Un esempio elementare è il seguente: immaginiamo di ricevere una telefonata
in cui qualcuno ci dice che "il missile per la Luna parte alle nove del mattino".
Per qualche motivo lungo la linea ci sono disturbi che cancellano parti importanti
della frase, di conseguenza non riusciamo a capire assolutamente nulla.
Supponendo che il messaggio trasmesso sia registrato, quindi sempre uguale alla
fonte,
proviamo a riascoltarlo. Di nuovo disturbi, e dunque di nuovo parti cancellate,
a caso, cioè non sempre allo stesso modo. Anche se l'ascoltassimo mille volte,
la casualità dei disturbi non ci permetterebbe mai di capire ciò che ci viene
trasmesso. Ora supponiamo di registrare tre volte l'incomprensibile messaggio
in arrivo e di sovrapporre le tre registrazioni con un mixer.
Alcune parti dei diversi rumori possono andare insieme e diventare intelligibili
come per esempio: "...miss...una...ttino". Così potremmo arguire che si tratta di
una "missione su una duna con un pattino".
Sbaglieremmo clamorosamente, ma,
riprovando con il nostro mixer a sovrapporre ancora più registrazioni,
giungeremo al punto in cui, anche senza avere la frase completa,
riusciremo a capire tutto perfettamente .
Come mai? Abbiamo creato una ridondanza per cui, sfruttando lo spostamento
casuale delle cancellazioni dovute ai disturbi, abbiamo sovrapposto disturbi e
parole in modo da ricreare le parole e rendere innocui i disturbi. Ciò può
succedere soltanto
perché nella nostra memoria ci sono le parole e le sappiamo distinguere dal
rumore che le disturba.
Non avremmo potuto in nessun modo rendere intelligibile
1) informazione che non c'era e
2) informazione che non eravamo in grado di capire una volta ricomposta
parzialmente.
Infatti possiamo comprendere la frase anche senza avere esattamente tutte le
lettere delle parole: in questo caso la ridondanza è nella struttura del linguaggio,
il quale è abbastanza ricco da permettere la comprensione anche se il messaggio
è ancora incompleto, come per esempio
in: "i... mis...ile per ...a Lun... part... a...le nov... del matti...o".
Possiamo dire che il sistema e’ Ridondante quando l’informazione data dal
simbolo e’ certa, quindi con informazione nulla. Ad esempio in inglese alla lettera
Q segue sempre la lettera U, e’ percio’ inutile tramettere la U, visto che il testo
rimane comprensibile.
Pagina 2 di 30
Altri esempi. Tutti hanno sentito musica in un Compact Disc.
Ebbene, la tecnologia per la sua realizzazione era nota da anni (il laser fu
inventato nel 1960 sulla base di ricerche risalenti al 1954), ma solo da poco si è
riusciti ad ascoltare musica o registrare immagini tramite questa tecnologia,
perché dal punto di vista ingegneristico era impossibile sfruttare meccanicamente
le sue potenzialità per un supporto musicale. Tecnicamente la lettura di un Cd
non differisce da quella di un normale codice a barre su di una scatola di biscotti.
Solo che su quest'ultima c'è solo il prezzo, al massimo un codice, poche cifre,
mentre in un Cd vi sono miliardi di informazioni del tipo sì-no, cioè bit. Per
leggere il codice a barre sulla scatola di biscotti, presentata in qualsiasi posizione,
un raggio laser lo illumina più volte e in diverse direzioni, poi, in base alla
ridondanza ottenuta con la sua molteplice lettura (velocissima),
esso è
memorizzato correttamente e, con l'elaborazione dei dati, si elimina ciò che non
interessa e si ricompongono gli eventuali pezzi esenti da errore.
Con il Cd il procedimento è più o meno lo stesso. Sarebbe impossibile ottenere
una lettura meccanica precisa dei microscopici segni sul supporto:
o si ingrandiscono i segni, e allora cesserebbe lo scopo, dato che non si
potrebbero immagazzinare che pochi minuti di musica; oppure si costruisce un
lettore mostruosamente preciso e allora non sarebbe costruibile in serie, e
tantomeno vendibile a causa dell'elevato costo di produzione.
Il problema si risolve facilmente: si incide il segnale in modo ridondante affinché
sia in scrittura che in lettura l'informazione ripetuta possa essere ricostruita da un
microprocessore che memorizza un algoritmo adatto allo scopo.
Insomma, si raggiunge l'obiettivo non aumentando la precisione ma, al contrario,
aumentando semplicemente la possibilità di afferrare un messaggio grossolano
tramite l'elaborazione delle informazioni ridondanti in esso contenute.
La decodificazione dei cifrati, le trasmissioni di dati via modem, la gestione dei
sistemi complessi, i collegamenti radio con satelliti spediti ai confini del sistema
solare, e... l'invio di uomini sulla Luna, sono ottenuti con metodi in cui si estrae il
massimo d'informazione dalla
ridondanza esistente o prodotta, oppure si
introduce informazione in un sistema
di per sé dissipativo, entropico,
trasformandolo in un sistema che tende ad essere "organico", cioè antientropico e
antidissipativo.
Pagina 3 di 30
Se la sorgente emette sempre e solo lo stesso simbolo il valore di H è=0
L’evento certo non fornisce nessuna informazione.
Entropia . H rappresenta l'informazione media di un generico simbolo emesso
dalla sorgente, ottenuta pesando l'informazione di ogni possibile simbolo con la
probabilità del simbolo stesso.
Ad esempio le lettere dell’alfabeto. Quante volte una lettera o una parola viene
ripetuta in una frase o in un discorso o in una trasmissione dati. Quante
probabilità ci sono che la lettera A sia ripetuta?
Il concetto va tradotto in questo modo : esempio, alle lettere dell’alfabeto viene
associato un corrispettivo codice nei computer:0,1
Si assocera’ un codice piu’ complesso alle lettere che si usano meno
frequentemente e piu’ semplice a quello di uso comune
Si utilizza il Teorema di Shannon in generale laddove ci siano problemi di
campionatura:
Compressione Immagini ( i vari formati .jpg, .gif)
Compressione Audio/Video (.Avi)
Modem
Scrambler (apparecchio per criptare)
Formula
H= -log2 P (P=probabilità che il simbolo venga emesso)
Esempio: lancio di una moneta, ogni faccia corrisponde a 0.5
H=1/2(peso dell’informazione associata al simbolo) log2 ½ - 1/2 log2 ½
H=1 bit
Pagina 4 di 30
EVOLUZIONE DEL CALCOLATORE dagli
anni ' 70
Da: http://www.lithium.it/articolo0017p2.htm
Iniziamo direttamente dagli anni '70, da quando cioè furono introdotti i primi calcolatori basati su
transistor altamente integrati, ed esaminiamo la situazione hardware/sofware dell'epoca:
1) le memorie erano a nucleo (core) magnetico: in altri termini erano lente, grosse e
costosissime. Un esempio di memoria di questo tipo è dato dal componente nella figura ( l'uomo
tiene in mano un 'modulo di memoria' da qualche centinaio di byte costituito da piccoli toroidi di
materiale ferromagnetico e dai fili che ne alteravano lo stato di magnetizzazione tramite corrente
elettrica).
2) esistevano i compilatori, ma facevano acqua da tutte le parti: il codice da questi prodotto era
poco ottimizzato e spesso talmente "sporco", cioè inefficiente, che conveniva lavorare
direttamente in assembler, spendendo ore ed ore a scrivere codice che poi risultava difficile da
correggere.
3) i dispositivi di memoria secondaria, anch'essi magnetici, erano ancora più lenti e anch'essi
molto costosi. La conseguenza di tutto ciò è evidente: i programmi dovevano essere molto
semplici e molto compatti per risiedere in una memoria dalle dimensioni di pochi Kbytes. Con
l'avvento delle memorie dinamiche a semiconduttore, a metà degli anni '70, la situazione migliorò
un poco, ma basta guardare la tabella in basso per avere un'idea dei costi.
Lo stato di integrazione era di poche migliaia di transistor su un singolo die di silicio, e per avere
un dispositivo completo di tutte le funzioni necessarie occorreva collegare più chip , ognuno con
mansioni diverse, sulla medesima scheda madre (ricordate che ancora una decina di anni fa il 386
aveva bisogno del coprocessore matematico a parte per svolgere i calcoli in virgola mobile?;-).
Pagina 5 di 30
Da:http://bonda.cnuce.cnr.it/Documentation/ateach/ei/lucidi/Cap_4-1__Le_infrastrutture_hardware.pdf
Evoluzione delle CPU
Da http://www.technologyreview.it/index.php?p=article&a=488
La Legge di Moore, che ha celebrato quest’anno il suo 40esimo anniversario, è stata il regalo più
grande per l’industria dei semiconduttori. Nel 1965 Gordon Moore, uno dei fondatori di Intel,
previde che il numero di transistor su un chip computerizzato sarebbero raddoppiati ogni due
anni. Allora un chip ospitava solo qualche decina di transistor. Oggi il chip più avanzato di Intel
contiene più di 1 miliardo e 700 milioni di transistor e si calcola che il loro numero nel 2012
supererà i 10 miliardi.
Le più recenti CPU per computer da tavolo, per esempio, consumano 100 watt di potenza. Le CPU
per portatile sono in genere più efficienti, poiché sono progettate per massimizzare la vita della
batteria, ma arrivano ugualmente a consumare 75 watt. ‹‹È come mettere un tostapane nel
portatile››, afferma Pat Gelsinger, vicepresidente di Intel. Una soluzione che probabilmente si
diffonderà consiste nell’aumentare il numero dei transistor su chip non rimpicciolendoli, ma
semplicemente replicando lo stesso schema di circuito due o più volte sulla stessa fetta di silicio.
Intel ha rilasciato i suoi primi chip ‹‹a nuclei integrati›› all’inizio del 2005. I dirigenti di Intel
prevedono un futuro di chip ‹‹multinucleo››, con oltre un migliaio di processori uno
accantoall’altro.
Ma c’è un problema. I fili di rame che trasmettono il flusso di 1 e 0 digitali dentro e fuori il
computer, e tra i processori in alcuni computer, possono trasportare solo una determinata
quantità di dati così rapidamente. ‹‹Se raddoppio la prestazione (di un processore), devo anche
raddoppiare la prestazione in entrata e in uscita del chip››, dice Gelsinger. ‹‹Il rame, la nostra
tradizionale
tecnologia
di
collegamento,
non
regge
queste
velocità››.
Il problema è che gli impulsi elettrici che viaggiano attraverso i fili di rame incontrano la resistenza
elettrica, che degrada l’informazione che loro trasportano. Quindi i bit dei dati che viaggiano con il
rame devono essere sufficientemente distanziati e muoversi abbastanza lentamente in modo che i
Pagina 6 di 30
dispositivi all’altra estremità del filo possano recuperarli. Questa limitazione ha già provocato seri
ingorghi sulle reti di area locale che utilizzano fili di rame per le connessioni tra computer
DA: http://www.lithium.it/articolo0017p2.htm
Splittare le mansioni su più chip, tenendo pure conto della limitazione di banda dei bus, cioè delle
piste di rame sulla scheda, introduceva ulteriori ritardi nel trasferimento dei segnali digitali da una
parte all'altra. ( il problema si è ripresentato in tempi recenti, da quando cioè si parla del collo di
bottiglia costituito dall'interfaccia memoria-chipset e chipset-processore, in cui le centinaia di Mhz
dei bus attuali finiscono per creare diafonia fra le varie piste). Si avvertiva la necessità di
impacchettare quanta più logica possibile su un singolo chip, anzichè rivolgersi ad architetture
distribuite. Il progresso tecnologico sulla via della miniaturizzazione dei dispositivi condusse, nel
lontano 1971, al debutto del primo processore della Intel (Integrated Electronics), di cui sotto
vedete un esemplare.
Il 4004 era a tutti gli effeti un 'mini-computer' per l'epoca, in quanto all'interno inglobava tutta la
logica per funzionare come processore general-purpose, cioè per applicazioni generali. Consisteva
di 2300 transistor, il package era dotato di soli 16 piedini per la comunicazione col mondo esterno.
I registri cioè i dispositivi di memorizzazione interni, erano a soli 4 bit (da cui la terminologia
architettura a 4 bit dell'Intel 4004), poteva decodificare al massimo 45 istruzioni e correva intorno
al KHz. Sembra poco, ma fu un chip rivoluzionario poichè stabilì in via definitiva il percorso che
avrebbe seguito l'elettronica negli anni a venire: e cioè cercare di integrare quante più funzionalità
possibili all'interno di un singolo chip, permettendo ad applicazioni di natura diversa di girare sullo
stesso processore.
Per avere un termine di paragone sull'importanza dell'integrazione, basti pensare che nelle
missioni Apollo degli anni '60, quelle che portarono gli americani sul suolo lunare, il computer
deputato al controllo di guida del razzo era composto da 5000 chip, ognuno a sua volta composto
da tre transistor e 4 resistenze! In breve ci si rese conto come un microprocessore fosse
infinitamente superiore ad una struttura distribuita per una serie di ragioni che elencherò
brevemente:
1) consuma di meno
2) produce meno calore e quindi richiede soluzioni meno raffinate per il raffeddamento
3) occupa meno spazio
4) è più affidabile, cioè si guasta con meno frequenza rispetto ad una soluzione cablata, perchè
tutte le componenti interne nascono con lo stesso procedimento e non esistono saldature che
possano saltare
5) è più veloce perchè i segnali percorrono cammini più brevi e quindi si può salire in frequenza.
6) è più economico da produrre su larga scala.
Pagina 7 di 30
Microprocessore Cisc o Risc ?
CISC = Complex Instruction Set Computing
Una filosofia di questo tipo, in cui si cerca di avere un ISA (Instruction Set Architecture) che sia il
più flessibile possibile e che faciliti il debugging del codice prodotto dai compilatori, è nota come
approccio CISC al progetto di un microprocessore.
Il livello ISA (Instruction Set Architecture) descrive l'architettura delle istruzioni che la CPU è in
grado di eseguire in Hardware (Firmware=software creato dal costruttore con le istruzioni da
eseguire). Ogni diversa CPU ha un proprio ISA e quindi istruzioni diverse spesso non compatibili
tra loro.
Scrivere programmi complessi utilizzando direttamente istruzioni ISA è difficile e spesso inutile. In
quasi tutti i calcolatori è possibile scrivere programmi utilizzando linguaggi di alto livello (più
orientati all'uomo: esempio C++) che vengano compilati (ovvero tradotti in istruzioni ISA) da
programmi chiamati Compilatori.
Quando si parla di Assembly language si intende un linguaggio costituito da codici mnemonici
corrispondenti alle istruzioni ISA. In realtà, il linguaggio Assembly fornisce altre facilitazioni al
programmatore, quali etichette simboliche per variabili e indirizzi, primitive per allocazione in
memoria di variabili, costanti, definizione di macro, ... che semplificano il compito al
programmatore (vedi Assembly language Inline).
• Un programma "semplice" detto Assembler (Assemblatore) traduce i codici mnemonici nei
codici numerici corrispondenti alle istruzioni ISA. L'insieme di questi codici costituisce i programmi
eseguibili che possiamo eseguire nei nostri PC.
Da: http://www.di.uniba.it/~archicdl/slide/1-ISA-8086.pdf
Pagina 8 di 30
Struttura CPU
Ciclo Fetch–Decode– Execute (leggi–decodifica–esegui)
1.Prendi (fetch) l’istruzione corrente dalla memoria e mettila nel registro
istruzioni(IR).
2.Incrementa il program counter(PC) in modo che contenga l’indirizzo
dell’istruzione successiva.
3.Determina il tipo dell’istruzione corrente (decodifica = decode).
4.Se l’istruzione usa una parola in memoria, determina dove si trova.
5.Carica la parola, se necessario, in un registro della CPU.
6.Esegui l’istruzione.
7.Torna al punto 1 e inizia a eseguire l’istruzione successiva.
Nota
BUS= Insieme di segnali binari associati ad informazioni dello stesso tipo
1. bus dati, trasporta i dati
2. bus indirizzi, indirizzi di memoria
3. controlli, per guidare l’attività di elaborazione
Il parallelismo dei bus e’ definito dal numero di bit necessari per
codificare i dati, indirizzi e controlli. In particolare si applica al Bus Dati
che definiscono il N° di bit elaborati contemporaneamente in ogni
istruzione CPU ed al Bus Indirizzi in cui il N° di bit definisce il numero di
celle della memoria accessibili direttamente, esempio:
• Bus Dati a 64 bit
• Bus Indirizzi a 32 bit (2 32 =4,3 miliardi circa di locazioni di
memoria ognuna fatta da 8 byte=64 bit).
Pagina 9 di 30
Riferimenti alle informazioni
In linguaggio macchina ci si riferisce ad un dato specificandone la posizione in
memoria. Un dato può trovarsi in una delle seguenti memorie:
– Memoria centrale
– Registro
– Stack
Pagina 10 di 30
Indirizzo iniziale + offset = Indirizzo fisico
Pagina 11 di 30
Pagina 12 di 30
Pagina 13 di 30
Pagina 14 di 30
NOTA
Per ottimizzare l’impiego della CPU si usa la tecnica di trasferimento ad Interrupt (IRQ). Alla
ricezione dell’interrupt (generato ad es. dalla tastiera) la CPU termina l’istruzione corrente,
salva il contenuto dei propri registri nello stack e passa ad eseguire la routine di quel
dispositivo chiamante
Con la tecnica DMA (Direct Memory Access) si trasferiscono i dati dalla memoria
direttamente alla periferica senza far intervenire la CPU.
Pagina 15 di 30
CISC è un acronimo e sta appunto per Complex Instruction Set Computing, cioè architettura
costituita da un insieme, o set, di istruzioni complesse. Fin qui sembrerebbe tutto rosa e fiori:
abbiamo solo aiutato i programmatori a scrivere codice assembler più semplice, quindi più
veloce da correggere, e abbiamo dunque ovviato al grave problema del costo del debugging
del software, che all'epoca era molto sentito giacchè la memoria era assai costosa e il codice
compilato doveva essere il più possibile denso e ottimizzato.
All'epoca non esisteva il concetto di una memoria veloce ma piccola (l'odierna cache) da
affiancare al processore, e a causa del mantenimento della compatibilità con i vecchi ISA, la
maggior parte delle istruzioni prevedevano un sacco di accessi in lettura e scrittura alla
memoria di sistema, la RAM, per intenderci .
Vediamo di chiarire le idee con un esempio: possiamo schematizzare la memoria di sistema
come un array, cioè un insieme ordinato, di celle aventi una certa dimensione in byte. Il
processore è schematizzabile, per i nostri scopi, come un elemento che, dietro i comandi
impartiti da una logica di controllo, preleva i dati dalla memoria centrale (fase di read o load),
li elabora (fase di execute), e una volta processati scrive i risulati finali (fase di write back o
store) nuovamente in memoria. Questo schema descrive l'arcinota macchina di Von
Neumann, dal nome del cervellone che ideò lo schema base del funzionamento di un
calcolatore negli anni Quaranta . Potete pensare alla macchina di Von Neumann come ad un
tizio con un braccio solo: può eseguire una sola operazione alla volta , prelevando documenti
da uno scaffale, riordinandoli, e riporli nuovamente nello scaffale una volta riordinati. La figura
sottostante chiarisce le idee :
Il problema di una tale soluzione è che il concetto di memoria è molto "nebuloso": un
dispositivo di memorizzazione può essere un registro (che funziona alla velocità di clock del
processore in cui è inglobato), una cache, una RAM di sistema o ,alla peggio, l'intero Hard
Disk!
Pagina 16 di 30
Ribellione allo standard : nascita del RISC (Reduced Instruction)
Alla fine degli anni Settanta e nei primi anni Ottanta la situazione era cambiata: i compilatori
erano divenuti molto più efficienti, le memorie meno costose e i progettisti di microcomputer
stavano scoprendo che la "panacea" data dall'implementazione in hardware di istruzioni
complicatissime e a volte strampalate stava costituendo un tappo per il miglioramento delle
performance. Si cominciò allora a pensare ad un modo diverso di progettare un
microprocessore, e le linee guida di progetto possono essere così riassunte:
1) Sulla base di una analisi statistica dei programmi, si scopre che per il 90% del tempo il
processore utilizza sempre un ristretto sottinsieme di istruzioni.
2) Perchè allora non ottimizzare il processore nell'esecuzione diretta di queste poche istruzioni
lasciando al compilatore l'onere di spezzettare le istruzioni più rare e molto più complesse in
task più semplici? In tal modo torna in auge il ruolo del compilatore e si può fare a meno della
ROM di decodifica.
3) Non solo: se il processore è in grado di eseguire direttamente in modo ottimizzato poche ma
importanti istruzioni, facciamo in modo che ogni istruzione venga completata in un solo ciclo di
clock!!
4) Inoltre, l'esecuzione dei programmi è spesso rallentata dai ripetuti accessi in memoria
centrale ordinati dalle varie istruzioni con indirizzamento complesso: decidiamo allora di fare
tabula rasa di queste istruzioni e stabiliamo che l'accesso in memoria avvenga esclusivamente
tramite due comandi: il load per il caricamento del dato dalla memoria al registro e lo store per
la scrittura dal registro alla memoria.
5) Visto che gli accessi in memoria centrale adevono essere limitati il più possibile, occorre
disporre sul chip di un consistente numero di registri per avere un magazzino di informazione
sufficientemente capiente da consentire l'elaborazione dei dati .
DIFFERENZA TRA RISC E CISC
Pagina 17 di 30
CONCLUSIONE
Dopo quanto detto è abbastanza evidente come nello scontro CISC vs RISC sia stata
quest'ultima filosofia ad aver avuto la meglio. Di processori RISC oggigiorno ne abbiamo piene
le letteralmente le tasche: dai palmari ai cellulari della prossima generazione, oggi ogni
processore che voglia essere snello e al contempo potente nasce sotto l'effige del RISC. Gli
stessi processori x86, come abbiamo visto hanno assimilato il paradigma RISC unica e vincente
mossa che ne ha prorogato la vita oltre ogni rosea aspettativa. Del resto il percorso di sviluppo
delle capacità di un processore non si ferma a quello che abbiamo detto.
L'obiettivo di qualsiasi progettista di processori è quello di ottenere sempre il max throughput
complessivo, cioè , il massimo volume di dati processati e consegnati in uscita nell'unità di
tempo. Come conseguire il massimo rendimento? la parola d'ordine in questi casi è
parallelismo. Il parallelismo è stato il passo successivo compiuto dalla tecnologia dei
processori dopo l'affermazione del RISC. Questo si esplica principalmente in due modalità
differenti all'interno di un singolo processore: il pipelining e il superscaling.
Un'altra tecnica di ottimizzazione delle risorse è il multithreading, che come scuola di pensiero
ha pochi anni alle spalle.
Bisogna sapere, che la velocita’ di letture dei dati da una memoria da un notevole
rallentamento sulle prestazioni finali dell’esecuzione di un’istruzione, per superare questo
problema si e’ pensato di rendere i dati richiesti dal processore disponibili ancora prima che
esso li cerchi. Questo meccanismo e’ detto prefetching ed e’ utilizzata per evitare che il
processore debba attendere che le informazioni vengano reperite, lette e portate ad
esecuzione.
La tecnica denominata pipelining e’ il concetto di dividere un'unica operazione in tanti piccoli
passi.
Per esempio potremmo dividere il datapath (percorso dati) in 4 parti.
Facendo questo avremo il primo stadio che legge le istruzioni dalla memoria (prefetching) e
che le mette nei registri, la seconda fase dove l’ALU legge gli operandi, la terza che esegue
l’istruzione e l’ulitma che scrive il risultato nei registri.
Pagina 18 di 30
La nuova tecnologia dual core / multi core
In passato i produttori di chip hanno puntato prevalentemente sul costante incremento delle
frequenze di clock per migliorare le prestazioni e, per esempio, alcuni azzardavano per il futuro
frequenze operative anche fino a 10 GHz.
In realtà negli anni sono intervenuti anche diversi problemi che hanno limitato la crescita delle
frequenze di clock. Per esempio la semplice riduzione di dimensioni dei transistor realizzata
passando a nuovi processi produttivi, non è bastata a contenere la dissipazione termica, ormai
arrivata oltre la soglia dei 100 W. In pratica si è avuto un incremento parallelo, anche se non
proporzionale, della dissipazione delle Cpu con l’aumentare del numero di componenti interni e
delle frequenze operative. Il punto è che si è arrivati oramai a livelli di dissipazione che
rendono il raffreddamento del processore un compito piuttosto arduo per componenti a basso
costo.
Con il tempo è diventato piuttosto chiaro che l’incremento costante delle frequenze di clock
non sarebbe stato più sostenibile a lungo, a meno di radicali cambiamenti nei processi
produttivi e nelle architetture delle Cpu (il Pentium M è un esempio di questi cambiamenti,
visto che opera a frequenze più basse dei Pentium 4 a parità di prestazioni con i più diffusi
applicativi).
Dividere i compiti
Di fatto l’elaborazione parallela, quella ottenibile da più processori che lavorano
simultaneamente, risolve in parte il problema della necessità di crescita delle prestazioni senza
essere costretti a incrementare le frequenze di clock. Se, infatti, si considera che le capacità di
calcolo sono sostanzialmente legate al numero di operazioni eseguite per ogni ciclo di clock
moltiplicato per la frequenza di clock, è chiaro che se si riesce a eseguire un numero maggiori
di operazioni in parallelo, il secondo fattore, cioè la frequenza di clock può scendere senza
condizionare le performance (questo in teoria, dato che moltissimo dipende dal software che
deve essere scritto per poter sfruttare la presenza di due processori). La soluzione migliore per
l’elaborazione parallela è
quella di disporre di due processori distinti, in modo da avere due set completi di risorse a
disposizione. I processori dual core però non soddisfano esattamente questi requisiti dato che
hanno comunque almeno una parte in comune, lo zoccolo e un numero limitato di pin per i
segnali, e quindi una parte delle risorse deve comunque essere condivisa. La terza situazione è
quella di un unico processore come per esempio Pentium 4 Ht, che viene “visto” dal sistema
come due Cpu logiche che lavorano in multiprocessing simmetrico (Smp) e eseguono, se
possibile, due thread in parallelo. Di fatto le unità di esecuzione, le cache, il controller del bus,
il sistema di branch prediction e altri sono in comune, mentre sono duplicati solamente pochissimi elementi come una parte dei registri e il Programmable Interrupt controller. Questo
significa che il software non ha a che fare con due processori completi e fisicamente distinti, e
quindi che il guadagno di performance rispetto alla soluzione e con singola Cpu senza Hyper
Threading spesso è molto limitato. Anche per le Cpu dual core comunque ci sono svariate
soluzioni per implementare due processori all’interno di un unico contenitore. Per esempio, si
può duplicare esattamente il core di un processore (unità di esecuzione, memorie cache, bus
eccetera) oppure avere separate solo le unità di esecuzione e condividere i controller e i bus, o
anche condividere parte delle memoria cache. Intel e Amd hanno, infatti, usato soluzioni
architetturali diverse per rispettivi processori dual core.
Pagina 19 di 30
Il Pentium D di Intel
Durante l’ultima edizione di Idf Intel ha presentato ben quindici progetti legati al multi core e
destinati in pratica a tutti i vari segmenti, dai portatili ai server. La roadmap è molto
aggressiva visto che per il 2006 Intel prevede che il 70% dei suoi processori per desktop e
portatili saranno dual core, percentuale che sale all’85% per i server. Il secondo trimestre
2005 è il periodo scelto per il lancio dei primi processori dual core per Pc del segmento
mainstream. Il core è quello conosciuto in precedenza con il nome in codice Smithfield e in
pratica si tratta di due Pentium 4 sullo stesso die di silicio che condividono le connessione dello
zoccolo in comune. Il package definisce quale die è il core 0 e quale il core 1, e quindi il device
per il boot (il core 0). Anche se sono racchiusi nello stesso contenitore, il software è
perfettamente in grado di distinguere tra i due core La frequenza operativa dei due core, 3,2
GHz, è relativamente bassa se confrontata con quella dei precedenti modelli a singolo core (in
pratica è quella di un Pentium 4 540). Anche il Front side bus a 800 MHz non è quello più
veloce (1.006 MHz) attualmente disponibile per le Cpu Pentium 4. La quantità di cache al
secondo livello disponibile è di 1 Mbyte per ogni core, che però, essendo presenti due core,
occupano un numero rilevante di transistor. La Cpu, infatti, utilizza 230 milioni di transistor
distribuiti su 206 mm2.
Classifica dei primi 6 supercomputer al mondo (2005), da http://www.top500.org/lists/2005/11/basic
Rmax e Rpeak sono valori espressi in Gflops e indicano le perfomances .
Processori Anno
1
2
3
4
5
6
BlueGene/L - eServer
Blue Gene Solution
IBM
IBM Thomas J. Watson
BGW - eServer Blue
Research Center
Gene Solution
United States
IBM
ASC Purple - eServer
DOE/NNSA/LLNL
pSeries p5 575 1.9
United States
GHz
IBM
Columbia - SGI Altix
NASA/Ames Research
1.5 GHz, Voltaire
Center/NAS
Infiniband
United States
SGI
Thunderbird Sandia National Laboratories PowerEdge 1850, 3.6
United States
GHz, Infiniband
Dell
Red Storm Cray XT3,
Sandia National Laboratories
2.0 GHz
United States
Cray Inc.
DOE/NNSA/LLNL
United States
Pagina 20 di 30
Rmax
Rpeak
131.072
2005
280600 367000
40.960
2005
91290
114688
10.240
2005
63390
77824
10.160
2004
51870
60960
8.000
2005
38270
64512
10.880
2005
36190
43520
Unità di Misura
Byte (8 bit)- capacità di memorizzare dati
Baud: deriva dall’ingegnere francese Jean Baudot che inventò il telegrafo
verso la metà del secolo scorso.
Numero dei cambiamenti di stato (impulsi) di un segnale in un secondo.
Indica la velocità del modem
Il numero di bit effettivamente scambiati in un secondo dipende dalla tecnica utilizzata
per scambiare dati (modulazione di ampiezza, frequenza, fase).
bps - velocità di trasmissione dati= bit per secondo
kilobit per secondo (Kbps),
megabit per secondo (Mbps),
gigabit per secondo (Gbps),
103 bps
106 bps
109 bps
Hertz - velocità nell’elaborare dati, oggi GH, Gigahertz
MIPS: Indica il numero di istruzioni eseguite in un secondo da un
microprocessore (Milioni di Istruzioni Per Secondo).
DPI - risoluzione per periferiche di input ed output, ad es. stampanti, macchine
fotografiche digitali, scanner, monitor.
La risoluzione di una stampante indica il numero di punti che si possono stampare in un
quadrato di 2.54 cm di lato(1 inch, pollice).
Una stampante con risoluzione di 300DPI è in grado di stampare 90.000 punti in 6.4516
cm2
La risoluzione di uno scanner indica il numero di punti in cui verrà fotografata
l’immagine in una linea di 2.54 cm
Risoluzione orizzontale e verticale (es. 600x600 DPI)
La risoluzione di un monitor è misurata in maniera differente dalla risoluzione
di stampa.
Tiene in considerazione la grandezza del monitor (15”, 17”, 19”, 21”) e del
numero di pixel gestibile dal monitor e dalla scheda grafica.
Grandezza del monitor misurata dalla lunghezza della diagonale
Esempi di risoluzione (800x600, 1024x768)
Con una risoluzione di 1024 x768 serve una Ram video da 768 K celle (768*
1024 byte celle).
Negli LCD cristalli liquidi, ogni pixel e’ formato da una cella contenente un
liquido che cambia colore in base al potenziale elettrico applicato.
Pagina 21 di 30
Perché un byte = 8 bit?
Per rappresentare i simboli usati nel nostro linguaggio:
52 lettere tra maiuscole e minuscole
10 cifre - 6 tipi di parentesi () [] {}
6 simboli di punteggiatura
7 simboli matematici + * / - > < =
meno di altri 47 simboli …. @ _ \ ^ ….
Multipli del byte
Gigabyte – Gb, 1024 Mb
Terabyte – Tb, 1024 Gb
Petabyte – Pb, 1024 Tb
= 230 byte » 1 miliardo di byte
= 240 byte » 1000 miliardi di byte
= 250 byte » 1 milione di miliardi di byte
La Codifica dei Dati
Ad ogni carattere (simbolo) dobbiamo assegnare una sequenza binaria.
L’assegnazione simbolo « sequenza binaria dipende dal codice utilizzato
• ASCII
• EBCDIC
• UNICODE
Codice ASCII
ASCII: American Standard Code for Information Interchange
ASCII standard: rappresenta 128 simboli (7 bit), A « 65 « 01000001
ASCII esteso: rappresenta 256 simboli (8 bit), £ « 163« 10100011
Codice UNICODE
UNICODE: UNIversal CODE
Gestisce 34168 caratteri.
Serve a rappresentare parole scritte in lingue quali: Ebraico, Cinese,
Giapponese, Russo, ….
I caratteri sono rappresentati da 16 bit
Pagina 22 di 30
Automi a stati finiti
Molti giochi per bambini seguono le seguenti regole: alcune pedine sono
disposte su un tabellone, vengono tirati dei dadi ed il risultato indica e
determina, senza possibilità di intervento da parte dei giocatori, il movimento
di ogni pedina. Le differenti situazioni in cui possono venire a trovarsi le pedine
sono dette stati, ed il gioco passa da uno stato ad un altro secondo regole
determinate (in modo unico) dalla stringa di input definita dal lancio dei dadi.
Dopo un certo numero di lanci dei dadi, il gioco perviene ad uno stato detto
stato finale, che indica la vittoria di uno dei giocatori.
E’ da notare che una volta assegnata la sequenza determinata dai tiri dei dadi,
il meccanismo è totalmente deterministico, cioè non prevede alcuna possibilità
di scelta da parte dei giocatori.
Il più generale modello matematico che racchiude in sé tutte queste
caratteristiche è l’automa a stati finiti (finito perché è tale il numero degli stati
possibili, automa per indicare un oggetto che si muove da se).
Un automa è un dispositivo astratto, utilizzato per realizzare delle
computazioni. Gli automi sono utilizzati come modello nella progettazione di
circuiti digitali, negli analizzatori lessicali di un compilatore, per la ricerca di
parole chiave su file o (in maniera più estesa) sul web, o per software per la
verifica di sistemi a stati finiti, come i protocolli di comunicazione.
Sono così esempi di automi anche una lavatrice, un distributore automatico di
bibite, un interruttore, una calcolatrice tascabile,
Turing ha studiato e definito le macchine di Touring prima che esistessero i
calcolatori. Le macchine di Touring possono essere idealmente rappresentate
come computer astratti.
Macchine di Touring:
Una macchina di Touring (in seguito chiamata più semplicemente TM) è un
automa a stati finiti con un nastro di lunghezza infinita su cui può leggere e
scrivere.
Una TM fa una mossa in funzione del suo stato e del simbolo sotto la testina di
lettura. In una mossa, la TM cambia stato
scrive un simbolo nel nastro
muove la testina a destra {R} o a sinistra {L}
Automi a stati finiti ed espressioni regolari
Pagina 23 di 30
Un automa
1.
2.
3.
4.
5.
a stati finiti è una quintupla formata da A=(Q, , , q0, F):
insieme finito degli stati dell'automa
alfabeto del linguaggio
insieme delle transizioni di stato
unico stato iniziale
insieme finito di stati finali
La tipologia più semplice di macchina per il riconoscimento di linguaggi, è
costituita dai cosiddetti automi a stati finiti, o automi finiti. Questi automi si
possono pensare come dispositivi che, mediante una testina di lettura, leggono
la stringa di input scritta su di un nastro e la elaborano facendo uso di un
"meccanismo" e di una memoria di lavoro limitata.
L'elaborazione della stringa, avviene un carattere alla volta, mediante
l'esecuzione di specifici passi computazionali:
Lettura del carattere corrente della stringa.
Spostamento della testina sul carattere successivo.
Aggiornamento dello stato della memoria che viene sfruttato per tenere
traccia di quanto letto, in base ad una funzione di transizione che ad ogni
coppia < carattere letto, stato corrente > associa lo stato successivo.
Inizialmente la memoria dell'automa si trovi nello stato iniziale q0, mentre
dopo la lettura del primo carattere (a) della stringa e lo spostamento della
testina di lettura sul carattere successivo, la memoria passi nello stato q1, fino
ad arrivare poi nello stato q3 alla fine della elaborazione di tutta la stringa di
input.
Con il termine automa s’intende un qualunque dispositivo, un qualunque
oggetto, che esegue da se stesso un particolare compito, sulla base degli
stimoli od ordini ricevuti.
Pagina 24 di 30
Sono così esempi di automi una lavatrice, un distributore automatico di bibite,
un interruttore, una calcolatrice tascabile, è possibile studiare un automa da
due punti di vista: da un punto di vista tecnico ci s’interessa dei suoi
componenti materiali, meccanici o elettronici, e dei suoi principi fisici che ne
rendono possibile il funzionamento; da un punto di vista matematico
c'interessa invece la "logica" del suo comportamento e l’automa è perciò visto
come un oggetto astratto "capace" di eseguire qualche compito.
Ad esempio, due automi capaci di eseguire un’addizione sono l’automa uomo e
l’automa calcolatrice, molto diversi da un punto di vista tecnico-fisico, ma che
si comportano nello stesso modo di fronte a due numeri da addizionare.
I grafi e le matrici sono due
comportamento di un automa.
modi,
equivalenti, di
rappresentare
il
Il grafo, chiamato diagramma degli stati, ha come nodi gli stati possibili
dell’automa; gli archi rappresentano le relazioni di passaggio da uno stato
all’altro, secondo il particolare input.
La matrice, chiamata tabella di verità, è una tabella in cui ogni casella specifica
qual è il successivo stato e l’output dell’automa se esso si trova in un
determinato stato e riceve un certo input.
Un distributore automatico di bevande dà una lattina quando s’inseriscono due
monete da 20 euro.
Quali sono gli input e gli output di quest'automa?
Quali sono i possibili stati?
Il diagrammi degli stati è il seguente:
Nell’arco che va dallo stato di "in attesa" allo stato di "pronto" la scrittura
"moneta/lattina" indica che, in corrispondenza dell’input "moneta" è fornito
l’output "lattina". Come si vede, non sempre un automa fornisce un output.
Pagina 25 di 30
La tabella di verità è la seguente:
Input Stati
SPENTO
PRONTO
IN ATTESA
moneta
SPENTO
IN ATTESA
PRONTO/lattina
Gli stati di un automa rappresentano i suoi stati di memoria; un automa,
infatti, si trova in uno o in un altro stato secondo ciò che è successo in
precedenza. Secondo lo stato in cui si trova e dell’input che riceve, l’automa
stabilisce il suo comportamento, passando in un nuovo stato ed eventualmente
fornendo un output:
(stato, input) (nuovo stato, output).
I livelli di un computer
Livello 0: livello della logica digitale, hardware;
Livello 1: livello della microprogrammazione, firmware (è costituito dal
software incorporato nei dispositivi elettronici durante la loro costruzione);
Livello 2: livello del sistema operativo;
Livello 3: livello del software.
Pagina 26 di 30
Automi di Mealy e di Moore
Gli automi a stati finiti sono una particolare categoria di dispositivi automatici
facilmente realizzabili anche con le tecniche dell’elettronica digitale.
Un automa si dice proprio, o di Moore, quando le uscite al tempo t dipendono
esclusivamente dai valori assunti dello stato, in pratica:
Ut = g (St)
Per esempio un flip-flop è un automa di Moore di tipo sincrono, infatti, l’uscita
può variare solo in sincronismo con il fronte attivo del clock. Un latch è invece
di tipo asincrono perché la variazione dell’uscita avviene in corrispondenza di
una variazione d’ingresso. Le reti combinatorie risolvono problemi in cui non è
richiesto di ricordare la storia degli ingressi precedenti.
Nel diagramma degli stati ogni nodo rappresenta una coppia s/u, ove s è lo
stato ed u l’uscita in un certo istante, e ad ogni arco è associato il relativo
ingresso.
Un automa si dice improprio, o di Mealy, quando è caratterizzato dal fatto che
l’uscita al tempo t, oltre che dallo stato, dipende anche dagli ingressi nello
stesso istante, in pratica:
Ut = g (St, it).
Non si deve pensare che gli automi di Moore siano più limitati di quelli di Mealy
rispetto alle cose che possono fare. Infatti, è sempre possibile trasformare ogni
automa di Mealy nel corrispondente automa di Moore aumentando
adeguatamente il numero degli stati.
Le reti sequenziali e la macchina di Turing sono esempi di automi di Mealy.
Nel diagramma degli stati ogni nodo rappresenta uno stato e ad ogni arco è
associata una coppia i/U, dove i è l’ingresso che provoca il cambiamento di
stato ed U è l’uscita che ne deriva.
Dallo stato attuale Sp a quello futuro Sf a causa dell’ingresso Ip . Sì mette
anche il valore di ingresso e quello di uscita U.
Ip/Up
Autonoma di Mealy
Sp
Sf
Sp
Ip
Autonoma di Moore
Pagina 27 di 30
Sp
Sf,Uf
Gli automi che esamineremo sono tutti automi con memoria limitata, e
comunque finita poiché hanno un numero finito di stati: sono chiamati automi
a stati finiti.
Più precisamente definiamo automa a stati finiti un sistema dinamico, discreto
ed invariante, in cui gli insiemi d’ingresso, di uscita e di stato sono finiti.
Una classe di automi particolarmente importante è quella degli automi in grado
di riconoscere se una stringa fa parte o meno di un determinato linguaggio:
automi riconoscitori. Quando si scrive un programma in un linguaggio di
programmazione, infatti, l’esecutore (compilatore e/o interprete), prima
ancora di elaborare i dati eseguendo le istruzioni, deve verificare che nelle
istruzioni impartite non ci sia alcun errore di sintassi.
Gli automo riconoscitori, in pratica, sono sistemi che, dopo l’ingresso
dell’ultimo simbolo della sequenza, rispondono con un "si" se questa è stata
riconosciuta e con un "no" in caso contrario.
In automi di questo tipo, nei diagrammi degli stati, è possibile riconoscere
l’esistenza di almeno uno stato iniziale, caratterizzato dal fatto di non aver
nessun arco in entrata, e uno stato finale, da cui invece non escono archi.
Anche molti modelli astratti usati per rappresentare sistemi molto complessi
come i sistemi economici, le reti di neuroni, i problemi d trasporto, e così via,
possono essere agevolmente rappresentati attraverso delle tabelle di verità.
Per descrivere un automa occorre un modello matematico formato dalla
quintupla:
A = í S, I, U, f, g
dove:
S è l’insieme degli stati interni in cui può trovarsi;
I è l’insieme degli ingressi che è in grado di leggere;
U è l’insieme delle uscite che può produrre;
f è la funzione che fa passare da uno stato al successivo, St+1 = f (St, it);
g è la funzione che determina il valore delle uscite, Ut = g (St, it).
Pagina 28 di 30
Esempio di Automa finito di Moore
I2
Inizio
I1
I2
S1,U1
S2,U2
I1
Tabella Transizioni
Stati Interni
Ingresso
I1
Ingresso
I2
S1
S2
S1
S1
S2
S2
Tabella Uscite
Stati Interni
S1
S2
U1
U2
Se il sistema si trova nello stato S1 con associata l’uscita U1 passa nello stato
S2 se viene fornito l’ingresso I2 mentre rimane in S1 finche’ arriva l’input I1.
Rimane pure in S2/U2 finche’ arriva l’input I2, mentre effettua una
transizione in S1 se arriva I1.
In conclusione nell’automa di Mealy le uscite si verificano in concomitanza con
le transizioni ed e’ quindi esplicita la dipendenza di esse anche dall’ingresso
oltre allo stato.
Mentre nell’automa di Moore le uscite si hanno in corrispondenza del
permanere del sistema in uno stato e quindi dipendono esplicitamente solo da
esso.
Se si analizzasse il comportamento dell’automa Ascensore vista da un utente
generico e da un tecnico troveremmo che l’utente vede l’automa ascensore
come automa di Mealy mentre il tecnico lo vedrebbe come automa di Moore.
Pagina 29 di 30
NOTE
Pagina 30 di 30