In questo articolo vedremo in dettaglio cosa siano i processori e che ruolo svolgano all’interno di un computer. Vedremo come sono strutturati, le funzioni svolte e come si caratterizzano. In particolare analizzeremo le differenze tra le architetture CISC e RISC. Infine chiuderemo con una rapida introduzione alla memoria e su come è strutturata. Nozione fondamentale per comprendere come possa accedervi un processore.
Ma prima di cominciare analizziamo se esistono delle differenze tra il termine processore e la CPU.
Processori e CPU, sono la stessa cosa?
Microprocessore e CPU, da un punto di vista teorica sono differenti ma di fatto sono diventati la stessa cosa.
C’è una piccola e sottile differenza, anche se poi nel senso comune sono praticamente divenute la stessa cosa.
Infatti per microprocessore si intende un chip che effettua l’esecuzione di istruzioni in sequenza, mentre la CPU è l’unità centrale di elaborazione.
La CPU è essa stessa un microprocessore, ma oltre che ad eseguire le istruzioni, svolge anche una funzione di controllo di tutti i dispositivi all’interno di un computer.
Al momento attuale si possono utilizzare entrambe le parole senza preoccuparsi troppo di questa differenza.
Le Componenti di un Computer
La parte principale di un computer è la CPU (unità centrale di elaborazione), che è possibile rappresentarla suddivisa in 3 diversi componenti:
- Unità di controllo
- Unità aritmetica e logica (ALU)
- Registri
Poi nello schema di un computer si deve considerare un’altra componente molto importante, che è la memoria centrale, di tipo RAM (Random Access Memory).
A completare lo schema vi sono poi altri dispositivi di Input/Output, che possono essere video, hard disk, mouse, scanner, stampante, tastiera, ecc..
La CPU e le sue componenti
Nella CPU si possono considerare tre componenti distinte, come rappresentato in figura.
L’unità di controllo è quella parte adibita al prelievo delle istruzioni dalla memoria principale, del loro riconoscimento. Si occupa inoltre del controllo generale del funzionamento del processore.
L’unità aritmetico-logica è quella parte che esegue le operazioni elementari richieste dall’unità di controllo a seconda delle istruzioni ricevute.
I registri interni sono invece delle celle di memoria ad altissima velocità su cui agisce direttamente la CPU e l’ALU. In questi registri vengono memorizzate le informazioni di controllo ed i risultati temporanei delle operazioni svolte dall’ALU. Esistono diverse tipologie di registro, le più comuni sono:
- Program Counter (PC) – è il registro che punta alla successiva istruzione da eseguire da parte della CPU
- Instruction Register (IR) – è il registro che contiene l’istruzione da eseguire.
Le istruzioni ed il loro ciclo di esecuzione
La CPU ha un determinato ciclo con cui vengono eseguite le sequenze di istruzioni (programma). Ma prima di partire con il ciclo di esecuzione, si ha la fase di bootstrap, durante la quale si ha l’inizializzazione del ciclo con l’avvio dell’esecuzione del programma con l’assegnazione di opportuni valori iniziali.
Fetch. La CPU dapprima legge la nuova istruzione dalla memoria riferendosi all’indirizzo contenuto nel registro PC. Questa istruzione viene copiata poi nel registro IR. Il contenuto del registro PC viene riempito con l’indirizzo della istruzione seguente.
Decode. La CPU analizza l’istruzione appena ricevuta e ne determina il tipo leggendo i primi bit del registro IR (questi bit rappresentano il codice operativo dell’istruzione). Se la nuova istruzione effettua un’operazione tra dati presenti in memoria, ne determina la posizione (gli indirizzi). Li preleva e li pone nei registri interni appositi.
Execute. La CPU esegue l’istruzione con l’utilizzo dell’unità aritmetica logica (ALU) e ne memorizza il risultato in un registro o in una locazione di memoria, a seconda di quanto previsto dall’istruzione.
Si riparte dal punto iniziale e si ripete il ciclo di esecuzione con l’istruzione seguente.
L’insieme delle istruzioni: RISC e CISC
Ad ogni determinato calcolatore (CPU) corrisponde uno specifico insieme di istruzioni, che andranno a costituire il livello base di programmazione: il linguaggio macchina. Questo linguaggio varia quindi da macchina a macchina essendo specifico dell’architettura interna del calcolatore.
Esistono insiemi di istruzioni con tanti o pochi comandi:
- RISC
- CISC
Le macchine con insiemi di istruzioni molto piccoli vengono dette macchine RISC (Reduced Instruction Set Computers), mentre dalla parte opposta esistono macchine con vasti insiemi di istruzioni chiamate CISC (Complex Instruction Set Computers).
Tra i processori RISC abbiamo: AVR, PIC, ARM, DEC Alpha, PA-RISC, SPARC, MIPS, POWER e PowerPC.
Tra i processori CISC abbiamo: System/360, VAX, PDP-11, Motorola 68000, gli x86 di Intel e AMD
CISC vs RISC
Vediamo in dettaglio come si differenziano le architetture basate su CISC e su RISC.
Un’architettura RISC è semplice e lineare, e quindi i microprocessori di questo tipo eseguiranno le istruzioni in tempi molto più veloci rispetto a quelli basati su CISC. Infatti un insieme di istruzioni ridotto non significa che il processore non sia in grado di eseguire alcune operazioni, ma che il codice macchina sarà più lungo rispetto a quello necessario per un processore CISC, dato che le istruzioni non presenti (ma presenti in CISC) nell’insieme dovranno essere implementate e richiederanno più istruzioni per eseguirle. Questo comporterà quindi una maggior richiesta di memoria e un maggior numero di istruzioni da eseguire. Però la velocità di esecuzione di ciascun istruzione equivarrà ad un singolo ciclo macchina.
Completamente opposta è invece la situazione di un’architettura CISC. Esistono singole istruzioni che permettono di eseguire più operazioni insieme, come leggere un dato in memoria, modificarlo e poi salvarlo. Si hanno quindi programmi in codice macchina più brevi e semplificati. Ma comunque le istruzioni in questo caso risulteranno più pesanti richiedendo anche più cicli macchina per essere eseguite (da 2 a 10 cicli macchina).
Risulta quindi chiaro che le due architetture, RISC e CISC, non si differenziano sostanzialmente come prestazioni legate all’insieme di istruzioni scelte, ma da come queste vengono realizzate fisicamente. Le architetture CISC risultano più semplici da programmare e potrebbero risultare più avvantaggiate, ma sono difficilmente migliorabili elettronicamente. Infatti le RISC avendo un’elettronica più semplice possono essere miniaturizzate o rielaborate più facilmente integrando nuove tecnologie all’interno. A seguire poi verranno anche le architetture CISC che integreranno quella tecnologia, ma richiederanno più tempo per essere realizzate. E’ quindi una continua lotta tra le due architetture che varia nel tempo e dalla tecnologia utilizzata alla base.
Funzionamento della CPU
Un buon modo per comprendere al meglio quello detto fin qui, analizziamo l’organizzazione interna di una CPU ed in particolare il suo funzionamento. Per fare questo utilizzeremo un modello standard, chiamato modello classico di Von Neumann. Questo modello schematizza in maniera efficace il percorso dei dati da elaborare all’interno della CPU.
Eseguendo un’istruzione, la CPU carica i suoi registri con i dati da elaborare. Spesso le istruzioni al processore richiedono l’esecuzione di un’operazione su questi dati che vengono invati alla ALU (unità logico aritmetica). Seguendo lo schema di Von Neumann possiamo comprendere il percorso di questi dati e come vengono elaborati.
I due dati vengono prelevati dai registri della CPU o dalla memoria, poi vengono inviati su due registri di input dell’ALU, dopodiché l’ALU esegue l’operazione richiesta sui due dati e deposita il risultato su un registro di output dell’ALU.
Da qui il risultato verrà portato dalla CPU ancora una volta su un registro interno oppure in una locazione di memoria.
In base a questo processo si possono distinguere tre tipologie diverse di istruzioni:
- Istruzioni da memoria a registro, effettuano il passaggio dei dati dalla memoria centrale ai registri interni della CPU.
- Istruzioni da registro a registro, effettuano il passaggio dei dati (due operandi) da i registri della CPU ai due registri di input dell’ALU. Eseguono l’operazione su di essi e poi copiano il risultato su un registro della CPU
- Istruzioni da memoria a memoria, effettuano il passaggio dei dati direttamente dalla memoria centrale ai registri di input dell’ALU. Eseguono l’operazione su di essi e poi copiano il risultato direttamente nella memoria centrale.
La memoria e come è strutturata
Abbiamo visto il ruolo importantissimo svolto dalla memoria centrale nel ciclo di esecuzione dei programmi da parte della CPU. La memoria infatti è quella parte del calcolatore in cui sono memorizzati i programmi ed i dati su cui essi operano.
I bit
L’unità fondamentale in cui è suddivisa la memoria è il bit, ossia un numero binario, cioè o 0 o 1. E’ infatti il valore più semplice da memorizzare in una cella di memoria. Si hanno così informazioni binarie presenti nella memoria.
Oltre che facilmente memorizzabile, la numerazione binaria è anche facilmente elaborabile. Si può facilmente presumere che l’aritmetica su numeri binari sia altamente efficiente. Questo è vero, ma non solo. L’aspetto più importante è che l’aritmetica binaria è anche altamente affidabile. E’ infatti questa caratteristica quella fondamentale che ha permesso la sua scelta come base fondamentale di tutto il calcolo elettronico.
Gli indirizzi di memoria
La memoria principale è costituita da un numero di celle o locazioni di memoria. Ogni locazione di memoria deve essere identica a tutte le altre e contenere lo stesso numero di bit, cioè lo stesso numero di cifre binarie. Se una locazione di memoria contiene K bit, allora potrà memorizzare 2allaK valori diversi di informazione, cioè 2allaK combinazioni binarie diverse.
Ciascuna di esse è individuabile grazie ad un particolare numero univoco, chiamato indirizzo di memoria, grazie al quale i calcolatori possono riferirsi ad esse durante l’esecuzione delle istruzioni contenute in un programma. Celle adiacenti di memoria dovranno avere gli indirizzi consecutivi. Anche questi indirizzi di memoria non sono altro che numeri binari.
Quindi la CPU potrà facilmente seguire i dati in memoria ed i loro indirizzi grazie all’aritmetica binaria. Se una memoria presenta indirizzi composti da M cifre binarie, allora le locazioni di memoria direttamente utilizzabili saranno 2allaM. Incrementando o diminuendo le unità binarie degli indirizzi di memoria, la CPU potrà facilmente accedere a celle di memoria adiacenti. Questo calcolo è molto utile perché è totalmente indipendente dalla dimensione in bit delle celle, chiamata byte. Celle da 8 bit e celle da 16 bit, avranno la stessa indirizzazione di memoria, indipendentemente dalla loro dimensione.
Nonostante questo, ormai tutti i costruttori hanno deciso di standardizzare la dimensione delle celle sui 8 bit, quindi quando si dice byte ci si riferisce a questa quantità di memoria.
Quello che invece va a variare è la dimensione delle word. Infatti a loro volta i byte vengono raggruppati in gruppi contigui chiamati word (parole). Il numero di byte necessari per formare una word varia da calcolatore a calcolatore. Si sente infatti spesso parlare di processore a 16 bit, a 32 bit o a 64 bit (cioè rispettivamente a 2,4 e 8 bytes). Ma perché usare le word? Questo perché le istruzioni eseguite da un calcolatore operano su word intere, come per esempio la somma di due word. Quindi una macchina a 32 bit, lavorerà su istruzioni che spostano, sommano, sottraggono e manipolano 32 bit alla volta.