Per elaboratore si intende un sistema in grado di compiere una qualche forma di elaborazione, ricevendo in ingresso (input) le “informazioni” da elaborare e restituendo in uscita (output) le “informazioni” relative al risultato dell’elaborazione. Per esempio il pallottoliere, seppur rudimentale, è di fatto un sistema di elaborazione dove l’informazione d’ingresso è rappresentata dal numero di palline da far scorrere in ognuna delle fasi dell’operazione e l’informazione di uscita è invece il numero di palline complessivamente spostate. Vediamo adesso come sono fatti i processori moderni ed in cosa consiste l’aritmetica binaria alla base di questi.

Partiamo da un’interessante definizione del computer:

A digital computer is a machine that can solve problems for people by carring out instructions given to it.

Un computer digitale è una macchina che può risolvere problemi per le persone eseguendo le istruzioni impartitegli.

A. S. Tanenbaum

La comprensione del funzionamento dei computer può risultare più semplice se lo studio dell’argomento si affronta a piccoli passi, partendo dai concetti semplici ma fondamentali. In questo articolo cercheremo di utilizzare questo metodo, partendo con la descrizione di massima e generale di un computer per poi descrivere l’architettura di un processore o Central Processing Unit (CPU) ed altri concetti utili allo scopo.

Leggi anche Funzionamento, architettura e prestazioni del Processore

Indice:

Organizzazione di un computer

Iniziamo con l’analizzare per grandi linee l’organizzazione di un computer, chiarendo qual è il ruolo dei principali componenti ed in particolar modo del processore. Un computer può essere schematizzato come il risultato dell’interconnessione tra diversi componenti:

  • Processore o Central Processing Unit (CPU)
  • Memoria
  • Dispositivi di Input/Output (tastiera, monitor, stampante, mouse, ecc.)
  • Uno o più bus (PCI, ISA, ecc.)

E’ importante sottolineare il fatto che l’esecuzione di un programma tipicamente richiede frequenti comunicazioni tra il processore e la memoria. Il sistema che consente la comunicazione tra le diverse unità di un computer è comunemente detto bus, questo sistema riveste un ruolo di fondamentale importanza ed influenza, in maniera significativa, le prestazioni complessive. Quasi tutti i moderni computer includono bus di comunicazione piuttosto sofisticati, organizzati in maniera gerarchica, che mirano ad aumentare la banda nella comunicazione tra il processore e la memoria senza penalizzare significativamente la comunicazione con le altre unità.

In generale, quando si parla di bus dati (in inglese data bus), ci si riferisce al bus che consente la comunicazione tra il processore e la memoria. Quindi, in un processore ad n bit (8, 16, 32, o 64), il bus dati consente il trasferimento simultaneo di n bit tra il processore e la memoria. Ovviamente la dimensione del bus dati non è l’unica differenza tra processori con un differente numero di bit: tipicamente un processore ad n bit consente di effettuare operazioni su stringhe di dati binari composte da n bit.

Componenti principali del processore

Il processore è il cervello del computer, ovvero il componente che consente di effettuare tutte le operazioni matematiche e che coordina le attività di tutte le periferiche. Grazie agli straordinari progressi degli ultimi anni nel settore delle tecnologie microelettroniche, oggi è possibile realizzare processori estremamente complessi all’interno di uno stesso chip di silicio. La seguente figura mostra i componenti principali di un semplice processore.

La ALU ha la responsabilità di eseguire tutte le operazioni aritmetiche e logiche (somme, sottrazioni, AND, OR, swap, ecc.). Questa unità include tutti i circuiti elettronici che effettivamente realizzano le operazioni matematiche. Spesso, la velocità della ALU impone il limite sulla frequenza di funzionamento del processore. Questo componente, ricevendo in ingresso le stringhe di bit associate agli operandi, produce in uscita la stringa di bit ottenuta come risultato dall’operazione eseguita sugli ingressi

L’Unità di Controllo si occupa principalmente di gestire la lettura e la scrittura in memoria, di controllare il flusso di esecuzione dei programmi, di interpretare le istruzioni lette dalla memoria, e di istruire opportunamente la ALU perché effettivamente vengano eseguite le operazioni richieste.

I Registri rivestono un ruolo importantissimo nei processori. Essi possono essere immaginati come delle piccole e veloci memorie dove scrivere e da cui leggere le variabili temporanee. Per esempio, gli operandi da utilizzare per effettuare una somma, vengono letti in memoria e scritti provvisoriamente in due registri della CPU, quindi la ALU legge il contenuto di tali registri, esegue la somma e scrive il risultato in un terzo registro.

La CACHE è una piccola e veloce memoria alla quale il processore accede frequentemente per eseguire le operazioni più ricorrenti. Questo consente di incrementare significativamente le prestazioni complessive della CPU. Alcuni processori includono una struttura cache gerarchica che consente di ottimizzare ulteriormente le prestazioni. Tale gerarchie è in genere struttura in livelli: il primo livello offre le massime prestazioni, il secondo livello prestazioni leggermente inferiori e così via. La CPU, per massimizzare le performance, accede più frequentemente al primo livello e meno ai livelli successivi. Molti processori includono cache di primo livello (L1) e di secondo livello (L2): per fare un esempio storico, il Pentium II era dotato di una cache L1 da 32KB e di una cache L2 da 512KB.

La figura riportata di seguito mostra la ALU, i due registri di input e quello di output.

Frequenza di clock e prestazioni

Il clock ha lo scopo di coordinare tutte le operazioni ed il trasferimento dei dati tra registri di un processore. Questo nella realtà è un segnale periodico del tipo mostrato sotto:

Si definisce periodo di clock T il tempo di ripetizione del segnale, ovvero il tempo che intercorre tra due fronti di salita consecutivi (o tra due fronti di discesa). La frequenza del segnale di clock è data dall’inverso del periodo.

Per quanto detto, la frequenza di clock è anche la frequenza con la quale si succedono gli eventi all’interno del processore (trasferimento tra registri, letture e scritture in memoria, esecuzioni di un’operazione, ecc.). Questo significa che da questa dipendono le prestazioni di una CPU. Bisogna tuttavia prestare attenzione al fatto che la frequenza di clock non è una misura delle prestazioni, che in realtà dipendono da un grandissimo numero di fattori, tra i quali: instruction set, tipo di architettura, numero di registri, memoria cache, eventuale presenza di pipeline, ecc.

Tipicamente la frequenza di clock di un processore è limitata dal cosiddetto data path cycle, ovvero dal tempo che impiega la ALU per leggere il contenuto dei registri di input e produrre il risultato da scrivere sul registro di output. Infatti, il periodo di clock deve essere sufficientemente lungo da garantire che nello stesso intervallo di tempo la ALU riesca a portare a termine un’operazione.

Bisogna dire che sebbene in linea di principio sia possibile progettare e realizzare processori sofisticati in grado di eseguire direttamente operazioni complesse, nella realtà si costruiscono processori in grado di eseguire direttamente solo semplici operazioni. Infatti, bisogna scontrarsi con l’esigenza di ottenere prestazioni adeguate per un gran numero di applicazioni. In generale, vale la regola secondo la quale implementando funzionalità più complesse direttamente in hardware, cresce il tempo necessario ad eseguire la singola operazione: questo si traduce in un aumento del data path cycle. La filosofia di realizzare processori in grado di eseguire solo semplici operazioni, è particolarmente utilizzata nel caso dei processori general-purpose, per i quali si ha la necessità di eseguire velocemente le operazioni tipiche e comuni al maggior numero possibile di applicazioni. Chiaramente in applicazioni specifiche, come per esempio quelle di tipo DSP (Digital Signal Processing), potrebbe essere conveniente implementare in hardware operazioni complesse ed accettare il fatto di avere una frequenza di clock inferiore.

Esempio

La semplice moltiplicazione 5×4 può essere eseguita in un solo ciclo da un processore P1 che include una ALU in grado di effettuare moltiplicazioni. La stessa operazione richiede invece 3 cicli su un processore P2 in grado di effettuare solo somme. Questo significa che per le applicazioni che richiedono frequenti moltiplicazioni, probabilmente sarebbe più conveniente impiegare il processore P1, anche se questo funzionasse ad una frequenza di clock significativamente inferiore. Viceversa, per applicazioni che richiedono solo somme, la scelta di usare P1 sarebbe evidentemente sconveniente.

Aritmetica binaria

Partendo dall’osservazione che nessun elaboratore è in grado di fare ciò che non può essere fatto dall’uomo in maniera manuale, appare evidente che la possibilità di effettuare operazioni aritmetiche attraverso l’ausilio di un sistema digitale non può che essere subordinata all’esistenza dell’aritmetica binaria.

Di seguito sono mostrate le operazioni aritmetiche elementari di somma e prodotto.

Si noti che nel caso della somma potrebbe essere necessario un bit di riporto. Questo significa che date due word[1] da n bit, per rappresentare il risultato della somma, in generale occorrono n+1 bit.

Esempi

La necessità del bit aggiuntivo necessario in alcuni casi per rappresentare il risultato della somma, chiaramente ha implicazioni pesanti dal punto di vista hardware. Si pensi per esempio ad un’architettura a 32 bit, nella quale il bus di comunicazione tra il processore e la memoria è in grado di trasportare word da 32 bit, il fatto che la somma tra due operandi a 32 bit produca un risultato a 33 bit, evidentemente rappresenta un serio problema. Tuttavia, bisogna dire che questa condizione, comunemente chiamata overflow, è in realtà gestita da tutte le moderne CPU tramite un opportuno meccanismo che garantisce il corretto funzionamento del sistema.

Per semplificare la complessità dei processori, piuttosto che realizzare dei circuiti dedicati all’interno della ALU per il calcolo delle sottrazioni, si utilizza una particolare rappresentazione dei dati che ha l’obiettivo di permettere che le sottrazioni possano essere ricondotte a semplici somme. Questa particolare rappresentazione prende il nome di complemento a 2 ed è, di fatto, la rappresentazione usata dalla maggior parte dei calcolatori.

La rappresentazione in complemento a 2 di una generica stringa binaria può essere ottenuta per mezzo di un semplice procedimento:

Dato il numero binario N

  1. Calcolare il negato di N (semplicemente negando tutti i bit di N)
  2. Sommare 1 al risultato ottenuto.

Esempi

Per operare la conversione inversa, da complemento a 2 a codifica binaria semplice, bisogna seguire esattamente lo stesso procedimento. Vale la regola secondo cui nella rappresentazione in complemento a 2, il valore del bit più significativo determina il segno, per questa ragione tale bit è chiamato a volte bit di segno.

Con una stringa da n bit in complemento a 2 è possibile rappresentare i seguenti numeri decimali:

Per esempio, con 5 bit è possibile rappresentare i numeri decimali da -16 a +15.

Vediamo che effettivamente utilizzando la rappresentazione in complemento a 2 si ha la possibilità di trasformare le operazioni di sottrazione in semplici somme.

Esempi

Nel secondo esempio, il bit di riporto non ha alcun significato e può essere eliminato. Tuttavia, bisogna dire che questa non è una regola generale, ed in realtà vi sono dei casi in cui la presenza di un riporto indica una condizione di overflow che, tra l’altro, può verificarsi addirittura in assenza di riporto. Precedentemente si è visto come, nel caso della rappresentazione binaria semplice, sia possibile rilevare in maniera immediata una condizione di overflow durante un’operazione di somma. Nel caso della rappresentazione in complemento a 2 esiste una regola un po’ meno immediata:

Durante il calcolo di una somma, un overflow si verifica ogni volta che gli ultimi due riporti differiscono.

Esempi


[1] In generale, per word dati si intende una stringa formata da un numero arbitrario di bit (bisogna specificare anche una dimensione). Nel caso in cui ci si riferisce ad un computer, o più in generale ad un sistema con un processore, si sottintende che le word abbiano la stessa dimensione del bus dati: nei processori a 32 bit le word hanno dimensione 32; nei processori a 64 bit hanno dimensione 64, ecc.


Per rimanere aggiornato su questo e altri argomenti iscriviti alla Newsletter.