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.