La funzione principale di un computer è quella di eseguire i programmi che, dopo essere stati preventivamente letti dall’hard disk, vengono caricati nella memoria volatile. In generale, è possibile immaginare un programma come una sequenza di istruzioni. Un’istruzione è un stringa di bit che specifica al processore “cosa fare” e “dove farlo”. Questo articolo descrive per grandi linee l’architettura di un processore, lo schema di esecuzione dei programmi ed i principali parametri che influenzano le prestazioni.

I processori sono in grado di eseguire direttamente solo le istruzioni del cosiddetto linguaggio macchina. Tuttavia, lo sviluppo dei programmi in linguaggio macchina, o in linguaggio assembly, sarebbe eccessivamente complicato e, di fatto, questo approccio è impiegato solo in alcuni casi particolari nei quali si ha la necessità di creare codice ottimizzato per applicazioni critiche (driver, applicazioni industriali, ecc.).

I programmatori generalmente scrivono i programmi utilizzando linguaggi di alto livello come C, C++, Java, Python, ecc. e si avvalgono dei cosiddetti compilatori per la traduzione in linguaggio macchina.

Potrebbe essere utile leggere anche Processori e aritmetica binaria per farsi un’idea della struttura interna di un processore.

Indice:

Instruction Set Architecture

L’insieme delle istruzioni elementari eseguibili da un particolare processore è detto Instruction Set. Questo rappresenta quindi la porzione della macchina visibile al programmatore e ai compilatori. Si tratta di un aspetto fondamentale sia perché ha importanti implicazioni sul modo di utilizzare il processore, sia perché ha un impatto significativo sulle prestazioni del processore. Generalmente, per indicare che due processori hanno differenti Instruction Set, si dice che questi differiscono per l’Instruction Set Architecture (ISA). L’ISA è solo uno degli aspetti caratterizzati dall’architettura del processore. In genere se due CPU differiscono per l’ISA, sicuramente differiscono anche per l’architettura interna.

Architetture RISC e CISC

I processori commerciali possono essere classificati in base all’ISA in due grandi categorie, Reduced Instruction Set Computer (RISC) e Complex Instruction Set Computer (CISC).

Le architetture RISC consentono generalmente di eseguire un numero relativamente piccolo di istruzioni semplici in maniera veloce. Viceversa, le architetture CISC implementano in hardware, ovvero attraverso circuiti digitali complessi realizzati all’interno del chip, un numero maggiore di istruzioni più sofisticate: si pensi che un’istruzione CISC equivale a circa quattro o cinque istruzioni RISC.

La suddetta differenza implica che il linguaggio macchina dei processori RISC sia più a basso livello del linguaggio macchina dei processori CISC. Questo significa che nel secondo caso il compilatore, nel tradurre le istruzioni di alto livello, deve farsi carico di un lavoro maggiore. Dall’introduzione delle architetture RISC (1985) si è visto che in realtà queste consentono di ottenere prestazioni maggiori.

Se ti interessa acquistare un nuovo PC desktop all-in-one, visita la selezione su Amazon

Aspetti commerciali

Spesso, nel progettare nuovi processori, si è dovuto tenere conto di esigenze commerciali che non hanno consentito l’introduzione di innovazioni particolari a livello di ISA. I grandi produttori di processori hanno dovuto tenere conto dell’esigenza di mantenere la compatibilità con il passato, ovvero di garantire che l’introduzione di un nuovo processore consentisse di continuare ad utilizzare i vecchi programmi.

Per esempio, l’ISA x86 di tipo CISC, utilizzato dalle prime CPU dell’Intel, è quello tuttora implementato in molti processori recenti.

Bisogna dire che, a partire dal Pentium PRO, Intel, con l’intento di ottimizzare architettura e prestazioni del processore mantenendo la compatibilità con il passato, ha prodotto CPU con un’interfaccia ISA di tipo x86, ma di fatto basati su architetture di tipo RISC. Tale risultato è stato possibile grazie all’impiego di particolari circuiti che si occupano di tradurre le istruzioni x86 in istruzioni RISC.

Formato di un’istruzione macchina

La figura riportata di seguito mostra il formato tipico di un’istruzione.

Il campo Codice Operativo specifica il tipo di istruzione, mentre generalmente gli operandi identificano registri o locazioni di memoria.

Di seguito è riportato un esempio di formato tipico di un’istruzione:

In questo caso i due operandi sono rispettivamente un registro ed un indirizzo di memoria e l’istruzione “Carica”, alla quale tipicamente corrisponde il nome mnemonico store, sposta il contenuto dell’indirizzo di memoria 51 nel registro 1.

Classificazione delle istruzioni macchina

Le istruzioni possono essere suddivise principalmente in tre categorie:

  1. Trasferimento
  2. Elaborazioni
  3. Controllo

Appartengono alla prima categoria le istruzioni che implicano uno spostamento di dati dalla memoria ai registri della CPU, dai registri alla memoria o semplicemente tra registri.

Le istruzioni di elaborazione sono invece tutte quelle che consentono di effettuare le operazioni aritmetico-logiche e che quindi implicano un’attività della ALU.

Infine, le istruzioni di controllo consentono di rilevare il verificarsi di determinate condizioni e di effettuare azione mirate al controllo del flusso di esecuzione del programma (salti, branch, ecc.).

Ciclo di esecuzione dei programmi

A questo punto risulta abbastanza intuitivo comprendere come lo schema utilizzato dal processore per eseguire i programmi è basato su un processo sequenziale. In altre parole la CPU si occupa di leggere dalla memoria l’istruzione ed eventualmente gli operandi, di eseguire l’istruzione caricata e quindi di leggere da un’altra locazione di memoria l’istruzione successiva.

La figura riportata sotto mostra in forma semplificata tale ciclo di esecuzione realizzato dal processore. Nella fase “Esgui l’istruzione” la CPU decodifica l’istruzione, predispone i registri coinvolti e quindi procede con l’esecuzione vera e propria dell’istruzione.

Architettura e prestazioni del processore

Nella fase iniziale dell’era dei calcolatori elettronici moderni, ovvero completamente realizzati all’interno di un unico circuito integrato, le prestazioni di una CPU si valutavano quasi esclusivamente attraverso la misura della frequenza di clock. Questa figura è generalmente fornita in MHz (o GHz).

Tuttavia, la frequenza del clock consente solo di valutare quanto velocemente la CPU è in grado di espletare uno step elementare di esecuzione. Nello specifico, tale tempo è proprio il periodo del clock, ovvero l’inverso della frequenza.

Appare evidente che per valutare realmente le prestazioni di un processore serve tenere in considerazione anche altri parametri, come il numero di step elementari richiesti per eseguire una data istruzione e, ancor più importante, il numero di istruzioni richieste per eseguire un dato programma.

Sono tantissimi i parametri dell’architettura che rivestono un ruolo fondamentale nella determinazione delle prestazioni. Tra queste, una delle più importanti è sicuramente l’ISA, che, in base a quanto discusso, determina il numero di istruzioni necessarie per eseguire un programma.

Per i motivi detti, le prestazioni si valutano in genere misurando il tempo di cui ha bisogno la CPU per eseguire l’intero programma. La valutazione e la certificazione delle prestazioni viene fatta utilizzando dei programmi standardizzati, noti con il nome di benchmark.

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