ARCHITETTURA DI UN CALCOLATORE In questo capitolo si prendono in esame i componenti fondamentali di un calcolatore. Si possono individuare tre strutture principali (v. fig. 1) collegate fra loro. Fig. 1 La CPU (Central Processing Unit, in italiano normalmente detta Unità Centrale) ha un ruolo sia di controllo che di elaborazione. Nei calcolatori più recenti in pratica è identificabile con un singolo circuito, il microprocessore. Più in generale, è quell'insieme di circuiti dedicati all'esecuzione delle operazioni elementari sui dati ed al controllo dell'intero sistema. La memoria centrale è un insieme di celle ciascuna delle quali contiene 1 byte ed è individuata da un indirizzo. In queste celle vengono memorizzate le sequenze binarie che rappresentano i dati durante il funzionamento del calcolatore. Il bus è l'insieme dei molti collegamenti elettrici (fisicamente è un insieme di piste di un circuito stampato) che consente di collegare le varie parti del calcolatore fra di loro per scambiarsi dati e segnali di controllo. I cosiddetti dispositivi di input/output sono dispositivi che consentono l'acquisizione dei dati da parte del calcolatore (input), la loro archiviazione e la loro presentazione verso il mondo esterno (output). Una classificazione schematica dei dispositivi di input/output è la seguente: Fig. 2 MEMORIE DI MASSA STAMPANTI TAMBURI MAGNETICI DISCHI MAGNETICI DISCHI OTTICI NASTRI MAGNETICI SCHEDE A MARGHERITA AD AGHI TERMICHE A GETTO DI INCHIOSTRO LASER TERMINALI PLOTTER TASTIERA MONITOR ALFANUMERICI MONITOR GRAFICI A RULLO XY 1) Memorie di massa - possono essere: a) tamburi magnetici (ormai in disuso), b) dischi, sia magnetici che ottici, c) nastri magnetici, d) schede perforate, dispositivo che è ormai del tutto obsoleto. A loro volta i dischi, magnetici o ottici che siano, possono essere suddivisi in dischi fissi o asportabili. 2) Terminali, composti di solito da una tastiera e da un monitor, che può essere di tipo alfanumerico (cioè può rappresentare solo caratteri dell'alfabeto o numeri o alcuni simboli grafici predeterminati) o di tipo grafico in cui ogni punto sul video (pixel, da picture element) è controllabile singolarmente. Quindi, con un terminale grafico, si possono visualizzare grafici ed immagini, nel limiti della risoluzione del dispositivo, cioè del numero di pixel che si hanno a disposizione per formare l'immagine. Un terminale di tipo grafico può, ovviamente, visualizzare anche caratteri alfanumerici. 3) Stampanti: possono essere a) a margherita, b) ad aghi, c) laser, d) a getto di inchiostro, e) termiche o, in generale, chimiche. 4) Plotter , che possono essere a rullo o di tipo x-y. CPU La CPU può essere considerata il vero e proprio cuore del sistema: La struttura della CPU è la seguente (Vedi fig. 3) CLOCK Fig.3 Un segnale, detto segnale di clock, costituito da un impulso che si ripete per milioni di volte ogni secondo, viene inviato in ingresso alla CPU e serve per sincronizzare tutti gli eventi che avvengono al suo interno. La CPU è quindi un dispositivo sincrono, in quanto ogni cambiamento al suo interno avviene soltanto ogni volta che riceve un impulso di clock. In pratica, ogni volta che viene inviato un impulso alla CPU, questa esegue una operazione. All'interno della CPU si trova una Unità di Controllo, una Unità Logico-Aritmetica, chiamata di solito ULA in italiano (ALU in inglese) e un insieme di registri che servono alla CPU per contenere al suo interno i dati da cui dipendono i risultati delle operazioni che esegue: la CPU, infatti, non può operare direttamente sulla memoria ma ha bisogno di trasferire i dati all'interno dei registri, prima di poterli elaborare. Alcuni registri possono essere riservati ad usi specifici; ad esempio contenere gli operandi, nel caso in cui si debba eseguire una operazione matematica, contenere l'indirizzo, all'interno della memoria, della prossima operazione da eseguire (registro Program Counter), oppure i bit di overflow e di carry (riporto) quando si esegue una operazione, ecc. La CPU è in contatto con la memoria centrale tramite un bus, suddivisibile in bus dati, bus indirizzi e bus di controllo, a seconda dei segnali che vengono trasmessi sulle piste corrispondenti. Ogni CPU dispone di un proprio linguaggio macchina, ovvero di una propria codifica, mediante stringhe binarie, delle operazioni che può compiere; tali sequenze binarie sono chiamate istruzioni. A ciascuna istruzione è associata un'operazione che può essere eseguita dalla CPU. Da questo punto di vista la CPU può essere schematizzata nel modo seguente (Fig. 4): Fig. 4 Il contenuto dei registri che si trovano all'interno della CPU definisce lo "stato" in cui si trova la CPU. Dalla combinazione fra la sequenza binaria (istruzione) in ingresso e lo stato in cui si trova la CPU si ottiene un risultato (output) che è sempre lo stesso a parità di sequenza binaria e stato; in pratica la CPU associa ad una lunga sequenza binaria formata dall’input e dallo stato una nuova sequenza binaria (output) che dovrà essere opportunamente interpretata. Questa sequenza è il risultato dell'istruzione che abbiamo inviato in ingresso. L'esecuzione di una istruzione, oltre a generare il risultato, modifica anche il contenuto dei registri, quindi lo stato della CPU. Per fare un esempio estremamente banale, se abbiamo a che fare con una macchina da scrivere, fornire un'istruzione alla CPU può corrispondere alla pressione di un tasto, mentre lo stato può corrispondere alla condizione in cui si trova il tasto di shift; quando, ad esempio, si preme il tasto "A" nella macchina da scrivere, se il tasto di shift è premuto si ottiene una A maiuscola, se non è premuto si ottiene una a minuscola. Per risolvere qualunque problema, bastano tre tipi di istruzione: l'istruzione di somma (abbiamo visto che con la somma si può effettuare anche la sottrazione e, in modo analogo, si possono operare anche una moltiplicazione o una divisione), operazioni di accesso alla memoria (cioè ad es. la possibilità di spostare un dato da una posizione all'altra all'interno della memoria oppure di leggere un dato e di inserirlo in uno dei registri, oppure di trasferirlo da uno dei registri all'interno della memoria), e operazioni di confronto fra numeri. Riguardo a queste ultime, può bastare anche il solo confronto con lo zero: se, infatti, si devono confrontare due numeri per vedere se uno è maggiore dell'altro, ciò equivale a calcolarne la differenza e vedere se questa è maggiore, minore o uguale a zero. Se è uguale a zero i due numeri sono uguali, se è maggiore di zero il primo numero è maggiore del secondo e viceversa. L'Unità Logico-Aritmetica serve ad eseguire le operazioni di confronto fra dati e i calcoli, cioè le operazioni logiche e le operazioni aritmetiche. I registri possono avere diverse funzioni a seconda del loro contenuto: possono contenere dati, ma anche indirizzi di locazioni di memoria. Ad es. quando si esegue un programma, il cosiddetto Program Counter è un registro particolare che contiene l'indirizzo della prossima istruzione che la CPU deve eseguire. La CPU, in pratica, legge nel Program Counter un indirizzo che identifica una certa locazione di memoria, va a vedere che istruzione è contenuta in quella locazione e la esegue. I registri possono, inoltre, contenere codici di controllo; uno di questi, ad esempio, è il bit di overflow che, come detto, segnala quando in un'operazione si va oltre la capacità di rappresentazione della macchina. Quando questi codici di controllo sono rappresentati da un singolo bit vengono normalmente chiamati ''flag", cioè “bandierina”. Infatti hanno un ruolo analogo a quello del guardalinee in una partita di calcio: se il bit è attivato (cioè il suo valore è 1), questo indica che si è verificata una certa condizione, ed equivale al sollevamento della bandierina da parte del guardalinee. La supervisione di tutte queste operazioni è compito dell'unità di controllo. Con una velocità proporzionale alla frequenza con cui arrivano gli impulsi di clock, l'unità di controllo interpreta le singole istruzioni attivando opportunamente le varie componenti della CPU, in modo da produrre in uscita il risultato. Il bus, pur essendo, dal punto di vista logico, un'entità unica, in realtà è un insieme di collegamenti fisici suddivisibili in un certo numero di piste che consentono il trasferimento dei dati dalla memoria centrale alla CPU e viceversa (bus dati), un certo numero di piste per trasmettere gli indirizzi (bus indirizzi) e una serie di collegamenti (bus di controllo) che consentono di trasmettere i segnali di controllo che regolano il collegamento fra CPU, memoria e dispositivi di Input/Output. Ad esempio, una linea è riservata ad un segnale che indica se sulla memoria va eseguita un'operazione di lettura (cioè un trasferimento dalla memoria verso la CPU o verso un dispositivo di input/output) oppure un'operazione di scrittura (cioè un trasferimento dalla CPU o da un dispositivo di input/output verso la memoria). Vediamo quali sono i principali parametri che caratterizzano le prestazioni della CPU (fig. 5). PARAMETRI CARATTERISTICI DI UNA CPU (MicroProcessore) 1) LUNGHEZZA DELLE PAROLE BINARIE CHE E' IN GRADO DI ELABORARE, ESPRESSA IN NUMERO DI BIT (8, 16, 32, 64) 2a) LUNGHEZZA DELLE PAROLE BINARIE CHE E' IN GRADO Di RICEVERE DALL'ESTERNO O DI INVIARE VERSO L'ESTERNO CON UN'UNICA OPERAZIONE (8, 16, 32, 64) 2b)CAPACITA' DI INDIRIZZAMENTO (Mb, Gb) 3) TIPO DI ARCHITETTURA UTILIZZATA: CISC (Complex Instruction Set Computer) RISC (Reduced Instruction Set Computer) 4) FREQUENZA DI CLOCK. espressa in Megacicli/secondo = Megahertz (MHz) 5) MILIONI DI ISTRUZIONI AL SECONDO (MIPS) (centinaia o migliaia) MILIONI DI OPERAZIONI IN VIRGOLA MOBILE AL SECONDO (MFLOPS, decine o centinaia) MFLOPS <= MIPS <= FREQ. DI CLOCK Fig. 5 Il primo è la lunghezza della parola che la CPU è in grado di elaborare. Questa lunghezza è espressa in numero di bit (normalmente sono 8, 16, 32 o 64 bit). Alla lunghezza della parola si fa riferimento spesso come architettura interna della CPU. Cioè se una CPU ha una architettura interna a 8, 16, 32, 64 bit, questo significa che è in grado, internamente, di compiere operazioni su stringhe binarie di tale lunghezza. Analogamente all'architettura interna, si può definire una architettura esterna, caratterizzata dalla lunghezza delle parole che la CPU può trasferire, con una singola operazione, verso l'esterno: questo parametro si può identificare con la dimensione del bus dei dati. La distinzione fra architettura interna ed esterna è importante in quanto vengono talvolta utilizzati, per motivi di economia, microprocessori con architetture interne, ad es., a 32 o 64 bit che, per poter essere inseriti in calcolatori più economici, hanno un bus esterno caratterizzato da un numero di bit inferiore. Internamente, quindi, un microprocessore di questo tipo può trattare dati di 32 (64) bit; tuttavia, disponendo, ad es., di un bus a 16 bit, deve eseguire in due (quattro) tempi ogni operazione di lettura e di scrittura. Da un lato, ciò provoca un rallentamento delle operazioni di input/output, dall'altro i circuiti esterni collegati a questo microprocessore sono molto più economici, perché sono costituiti da un minor numero di componenti o, in ogni caso, da componenti più semplici. Per quello che riguarda il tipo di istruzioni che è in grado di eseguire un microprocessore, si possono avere due tipi di architetture: Architettura CISC o RISC: CISC significa Complex Instruction Set Computer, RISC significa Reduced Instruction Set Computer. L'architettura CISC caratterizza microprocessori che sono in grado di eseguire istruzioni molto complesse, per eseguire le quali sono spesso necessari molti cicli di clock; questo tipo di microprocessori contiene di solito un numero piuttosto limitato di registri. Nel caso dell'architettura RISC si ha la situazione opposta: si dispone di un numero molto basso di operazioni molto elementari, avendo però a disposizione un numero molto elevato di registri: questo fa sì che si possa ottenere un elevatissima velocità di elaborazione, in quanto gran parte delle operazioni possono essere eseguite in pochi cicli di clock, se non addirittura in uno solo. Questo vale in particolar modo per le operazioni matematiche. Un'altra caratteristica fondamentale della CPU è la frequenza di clock alla quale può operare. Come abbiamo visto ogni istruzione corrisponde ad una sequenza di operazioni eseguite dalla CPU in corrispondenza di ogni impulso di clock; quindi, maggiore è il numero di impulsi di clock che la CPU riceve in un secondo, maggiore è il numero delle operazioni che la CPU è in grado di svolgere nell'unità di tempo. Normalmente è espressa in MHz (Megahertz) o Megacicli al secondo. Il primo personal computer (PC) IBM aveva una frequenza di clock di 4,77 MHZ: attualmente i computer a 32 bit basati su Intel Pentium o su processori della stessa classe (es. AMD Athlon e Duron) arrivano ad un massimo di 1.6 GHz, cioè di quasi 1000 volte superiore. A ciò si aggiunge una migliore ingegnerizzazione dei microprocessori, che comporta che una stessa istruzione possa essere eseguita in un minor numero di cicli di clock. In questo modo si è ottenuto un incremento di prestazioni di alcune centinaia di volte rispetto al PC originale, in meno di 20 anni, cioè si è raddoppiata la potenza di calcolo mediamente ogni 18 mesi (legge di Moore)! Per tornare ai parametri che determinano la velocità della CPU abbiamo alcune misure che vengono fornite in genere insieme alla macchina, e precisamente i MIPS, cioè milioni di istruzioni per secondo, e i MFLOPS (Megaflops), che significa milioni di operazioni in virgola mobile per secondo. Come abbiamo visto un'operazione in virgola mobile è molto più complessa di un'operazione fra interi e richiede quindi un maggior numero di cicli di clock, perciò il dato relativo ai MFLOPS è generalmente molto minore di quello dei MIPS che, a sua volta, è inferiore alla frequenza di clock. In realtà, nei microprocessori più recenti, alcune operazioni possono essere effettuate in parallelo, durante lo stesso ciclo di clock, per cui può succedere che MIPS > frequenza di clock. Quando si confrontano i MIPS di due CPU diverse bisogna anche tenere in considerazione l'architettura del microprocessore; abbiamo detto infatti che l'architettura RISC può eseguire una varietà minore di istruzioni più elementari, quindi un'istruzione di un computer con architettura CISC può corrispondere, a livello operativo, a più istruzioni di un computer RISC. A parità di MIPS, è quindi più potente un microprocessore CISC; d'altra parte, a parità di frequenza di clock, un microprocessore RISC esibirà un dato in MIPS generalmente superiore ad un CISC, rendendo molto delicato (se non impossibile) un confronto basato su questo solo dato. MEMORIA CENTRALE Esaminiamo ora la memoria centrale. Essa è lo spazio di lavoro del calcolatore, in cui si collocano i dati da elaborare. E' caratterizzata da un insieme di celle ciascuna delle quali contiene 8 bit (1 byte) ed è caratterizzata da un proprio indirizzo, cioè da un numero che la identifica in modo univoco. Ovviamente, a seconda della dimensione del Registro Indirizzi utilizzato dal microprocessore, questo sarà in grado di indirizzare più o meno memoria. Ad es., con 16 bit si possono generare 65536 (216) numeri diversi: i primi microprocessori avevano uno spazio di indirizzamento di questo tipo, cioè potevano indirizzare (e quindi raggiungere in una singola operazione) 65536 locazioni di memoria di 1 byte ciascuna, cioè 64 Kbyte. Un microprocessore con un registro indirizzi di 32 bit (come il Pentium) invece può indirizzare 4GByte (2 32 byte) di memoria. In realtà il Pentium ha un ulteriore registro che contiene altri 16 bit che permette di indirizzare 65536 blocchi (detti anche segmenti) di 4Gbyte. Questo registro a 16 bit individua quindi il segmento di memoria entro cui opera il processore ed il registro indirizzi a 32 bit serve quindi a identificare la singola cella all’interno del segmento su cui si sta lavorando. Per gli attuali PC 4Gbyte di memoria sono di solito più che sufficienti, quindi in realtà il PC lavora sempre all’interno dello stesso segmento. Il tipo di memoria centrale utilizzata nella grandissima maggioranza dei casi nei calcolatori (fanno eccezione alcuni dispositivi palmari o tascabili) è la memoria di tipo RAM (Random Access Memory), cioè Memoria ad Accesso Casuale. Questo significa che si può accedere direttamente a qualunque locazione della memoria, indipendentemente dalla sua posizione; ogni dato è quindi raggiungibile con la stessa velocità. In pratica tutti i tipi di memoria oggi esistenti sono Random Access Memory, e il termine RAM è rimasto ad indicare un tipo di memoria che conserva i dati finché le viene fornita tensione: è quindi un tipo di memoria "volatile", cioè al momento dello spegnimento del calcolatore i dati vengono persi. Ci sono tre operazioni principali che si possono fare in memoria: la lettura, la scrittura e lo spostamento. La lettura implica che si invii alla memoria un indirizzo e si vada a prelevare il dato contenuto nella cella di memoria corrispondente a tale indirizzo. Con una operazione di scrittura, una volta generato l'indirizzo, si va a modificare il contenuto della cella ad esso corrispondente; con lo spostamento, infine, viene trasferito il contenuto di una cella di memoria in un'altra cella. Si può dire che in pratica le operazioni possibili sulla memoria sono le prime due in quanto lo spostamento consiste in una operazione di lettura di un dato da una cella seguita da una operazione di scrittura dello stesso dato in un'altra cella. Nella memoria centrale si memorizzano sia i dati che le istruzioni che costituiscono i programmi; questi di solito vengono collocati in una zona della memoria ben distinta da quella riservata ai dati. I meccanismi che vengono normalmente utilizzati nei calcolatori sono di tipo sequenziale, quindi il calcolatore esegue un'istruzione dopo l'altra e si rivela quindi molto pratico che le istruzioni vengano memorizzate sequenzialmente nello stesso ordine in cui poi andranno normalmente eseguite. L'operazione di lettura dalla memoria centrale può essere scomposta in tre fasi: (0) una fase preliminare, in cui viene attivata la linea di controllo del bus relativa alla lettura: quasi contemporaneamente (1) la CPU pone l'indirizzo della cella di memoria che si vuole leggere sul Bus Indirizzi. A questo punto, dopo un tempo brevissimo, detto tempo di accesso, si dispone (2) del dato richiesto sul Bus Dati. Il tempo di accesso è un tempo dovuto alla commutazione dei circuiti elettrici che costituiscono la memoria, e corrisponde al ritardo esistente fra il momento in cui viene generato l'indirizzo e il momento in cui sul bus compare il dato. Il tempo di accesso è di solito molto breve ed è pari a qualche decina di nanosecondi (un nanosecondo corrisponde a 10-9 s, cioè 1 miliardesimo di secondo). Nella scrittura l'unica diversità è che nella fase (0) anziché attivare la linea di controllo relativa alla lettura si attiva la linea di controllo relativa alla scrittura; successivamente la CPU pone contemporaneamente sul Bus Indirizzi l'indirizzo a cui si vuole scrivere e sul Bus Dati la parola che deve essere trasferita, ottenendo quindi un trasferimento di dati in senso opposto rispetto alla lettura. Vediamo quali sono i parametri caratteristici della memoria centrale: la prima caratteristica fondamentale è la dimensione, espressa di solito in MByte, cioè il numero di celle (di 1 byte) disponibili all'interno della memoria. La seconda caratteristica è il tempo di accesso, che abbiamo appena definito. I Personal Computer vengono tipicamente forniti con 128 o più MByte di RAM. Abbiamo detto che la memoria centrale è normalmente una memoria di tipo RAM. Vediamo gli altri tipi di memoria. La memoria ROM (Read Only Memory, cioè memoria per sola lettura), viene scritta al momento della sua produzione e contiene dati che non possono essere più modificati, e che quindi possono solo essere letti. Quando si accende il calcolatore, nella memoria centrale non c'è niente, in quanto la RAM ha bisogno di tensione per conservare i dati. Pertanto, deve esistere all'interno del calcolatore una porzione di programma che consente di "Inizializzare" il calcolatore in modo che possa cominciare ad operare sulla memoria centrale (RAM), come poi avviene durante il normale uso. Normalmente questa parte di programma, attivata solo al momento dell'accensione, è memorizzata su una memoria ROM, che nel PC si chiama BIOS (Basic Input/Output System). Infatti la memoria ROM è in grado di conservare i dati in essa memorizzati anche a calcolatore spento. Il nome BIOS deriva dal fatto che i programmi in esso contenuti devono permettere al calcolatore di eseguire anche operazioni elementari di input/output, in quanto il calcolatore dovrà poter caricare in memoria (fase di boot o di caricamento) il sistema operativo e tutti i dati che poi serviranno a controllarne il funzionamento. Analoghe alle ROM sono le PROM (Programmable ROM), memorie che al momento della fabbricazione non contengono alcun dato, e possono essere programmate in seguito tramite opportuni dispositivi; cioè vi si possono memorizzare dati che diventano inalterabili, vi si può quindi scrivere una sola volta. Per ovviare a questo problema sono state create le EPROM (Erasable PROM), cioè PROM cancellabili tramite l'applicazione di un fascio di raggi ultravioletti. Tutte queste memorie hanno la caratteristica di mantenere le proprie informazioni (le ROM e le PROM in modo del tutto permanente, le EPROM a meno che non siano sottoposte a raggi ultravioletti) senza bisogno di essere alimentate.