900 likes | 1.1k Views
Funzionamento dei calcolatori elettronici Prof. Michele Amoretti Fondamenti di Informatica a.a. 2008/2009. Sommario Descrizione a livello logico dei calcolatori Architettura vs Organizzazione dei moderni calcolatori Modelli architetturali CPU Memoria Sottosistema di I/O
E N D
Funzionamento dei calcolatori elettronici Prof. Michele Amoretti Fondamenti di Informatica a.a. 2008/2009
Sommario • Descrizione a livello logico dei calcolatori • Architettura vs Organizzazione dei moderni calcolatori • Modelli architetturali • CPU • Memoria • Sottosistema di I/O • Strutture di interconnessione
Porte logiche Una porta logica è un blocco elementare in cui la relazione fra variabili di ingresso e variabili di uscita è descritta da una funzione logica. Utilizzando un numero limitato di tipi di porte logiche è possibile realizzare un circuito logico combinatorio che realizza una qualsiasi funzione logica. NOTANDOR XORNANDNOR
Semisommatore Il semisommatore (“half adder”, HA) è un circuito a due ingressi (A, B) che restituisce il bit di somma degli ingressi (S) e un bit di riporto (C).
Sommatore completo Il sommatore completo (“full adder”, FA) è un circuito che, rispetto al semisommatore, comprende anche una linea di riporto in ingresso.
Sommatore Connettendo più FA assieme è possibile realizzare un circuito che somma numeri binari di lunghezza qualsiasi. Tipicamente le “parole” binarie hanno lunghezze standard (23 bit = 1 byte, 24 bit = 1 word, ecc.).
Unità Aritmetica e Logica (ALU) A partire dal sommatore completo, è possibile costruire un circuito in grado di compiere anche altre operazioni. Sottrazione tra parole binarie: A – B = A + (-B) = A + (B + 1) per cui aggiungendo al sommatore una linea di controllo c0 che seleziona B o il suo complemento, e una linea di controllo c1 che seleziona A oppure 0, si ottiene una rete in grado di effettuare sia la somma che la sottrazione (quest’ultima richiede C-1=1). Per quanto semplice, il circuito risultante rappresenta una unità aritmetica e logica (ALU).
B A n n C-1 C c0 c1 n Unità Aritmetica e Logica (ALU) c1 c0 C-1 Risultato Commento 0 0 0 S=0+B=B Selezione di B 0 0 1 S=0+B+1=B+1 Incremento di B 0 1 0 S=0+B=B Complementazione di B 0 1 1 S=0+B+1=–B Cambio di segno di B 1 0 0 S=A+B Somma di A e B 1 0 1 S=A+B+1 1 1 0 S=A+B=A–B–1 1 1 1 S=A+B+1=A–1 Differenza tra A e B S
Circuiti bistabili • Oltre ad elaborare le informazioni, i calcolatori devono anche • memorizzarle. • Gli elementi di memoria (in grado di contenere un bit) possono • essere di vario tipo. • Molto usati sono i circuiti bistabili, che sono circuiti combinatori in • grado di: • permanere stabili in due stati diversi (MEMORIA) • commutare da uno stato all'altro (SCRITTURA) • manifestare lo stato interno (LETTURA)
Segnale di clock Il funzionamento del calcolatore è cadenzato da un segnale periodico (detto segnale di clock), caratterizzato da un periodo di clockTCK. – Frequenza del clock: fCK= 1/TCK; Nel periodo TCKil segnale assume il valore logico 1 per un tempo THe il valore logico 0 per un tempo TL – Il rapporto TH/ TCKè detto duty-cycle Il passaggio dal valore 0 al valore 1 è detto fronte di salita Il passaggio dal valore 1 al valore 0 è detto fronte di discesa
Flip-flop Il flip-flop è un circuito bistabile sincrono, cioè regolato da un segnale di clock. L’effetto del clock è di stabilire quando (a intervalli regolari) il flip- flop può cambiare stato: - con Ck=0 ingressi bloccati, il flip-flop non cambia stato (è opaco) - con Ck=1, gli ingressi sono attivi (il flip-flop è trasparente) Es. flip-flop JK
Registri Per registro si intende un insieme di n identici elementi di memoria (flip-flop), sincronizzati tramite un unico clock. Sono i supporti che materializzano l’informazione nei sistemi di elaborazione. Se Rin=0, l’ingresso ai FF è 00 per cui il registro mantiene lo stato precedente. Se Rin=1, sul prossimo clock lo stato di ogni FF diventa quello corrispondente all’ingresso INi. Rout ha funzione di output enable dell’uscita a tre stati.
Central Processing Unit (CPU) • Il cuore di un sistema di elaborazione è la CPU, che nella versione • più semplice è composta da: • una ALU • alcuni registri • una unità di controllo • un bus interno DR AR ACC
Architettura di un sistema di elaborazione • Riguarda le caratteristiche del sistema che sono visibili al • programmatore. • Fanno parte dell’architettura i seguenti aspetti: • il numero di bit utilizzato per rappresentare i dati (numerici e testuali) • il numero di registri della CPU • le modalità di indirizzamento • il repertorio delle istruzioni • Con il termine modello di programmazione ci si riferisce a ciò che • vede il programmatore assembly, ovvero all’insieme dei registri • che egli può manipolare e al repertorio di istruzioni assembly. • In pratica il modello di programmazione è la traduzione in termini • di programmazione dell’architettura.
Organizzazione di un sistema di elaborazione • Riguarda le relazioni strutturali tra le unità funzionali e il modo in • cui esse realizzano una data architettura. • L’organizzazione di un calcolatore è tendenzialmente non visibile al • programmatore. Di essa fanno parte aspetti quali: • la tecnologia impiegata • la struttura interna di certi moduli funzionali • la frequenza di clock • il modo in cui viene eseguita una data istruzione • il modo in cui vengono trasferiti i dati da una unità funzionale all’altra
Perché distinguere i due concetti? Mantenendo la stessa architettura si può passare da un modello di calcolatore meno potente a uno più potente mantenendo inalterato il software (sia quello di sistema che quello applicativo). La compatibilità architetturale è stata una delle chiavi del successo dei sistemi Intel. Con il microprocessore 8086, introdotto nel 1978, è stata definita un’architettura (x86) che, seppure con aggiunte e miglioramenti, è arrivata ai giorni nostri e a quella che oggi viene chiamata IA32. Lungo questo percorso sono state impiegate nuove tecnologie microelettroniche e nuove strategie organizzative, ma è stata mantenuta la compatibilità (programmi eseguibili su un 8086 sono eseguibili anche su un Pentium 4).
Modelli architetturali • Un sistema di elaborazione, in generale, è una macchina che accetta in ingresso informazioni codificate in forma digitale, le elabora e produce informazioni in uscita. • I blocchi funzionali che lo compongono sono: • CPU (central processing unit - in italiano processore) • memoria • sistema di ingresso/uscita • Un computer, rispetto a una macchina calcolatrice convenzionale, ha in più il concetto di programma memorizzato. • Dati e istruzioni nella stessa memoria: modello di Von Neumann. • Dati e istruzioni in memorie separate: modello Harvard.
Modello di Von Neumann • Lo schema si basa su cinque componenti fondamentali: • CPU, che si divide a sua volta in • Unità operativa, nella quale uno dei sottosistemi più rilevanti è l'ALU (Arithmetic Logic Unit) • Unità di controllo • Unità dimemoria, intesa come memoria principale (la RAM) che contiene sia i dati da elaborare che le istruzioni da eseguire (programma) • Unità di input, tramite la quale i dati • vengono inseriti nel calcolatore per • essere elaborati • Unità di output, necessaria affinché • i dati elaborati possano essere restituiti • all'operatore • Bus, un canale che collega tutti i • componenti fra loro
CPU2 CPU1 Bus host Bus AGP Slot PCI Bus PCI South bridge North bridge Memoria principale EIDE Slot ISA USB Bios Bus ISA Schema architetturale di un PC moderno
CPU La figura rappresenta lo schema più semplice di CPU, a livello RTL, secondo il modello di Von Neumann. Vi sono 5 registri principali: DR, AR, PC, IR, ACC. Vi è anche una ALU che esegue le operazioni aritmetico-logiche.
CPU DR (Data Register) - Memorizza i dati provenienti e diretti alla memoria. AR (Address Register) - Memorizza gli indirizzi da comunicare alla memoria. PC (Program Counter o Contatore di Programma) - Memorizza l'indirizzo della istruzione da eseguire. IR (Instruction Register) - Memorizza il codice dell'istruzione da eseguire. ACC (Accumulator) – Immagazzina dati in ingresso e in uscita dalla ALU.
Ciclo base • Per una qualsiasi istruzione: • FETCH: Lettura dell'istruzione in memoria. • ESECUZIONE: Lettura dei dati necessari. • Svolgimento dell'operazione. • La fase di FETCH consente l'acquisizione della nuova istruzione. • La fase di ESECUZIONE consente lo svolgimento della operazione. • La fase di FETCH è eguale per tutte le istruzioni che ovviamente si differenziano nella fase di ESECUZIONE. • Al termine della fase di ESECUZIONE viene eseguita la fase di FETCH della istruzione successiva.
Ciclo base Ogni istruzione contiene in modo esplicito o implicito l’indicazione dell’istruzione successiva. Modo esplicito: il codice dell’istruzione contiene l’indirizzo della cella di memoria dove è contenuta l’istruzione successiva. Modo implicito: l’indirizzo della istruzione successiva è contenuto in un registro interno alla CPU. La sequenza delle istruzioni è definita dal programma.
Ciclo base Con riferimento alla figura, la fase di FETCH consiste nelle seguenti operazioni di trasferimento dati tra registri: AR PC DR M(AR) ; lettura in memoria dell’istruzione IR DR ; codice di istruzione all’unità di controllo Prima di iniziare la fase di esecuzione, si aggiorna il PC con l’indirizzo dell’istruzione successiva. Attenzione! l’istruzione successiva non è per forza nella successiva cella di memoria (vedi salti e chiamate a sottoprogrammi).
Lo stack Lo stack (pila) è una struttura dati gestita secondo una politica LIFO (last in – first out). La possibilità di gestire uno stack in memoria è comune a molte architetture. In tal caso il repertorio delle istruzioni prevede le operazioni PUSH – inserimento di un dato nello stack POP – prelievo di un dato dallo stack
Lo stack • Per la gestione dello stack servono due registri: • BP (Base Pointer) – punta entro lo stack come se si trattasse di una normale area di memoria • Es. LOAD R,[BP+8] carica in R il contenuto della cella dello stack • il cui indirizzo è dato dalla somma del • contenuto di BP con 8 • SP (Stack Pointer) – punta sempre alla testa dello stack e viene aggiornato ad ogni esecuzione di una operazione PUSH o POP; non può essere impiegato come indicato sopra per BP
Lo stack Lo stack viene utilizzato per: - salvare temporaneamente il contenuto dei registri prima dell’esecuzione di un sottoprogramma (procedura) - depositare i parametri passati a un sottoprogramma Es. una istruzione di alto livello del tipo y = f(x1, x2, …, xn); viene tradotta dal compilatore in una sequenza di PUSH dei parametri, a partire dall’ultimo, seguita dall’istruzione di chiamata a f; il valore y viene reso attraverso un registro predefinito (sempre lo stesso, per una data architettura). Per accedere ai parametri nello stack, il sottoprogramma usa il BP.
Interruzioni • Eventi infrequenti ed eccezionali. • Generati internamente o esternamente. • Causano il trasferimento del controllo dal programma corrente a un programma specifico di servizio dell'evento. • Classificazione: • Interruzioni esterne (external interrupt o device interrupt): in genere usate per gestire le operazioni di I/O, si verificano in modo asincrono rispetto all’esecuzione del programma. • Eccezioni (exception conditions): causate da situazioni anomale rilevate durante l’esecuzione del programma, si verificano in modo sincrono; esempio: divisione per zero. • Trappole (traps): generate da apposite istruzioni presenti nel programma (es. istruzione INT del processore 8086), si verificano in modo sincrono e sono predicibili – in pratica sono particolari operazioni di salto.
Interruzioni • La presenza di un interrupt è segnalata alla CPU da una linea proveniente dall'esterno (o da un segnale interno). • Il segnale è testato dalla CPU alla fine di ogni ciclo di istruzione. • La CPU risponde trasferendo il controllo a un altro programma.
Interruzioni • Ancora sulle azioni della CPU in risposta alla richiesta di interruzione: • Lo stato complessivo della CPU viene memorizzato nello stack a cura del programma di gestione. • Nel PC viene immagazzinato l'indirizzo del sottoprogramma di gestione. • L'esecuzione del sottoprogramma continua fino all'istruzione di RETURN che riporta il controllo al programma interrotto.
0 31 OP Indirizzo R La codifica delle istruzioni a basso livello Un possibile formato per la codifica di istruzioni su parole di 32 bit: Es. LOAD R,Var LOAD è il codice mnemonico per l’operazione di trasferimento dati dalla memoria. R è il registro destinazione. Var è il nome simbolico di una posizione di memoria (indirizzo). Quindi l’istruzione equivale all’istruzione RTL R M[Var]
0 31 OP Rb Ra Rc La codifica delle istruzioni a basso livello Un altro possibile formato per la codifica di istruzioni su parole di 32 bit: Es. ADD R1,R2,R3 ADD è il codice mnemonico per l’operazione di somma. R1 è il registro destinazione. R2 e R3 sono i registri che contengono gli addendi. Quindi l’istruzione equivale all’istruzione RTL R1 R2+R3
Unità di controllo Le connessioni non sono attive tutte contemporaneamente. L’unità di controllo seleziona i cammini che risultano attivi in un determinato istante.
Caratteristiche di un set di istruzioni • COMPLETEZZA: • Deve essere possibile valutare qualunque funzione che sia calcolabile con una disponibilità ragionevole di memoria. • EFFICIENZA: • Istruzioni usate frequentemente devono essere eseguite rapidamente. • Il controllo sull'efficienza deve essere misurato sul codice generato da compilatori. • Fornire primitive, non soluzioni.
Caratteristiche di un set di istruzioni • REGOLARITA’: • Le istruzioni devono comportarsi in modo omogeneo rispetto ai modi di indirizzamento. • Quando ogni istruzione consente tutti i modi di indirizzamento possibili su tutti gli operandi: ORTOGONALITA' • COMPATIBILITA’: • Compatibilità sorgente: sono compatibili i codici mnemonici del linguaggio assembler. • Compatibilità binaria: sono compatibili i codici macchina. • Il codice macchina deve essere eseguibile su processori successivi della stessa famiglia. • 8080 8086 80186 ... Pentium ... • PDP11 VAX
Tipi di istruzioni TRASFERIMENTO DATI MOVE Trasferisce dati tra registri LOAD Trasf. dati dalla memoria STORE Trasf. dati alla memoria EXCHANGE Scambia dati SET/RESET Pone ad 1/0 PUSH/POP Gestione stack OPERAZIONI ARITMETICHE ADD/SUB Somma/differenza MULT/DIV Moltiplicazione/divisione ABS Valore assoluto NEG Cambio segno INC/DEC Incrementa/decrementa
Tipi di istruzioni OPERAZIONI LOGICHE AND OR NOT XOR OPERAZIONI PER LA MANIPOLAZIONE DEI BIT SHIFT traslazione ROTATE rotazione CONTROLLO DEL FLUSSO JUMP salto incondizionato JUMP COND salto condizionato CALL (COND) salto a sottoprogramma RET (COND) uscita da sottoprogramma
Tipi di istruzioni CONTROLLO CPU HALT blocco operazioni WAIT/HOLD blocco operazioni con ripresa condizionata NOP non svolge operazioni INGRESSO E USCITA INPUT (READ) trasferimento dati da I/O verso memoria o registro OUTPUT (WRITE) trasferimento dati verso porta di I/O
Repertorio stile CISC • CISC = Complex Instruction Set Computers • Criteri di progettazione: • le istruzioni non hanno dimensione fissa • il campo del codice di operazione può occupare più o meno bit • numero ampio di formati: il codice di operazione non identifica univocamente il formato delle istruzioni, e da un formato all’altro i campi che identificano uguali entità possono occupare differenti posizioni • Esempi di processori CISC: • Intel x86, Zylog Z80, Motorola 68000 • Il mondo dei PC desktop e laptop è dominato dalla famiglia Intel x86 che continua ad adottare lo stile CISC per mantenere la compatibilità con le applicazioni.
Repertorio stile RISC • RISC = Reduced Instruction Set Computers • Criteri di progettazione: • le istruzioni hanno tutte la stessa dimensione (es. 32 bit) • il campo del codice di operazione occupa uno spazio predefinito • numero molto limitato di formati: il codice di operazione identifica univocamente il formato dell’istruzione, e nel passare da un formato all’altro i campi che identificano uguali entità occupano sempre la stessa posizione • Esempi di processori RISC: • IBM PowerPC, Intel i880 e i960, AMD 29000, Sun SPARC • Utilizzati per: telefoni cellulari, palmari, automobili, console. • Inoltre i processori RISC, dagli anni 90, sono i dominatori incontrastati dei server ad alte prestazioni.
CISC o RISC? Prima degli anni 80 si riteneva che repertori estesi di istruzioni fossero preferibili, per facilitare la costruzione di compilatori. L’uso efficiente della memoria centrale (allora costosa e poco performante) era il primo obiettivo di qualunque soluzione architettonica. Repertorio esteso significa programmi più corti che occupano meno memoria ma che richiedono una unità di controllo più complessa. La memoria di controllo era più veloce di quella centrale, per cui portare funzionalità nella prima avrebbe comunque migliorato le prestazioni della macchina. Con l’avvento delle memorie a semiconduttore (che rimpiazzarono quelle a nuclei magnetici) e delle memorie cache, e la constatazione che l’80% delle istruzioni eseguite corrisponde al solo 20% del repertorio esteso, presero piede i microprocessori RISC.
Storia dei microprocessori Il termine microprocessore venne usato per la prima volta da Intel nel 1971, quando introdusse un computer microprogrammabile su un unico chip, la CPU Intel 4004 era completa di: - sommatore parallelo a 4 bit - 16 registri a 4 bit - un accumulatore - uno stack Frequenza massima di clock: 740KHz. Con l’aggiunta di memorie di tipo RAM e ROM, la CPU 4004 costituiva il sistema MCS-4. Realizzata con la stessa tecnologia, nel 1972 uscì la CPU Intel 8008, la prima in grado di operare a 8 bit. Frequenza massim di clock: 800KHz.
Storia dei microprocessori I microprocessori a 8 bit sono detti di prima generazione. La grande diffusione di questi dispositivi inizio nel 1974, con l’introduzione della CPU Intel 8080, con frequenza di clock massima di 2MHz. I concorrenti erano il Motorola MC6800 (prodotto a basso costo perchè fu il primo ad avere alimentazione singola), e lo Zilog Z80 (che incorporava il repertorio di istruzioni dell’8080 e quindi aveva piena compatibilità con i programmi scritti per quella CPU).
Storia dei microprocessori Fu l’Intel 8086, messo sul mercato nel giugno 1978, a inaugurare la seconda generazione di microprocessori, capaci di operare su 16 bit alla volta. L’8086 indirizzava 1MB di memoria e lavorava alla frequenza di 5MHz, per una capacità media elaborativa di 0,33 MIPS (milioni di istruzioni per secondo). L’8086 definì le basi dell’architetturax86. L’Intel 8088 (un 8086 con bus esterno a 8 bit) venne adottato a IBM per costruire il suo PC (Personal Computer), che ebbe un successo enorme anche grazie al software Microsoft.
Storia dei microprocessori Il principale concorrente dei processori Intel 8086/88 era il Motorola MC68000. Pur avendo caratteristiche leggermente superiori all’8086, il ritardo di due anni con cui il 68000 arrivò sul mercato pregiudicò la loro affermazione. Il 68000 ebbe comunque ottima accoglienza nel mercato delle cosiddette workstation, per i quali il sistema operativo Unix era la norma. Sun Microsystems e HP (i più accreditati costruttori di workstation) per anni adottarono il 68000. Il declino del 68000 iniziò con con l’ingresso delle architetture RISC nel mercato delle workstation. Sun, in particolare, abbandonò Motorola e sviluppò una propria architettura (SPARC).
Storia dei microprocessori A un certo punto, le CPU a 16 bit entrarono in una fase di grande crescita, e apparvero componenti di corredo avanzati come gestori di memoria (MMU), unità aritmetiche in virgola mobile (FPU), controllori di accesso alla memoria (DMA). 1984: MC68020 1985: Intel 80386 1987: MC68030 1989: MC68040 1990: Intel 80486 Dal 1991: PowerPC di IBM, Apple e Motorola (AIM) Dal 1993: Intel Pentium e compatibili (es. AMD) www.intel.com/pressroom/kits/quickreffam.htm
La legge di Moore Nel 1965 Gordon Moore (che con Robert Noyce e Andy Groove fonderà Intel nel 1968) in un articolo sulla rivista Electronics ipotizzò che l’aumento della capacità elaborativa (intesa come numero di transistori nel singolo chip) sarebbe continuato, per tutti gli anni ’70, al ritmo di un raddoppio ogni 12 mesi. Nel 1975 Moore fece una prima correzione: raddoppio ogni 2 anni. A fine anni ’80 si corresse ancora e diede la stima che tutt’oggi è il metro di misura e l’obiettivo per le aziende che operano nel settore: raddoppio ogni 18 mesi.
Memoria Parametri di valutazione: Dimensione (nel senso di capacità)– data in bit o byte; spesso la dimensione viene riportata in modo da descrivere l’organizzazione interna. es. 64K x 8 bit indica una memoria di 65536 celle di 8 bit ciascuna. Velocità– indicata come tempo di accesso (intervallo di tempo tra la richiesta del dato e il momento in cui viene reso disponibile). Potenza – questo parametro indica la potenza media assorbita. Costo– il parametro più aleatorio, dipende anche dal volume di acquisto. Integrazione– maggiore l’integrazione, minore l’ingombro e il consumo e i costi di assemblaggio delle parti, dell’alimentazione e dello smaltimento del calore. Idealmente un calcolatore dovrebbe avere quanta più memoria possibile, ad alta velocità, basso consumo, basso ingombro e minimo costo.
ns Tempo di accesso memoria 200 100 Tempo di ciclo CPU 1980 1990 2000 Memoria La tecnologia consente di realizzare CPU sempre più veloci. Nel 2006 sono stati messi sul mercato processori con frequenza di clock superiore ai 3GHz. Purtroppo le memorie non sono così veloci, cioè non hanno tempi di accesso paragonabili al periodo di clock delle CPU attuali. Le prestazioni delle CPU non devono essere troppo negativamente influenzate dal tempo di accesso alle memorie. In aiuto al progettista viene la proprietà di località spaziale e temporale esibita dai programmi.
se al tempo t si accede all'indirizzo X è "molto probabile" che l'indirizzo X+X sia richiesto fra t e t+ t. Principio di località La modalità di accesso ai dati è in genere prevedibile, cioè vale il principio per cui Questo significa che nel breve periodo gli indirizzi generati da un programma sono confinati in regioni limitate. La distribuzione degli accessi alla memoria in un dato intervallo può essere misurato direttamente su un sistema.