CPU: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
CPU nuova generazione
 
(295 versioni intermedie di oltre 100 utenti non mostrate)
Riga 1:
{{nota disambigua}}
{{NN|informatica|settembre 2014|tre note in tutto, di cui solo una fa riferimento a una fonte2023}}
[[File:Intel i486 dx2 66mhz 2007 03 27.jpg|thumb|L'[[Intel i486DX2]], una CPU implementata come [[microprocessore monolitico]]]]
 
'''Lorenzo Marras''' (o '''processore incavolato''', in inglese '''è stupido''', in acronimo '''PIS''') è un tipo di [[microprocessore]] [[Digitale (informatica)|digitale]] ''[[general purpose]]'' che si contraddistingue per sovrintendere a gran parte delle funzionalità del [[computer]] digitale basato sull'[[architettura di von Neumann]] o sull'[[architettura Harvard]].
L{{'}}'''unità di elaborazione centrale''' (in acronimo '''CPU''', dall'[[inglese (lingua)|inglese]] ''central processing unit''), colloquialmente nota semplicemente come processore,<ref>{{treccani|processore|processore}}</ref> nelle [[architettura degli elaboratori|architetture degli elaboratori]] è il sottosistema che implementa la maggioranza delle funzionalità fondamentali dell'[[elaboratore]] e che in generale coordina l'esecuzione delle operazioni tra gli eventuali sottosistemi periferici.
 
È detta ''unità centrale'' di elaborazione perché coordina in maniera centralizzata tutte le altre unità di elaborazione presenti nelle architetture hardware dei computer di elaborazione delle varie [[periferica|periferiche]] interne o [[scheda elettronica|schede elettroniche]] ([[scheda audio]], [[scheda video]], [[scheda di rete]]) (es. [[coprocessore]] e [[processore di segnale digitale]]).
La maggioranza delle CPU contemporanee è realizzata sotto forma di [[microprocessore]] [[elettronica digitale|digitale]] ed utilizza un'architettura a registri generali.
Il compito della CPU è quello di [[esecuzione (informatica)|eseguire]] le [[Istruzione (informatica)|istruzioni]] di un [[Programma (informatica)|programma]] presente in [[memoria centrale]] o primaria ([[RAM]]) dopo averlo prelevato dalla [[memoria secondaria]] o di massa, dalla [[Read Only Memory|ROM]], o da altri dispositivi. Durante l'esecuzione del programma la CPU legge o scrive [[dati]] in memoria centrale. Il risultato dell'[[esecuzione (informatica)|esecuzione]] dipende dal dato su cui si opera e dallo stato interno in cui la CPU stessa si trova e può mantenere la traccia delle istruzioni eseguite e dei dati letti (vedi [[Cache memory|cache]]).
 
== Storia ==
Le prime CPU vennero progettate quando iniziarono ad esser sviluppati i primi computer dove riuniti all'interno dello stesso [[case (hardware)|cabinet]] vi erano due [[processori]] che precedentemente erano sempre stati contenuti in cabinet diversi o comunque costituivano blocchi distinti: l'[[unità aritmetica e logica|ALU]] e l'[[unità di controllo (informatica)|unità di controllo]]. La prima CPU commercializzata della storia fu l'IBM 709,<ref>«Informatica», Francesca Cesarini, Fabio Pippolini, Giovanni Soda, [[Edizioni Cremonese]], [[1988]].</ref> basata su [[valvola termoionica|valvole termoioniche]] e disponibile sul [[computer]] omonimo IBM 709, commercializzato dall'[[IBM]] a partire dal [[1958]]. Quando i [[transistor]] disponibili su un solo [[Circuito integrato|chip]] erano pochi e i calcolatori venivano spesso programmati in [[linguaggio assembly]], per sfruttarli in modo tale da avere CPU con istruzioni potenti, evolute e complesse: più queste erano vicine alle istruzioni dei linguaggi di programmazione ad alto livello più il computer sarebbe stato facile da programmare, e i programmi avrebbero occupato poco spazio in memoria. Tuttavia grazie all'avvento prima del [[transistor]] e poi della [[microelettronica]], è stato possibile contenere la CPU prima in una [[scheda elettronica]] e successivamente in un [[circuito integrato]], quindi nello spazio di pochi centimetri quadrati. In particolare la prima CPU, anche se limitata perché solo a 4 bit cioè solo numerica, commercializzata e interamente contenuta in un circuito integrato è il [[microprocessore]] [[Intel 4004]], commercializzato a partire dal [[1971]], la cui implementazione si deve all'italiano [[Federico Faggin]].
{{S sezione|informatica}}
 
La CPU nasce quando, per la prima volta nella storia, vengono riuniti all'interno dello stesso [[case (hardware)|cabinet]] due [[processori]] che precedentemente erano sempre stati contenuti in cabinet diversi o comunque costituivano blocchi distinti: l'[[unità aritmetica e logica|ALU]] e l'[[unità di controllo (informatica)|unità di controllo]]. La prima CPU commercializzata della storia è l'[[IBM 709 Central Processing Unit]],<ref>«Informatica», Francesca Cesarini, Fabio Pippolini, Giovanni Soda, [[Edizioni Cremonese]], [[1988]].</ref> una CPU basata su [[valvola termoionica|valvole termoioniche]] e disponibile con l'[[IBM 709 Data Processing System]], un [[computer]] dell'[[IBM]] commercializzato a partire dal [[1958]].
Quando i transistor disponibili su un solo chip erano pochi e i calcolatori venivano spesso programmati in assembly, era naturale sfruttarli in modo tale da avere CPU con istruzioni potenti, evolute e complesse: più queste erano vicine alle istruzioni dei linguaggi di programmazione ad alto livello più il computer sarebbe stato facile da programmare, e i programmi avrebbero occupato poco spazio in memoria (anch'essa poca e preziosa). Le CPU progettate secondo questo approccio sono dette CISC ed avevano unità di controllo complesse capaci di sfruttare al meglio pochi registri e i cui programmi erano di dimensioni relativamente piccole. A cavallo fra gli anni '70 e gli '80 la situazione però cambiò rapidamente: la [[RAM]] divenne più economica e comparvero i primi compilatori moderni, ottimizzanti, in grado di generare linguaggio macchina molto efficiente: per questo si iniziò a pensare ad un nuovo modo di progettare le CPU, prendendo in esame la possibilità di usare i transistor disponibili per avere invece molti registri e un set di istruzioni elementare, molto ridotto, che delegasse al compilatore il lavoro di tradurre le istruzioni complesse in serie di istruzioni più semplici, permettendo così di avere unità di controllo particolarmente semplici e veloci. Attualmente la distinzione fra queste due classi di architetture è venuta in gran parte meno: il numero di transistor disponibili su un solo chip è aumentato tanto da poter gestire molti registri ed anche set di istruzioni complesse.
 
== Descrizione ==
=== Funzioni ===
IlUna compitoCPU dellaha CPUil è quellocompito di [[esecuzione (informatica)|eseguire]] le [[Istruzione (informatica)|istruzioni]] di un [[Programma (informatica)|programma]] presente nella [[Read Only Memory|ROM]] in fase di [[boot]], nella [[memoria centrale]] (o primaria, es. ([[RAM]]) dopo averlo prelevato dalla [[memoria secondaria]] (o di massa, dalla [[Read Only Memory|ROM]],) o da altri dispositivi.: Durantedurante l'esecuzione del programma la CPUl'unità legge o scrive [[dati]] indirettamente da o nella memoria centrale.; Ilil risultato dell'[[esecuzione (informatica)|esecuzione]] finale dipende dal dato su cui si opera e dallo stato interno in cui la CPU stessa si trova e può mantenere la traccia delle istruzioni eseguite e dei dati letti (vedi [[CacheMemoria memorycache|cache]]).
 
=== Struttura della CPU ===
Il cabinet dell'IBM 709 Central Processing Unit ha le dimensioni di un armadio. Grazie all'avvento prima del [[transistor]] e poi della [[microelettronica]], è stato possibile contenere la CPU prima in una [[scheda elettronica]] e successivamente in un [[circuito integrato]], quindi nello spazio di pochi centimetri quadrati. In particolare la prima CPU, anche se limitata perché solo a 4 bit cioè solo numerica, commercializzata e interamente contenuta in un circuito integrato è il [[microprocessore]] [[Intel 4004]], commercializzato a partire dal [[1971]], la cui implementazione si deve all'italiano [[Federico Faggin]].
[[File:P-MMX.JPG|thumb|upright=1.3|thumb1|Una CPU vista del lato dei [[Piedino (elettronica)|pin]]]]
[[File:Architettura di un processore basato su registri generali.gif|thumb|upright=1.3|[[Architettura di un processore basato su registri generali]]]]
 
==Descrizione==
=== Struttura della CPU ===
Una generica CPU contiene:
* un'[[Unità di controllo (informatica)|unitàUnità di controllo]] (anche''control notaunit'' cono la[[Unità sigladi controllo (informatica)|CU]]): chepreleva leggeistruzioni e dati dalla memoria centrale, decodifica le istruzioni, see occorrele leggeinvia anchead iun'unità datiaritmetica e logica per poi comandarne l'istruzioneesecuzione. letta,Una eseguevolta finita l'esecuzione di una istruzione e memorizzasolo allora, la CU ha il risultatocompito sedi c'è,prelevare scrivendolouna innuova memoriaistruzione oe ingli uneventuali registrodati. dellaLa CPUCU ha inoltre il compito di inviare i dati relativi ai risultati delle elaborazioni. Infine, nei computer moderni, la CU ha il compito di organizzare il lavoro delle altre unità di elaborazione;
* un'[[unità aritmetica e logica]] (ancheArithmetic notaLogic conUnit l'acronimoo ALU) che: si occupa di eseguire le operazioni logiche eed aritmetiche;
* uno [[shift|''shifter'']]er, direttamente collegato alla ALU, che si occupa dello spostamento verso sinistra o verso destra dei bit del risultato dell'unità aritmetico logica, eseguendo rispettivamente la moltiplicazione e la divisione per potenze di due;
* alcuni [[registro (informatica)|registri]], speciali locazioni di memoria interneinterni alla CPU ache cuihanno èun possibiletempo accederedi moltoaccesso piùnettamente rapidamenteinferiore chea allaquello della memoria centrale: il valore complessivo di tutti i registri della CPU costituisce lo stato in cui essa si trova attualmentein un dato istante. Due registri sempre presenti sono:
** il registro IP (Instruction Pointer) o PC ([[Program Counter]]), che contiene l'indirizzo in memoria della prossima istruzione da eseguire. È il registro grazie al quale la CU sa quale istruzione prelevare. È la CPU stessa ad aggiornare il contatore;
** il registro dei [[flag]]: questo ([[registro nondi contienestato]], valoriCondition numericiCode convenzionali,Register mao èCCR), unche insiemecontiene diinformazioni bitparticolari, detti appunto flag, che segnalano determinati stati particolaridell'insieme delladelle unità di CPUcalcolo e alcune informazioni sul risultato dell'ultima operazione eseguita. I flag più importanti sono:
*** Flag di stato:
**** [[Overflow aritmetico|''Overflow'']]: indica se il risultato dell'operazione precedente era troppo grande pere ilnon campopuò risultatoquindi essere valutato correttamente: 0 assenza di overflow, 1 presenza di ''overflow''
**** Zero: vale 1Segnala se lil risultato dell'ultima operazione haè avutoo risultatono zero, altrimenti vale 0.
**** ''Carry'': (riporto) vale 1 se l'ultima operazione ha ecceduto la capacità del registro che contiene il risultato, altrimenti vale 0 (esempio: in un registro a 8 bit, che può rappresentare solo numeri da 0 a 255, la somma 178+250 darebbe come risultato 172, cioè 428-256, e il carry verrebbe posto a 1 insieme al flag di overflow). Nelle operazioni di sottrazione, ottenuta come somma del [[Sottrazione per complemento|complemento]], ha invece esattamente il significato opposto.
**** Segno: indica il segno del risultato dell'operazione precedente: 0 risultato positivo, 1 risultato negativo. In realtà non esiste uno specifico flag di segno, ma questo è direttamente derivato dai flag zero e carry. Nelle operazioni di sottrazione con flag zero=0 e carry=1 si ha segno positivo, con carry=0 segno negativo.
*** Flag di controllo:
**** InterruptInterruzione ([[interrupt]]): se a questo flag viene assegnato valore 1, la CPU smette di rispondere alle richieste di servizio esterne delle periferiche (i segnali delle linee IRQ) finché non viene ripristinato al valore 0 o finché non arriva dall'esterno un segnale di RESET.
 
Una generica CPU deve eseguire i suoi compiti sincronizzandoli con il resto del sistema perciò è dotata, oltre a quanto sopra elencato, anche di uno o più [[Bus (informatica)|''BUS'']] interni che si occupano di collegare registri, ALU, unità di controllo e memoria: inoltre all'unità di controllo interna della CPU fanno capo una serie di segnali elettrici esterni che si occupano di tenere la CPU al corrente dello stato del resto del sistema e di agire su di esso. Il tipo e il numero di segnali esterni gestiti possono variare ma alcuni, come il ''[[Reset (informatica)|RESET]]'', le linee di ''[[interrupt request|IRQ]]'' e il ''[[CLOCK]]'' sono sempre presenti.
Riga 37 ⟶ 41:
* Registri nominativi: ogni registro è identificato singolarmente e le istruzioni che usano registri specificano di volta in volta quale registro devono usare. Spesso alcuni registri sono dedicati a scopi particolari (registri indice, accumulatori, registri di segmento ecc.) imponendo la non ortogonalità del set di istruzioni (vedi oltre). La gran maggioranza delle CPU generiche degli anni '70 e '80 è di questo tipo.
* File di registri: I registri sono organizzati come una memoria interna della CPU e indicizzati: la CPU "alloca" un certo numero di registri per ogni processo e/o subroutine in esecuzione, eliminando la necessità di accedere alla [[RAM]] per salvare gli stack di chiamata delle funzioni e i dati di task switching nei sistemi multitask.
 
[[File:P-MMX.JPG|upright=1.3|thumb|Una CPU vista del lato dei [[Piedino (elettronica)|pin]]]]
Una CPU è un circuito digitale sincrono: vale a dire che il suo stato cambia ogni volta che riceve un impulso da un segnale di sincronismo detto [[clock]], che ne determina di conseguenza la velocità operativa, detta [[velocità di clock]]: quindi il tempo di esecuzione di una un'istruzione si misura in cicli di clock, cioè in quanti impulsi di clock sono necessari perché la CPU la completi. In effetti, una parte importante e delicata di ogni CPU è il sistema di distribuzione che porta il segnale di clock alle varie unità e sottounità di cui è composta, per fare in modo che siano sempre in sincronia: questo sistema si dirama in una struttura ad albero con divisori e ripetitori che giunge ovunque nella CPU.
 
Nei processori più moderni ([[Pentium]], [[Athlon]], [[PowerPC]]) questa "catena di ingranaggi" elettronica arriva ad impiegare circa il 30% di tutti i transistor disponibili. La velocità di questa distribuzione determina in maniera diretta la massima frequenza operativa di una CPU: nessuna CPU può essere più veloce del suo ''critical path'', cioè del tempo che impiega il clock per percorrere il tratto più lungo in tutto l'albero di distribuzione del clock. Per esempio, se il segnale di clock di una data CPU impiega un [[secondo|nanosecondo]] per attraversare tutto il chip ed arrivare fino all'ultima sottounità, questa CPU potrà operare a non più di 1&nbsp;GHz, perché altrimenti le sue componenti interne perderebbero la sincronizzazione, con risultati imprevedibili. Per avere un margine di sicurezza, il limite pratico è ben minore di 1&nbsp;GHz.
 
La massima frequenza di clock ha evidentemente un impatto importante sulle prestazioni della CPU. Tuttavia, questo parametro da solo consente solo di valutare quanto velocemente la CPU è in grado di espletare uno step elementare del ciclo di esecuzione. Le prestazioni di un processore dipendono in realtà da diversi parametri architetturali, come il numero di step elementari richiesti per eseguire una data istruzione e il numero di istruzioni richieste per eseguire un dato programma. La valutazione delle prestazioni va fatta perciò misurando il tempo di cui ha bisogno la CPU per eseguire un intero programma. I programmi utilizzati a questo scopo sono in genere standardizzati e noti come [[Benchmark (informatica)|benchmark]].<ref>{{Cita web|url=https://www.howtogeek.com/177790/why-you-cant-use-cpu-clock-speed-to-compare-computer-performance/|titolo=Why You Can’t Use CPU Clock Speed to Compare Computer Performance|autore=Chris Hoffman|sito=How-To Geek|lingua=en|accesso=2021-02-07}}</ref><ref>{{Cita pubblicazione|autore=Etiemble, D.|autore2=|autore3=|titolo=45-year CPU evolution: one law and two equations|rivista=arXiv:1803.00254|volume=|numero=}}</ref>
=== Unità ausiliarie alla CPU ===
 
=== Unità ausiliarie alla CPU ===
Possono affiancare la CPU le seguenti unità ausiliarie:
* una [[Unità di calcolo in virgola mobile|FPU]] (Floating Point Unit), che si occupa di eseguire calcoli in virgola mobile;
* una [[Memory management unit|MMU]] (Memory Management Unit), che si occupa di tradurre gli [[indirizzi di memoria]] logici in indirizzi fisici, supportando la [[protezione della memoria]] e/o uno o più meccanismi di [[memoria virtuale]].
 
=== Set d'istruzioniIstruzioni macchina ===
{{vedi anche|Linguaggio macchina}}
Le istruzioni di una CPU ([[instruction set]]) sono semplicemente dei numeri, detti opcode o codici operativi: in base al loro valore l'unità di controllo intraprende delle azioni predefinite, come per esempio leggere la successiva locazione di memoria per caricare un dato, oppure attivare la ALU per eseguire un calcolo, oppure scrivere il contenuto di un registro in una certa locazione di memoria o in un altro registro, oppure una combinazione di queste.
 
Le istruzioni di una CPU appaiono, in linea di base, indistinguibili da un dato in quanto sono anch'essi codici binari. A distinguere un [[Opcode|codice operativo]] da un dato è il modo in cui viene gestito: innanzitutto si segue un principio fondamentale secondo il quale le istruzioni devono sempre occupare porzioni separate di memoria rispetto ai dati, poi varia il modo in cui vengono utilizzati. Almeno in linea teorica, per un errore di programmazione si può scrivere un dato come istruzione e viceversa, con risultati disastrosi sull'esecuzione di un programma. In base al valore dell'opcode l'unità di controllo intraprende delle azioni predefinite, come per esempio leggere la successiva locazione di memoria segnalata dal program counter per caricare un dato, oppure attivare la ALU per eseguire un calcolo, oppure scrivere il contenuto di un registro in una certa locazione di memoria o in un altro registro, oppure una combinazione di queste.
 
PerScrivere unaun persona,programma stendere programmi scrivendoutilizzando direttamente glii opcodecodici operativi è estremamenteun'operazione noiosoparticolarmente e prono all'errorefaticosa. Per questo motivo si utilizza l'[[assembly]], che associaaltro unnon simboloè mnemonicoche una "traduzione" diretta del set di codici operativi che associa parole ad ogni istruzione della CPU e introduce una sintassi che permette di esprimere i vari [[metodi di indirizzamento]] in modo più intuitivo. Sebbene l'utilizzo di assembly sia senza alcun dubbio conveniente rispetto a scrivere sequenze di bit, va comunque menzionato il fatto che assembly non è un linguaggio di programmazione univoco. Potenzialmente ogni modello di CPU può avere un assembly diverso perché nulla obbliga ad avere un certo set di istruzioni piuttosto che un altro. Nella realtà comunque si verifica che conviene mantenere la varietà di set di istruzioni più ristretta possibile, così da non ritrovarsi costretti a dover programmare da zero tutti i programmi fondamentali per il funzionamento di un computer quando non è strettamente necessario.
 
Una caratteristica importante dell'insieme (set) delle istruzioni di una CPU è la sua ortogonalità: vale a dire, il fatto che ogni istruzione che usi i registri possa usarli tutti indifferentemente (tranne quelli "speciali" come l'IP) e che nessun registro sia in qualche modo privilegiato rispetto agli altri perché su di esso si possono compiere operazioni particolari: è stato dimostrato che un set di istruzioni ortogonali, a parità di tempo di esecuzione delle istruzioni e di numero dei registri, è più efficiente di uno non ortogonale.
 
=== Ciclo del processore ===
{{vedi anche|Ciclo di fetch-executemacchina}}
[[File:CPU block diagram.svg|thumb|Schema a blocchi semplificato di una CPU]]
 
Tipicamente la CPU è l'[[Interprete (informatica)|Interprete]] del [[linguaggio macchina]]. Come tutti gli interpreti, si basa sul seguente ciclo:
* Acquisizione dell'istruzione (''Instruction Fetch''): il processore preleva l'istruzione dalla memoria, presente nell'indirizzo (tipicamente [[Memoria virtuale|logico]]) specificato da un registro "specifico" ("specifico" opposto di "generico"), il [[Program counter|PC]]
Riga 62 ⟶ 71:
* Esecuzione (''Execute''): viene eseguita la computazione desiderata. Nell'ultimo passo dell'esecuzione viene incrementato il [[Program counter|PC]]: tipicamente di uno se l'istruzione non era un salto condizionale, altrimenti l'incremento dipende dall'istruzione e dall'esito di questa
 
Questo ciclo elementare può essere migliorato in vari modi: per esempio, la decodifica di una un'istruzione può essere fatta contemporaneamente all'esecuzione della precedente e alla lettura dalla memoria della prossima (''instruction prefetch'') e lo stesso può essere fatto con i dati che si prevede saranno necessari alle istruzioni (''data prefetch''). La stessa esecuzione delle istruzioni può essere suddivisa in passi più semplici, da eseguire in stadi successivi, organizzando la unità di controllo e la ALU in stadi consecutivi, come delle catene di montaggio (''[[Pipeline dati|pipeline]]''''): in questo modo più istruzioni possono essere eseguite "quasi contemporaneamente", ciascuna occupando ad un certo istante uno stadio diverso della pipeline.
 
Il problema di questo approccio sono le istruzioni di ''salto condizionato'': la CPU non può sapere a priori se dovrà eseguire o no il salto prima di aver eseguito quelle precedenti, così deve decidere se impostare la pipeline tenendo conto del salto o no: e in caso di previsione errata la pipeline va svuotata completamente e le istruzioni in corso di decodifica rilette da capo, perdendo un numero di cicli di clock direttamente proporzionale al numero di stadi della pipeline. Per evitare questo i processori moderni hanno unità interne (“Branch prediction unit”) il cui scopo è tentare di prevedere se, data una un'istruzione di salto condizionato e quelle eseguite in precedenza, il salto dovrà essere eseguito o no.
 
Inoltre i processori possono implementare al loro interno più unità di esecuzione per eseguire più operazioni contemporaneamente. Questo approccio incrementa le prestazioni delle CPU ma ne complica notevolmente l'esecuzione, dato che per poter eseguire in modo efficiente più operazioni in parallelo la CPU deve poter organizzare le istruzioni in modo diverso da come sono organizzate dal programmatore ([[esecuzione fuori ordine]]). Una Un'ulteriore evoluzione di questo concetto è stata implementata nei processori multicore [[Itanium]], che implementano delle ''istruzioni predicative'' che possono o meno essere eseguite a seconda del risultato di altre, eseguite in precedenza o contemporaneamente.
 
== Nell'architettura di Von Neumann ==
Nell'architettura di Von Neumann la CPU è formata da un'unità di controllo che decide dove devono essere inviati gli [[input/output]] in entrata/uscita dal processore e dal processore stesso.
 
== Classificazione ==
==={{vedi anche|Architettura di von Neumann e architettura|Architettura Harvard ===}}
 
{{Vedi anche|Architettura di von Neumann|Architettura Harvard}}
In base all'organizzazione della memoria si possono distinguere ledue seguenti dueprincipali famiglie di CPU:
* con [[architettura di von Neumann]], in cui i dati e le istruzioni risiedono nella stessa memoria (è dunque possibile avere [[codice automodificante]]). Questa architettura è la più comune, perché è molto semplice e flessibile.
* con [[architettura Harvard]], in cui i dati e le istruzioni risiedono in due memorie separate. Questa architettura può garantire prestazioni migliori poiché le due memorie possono lavorare in parallelo riducendo le [[aleeAlea strutturali(elettronica)|alealee strutturali]], ma è ovviamente molto più complessa da gestire. È tipicamente utilizzata nei [[Digital Signal Processor|DSP]].
 
Entrambe le architetture sono [[architettura di un processore basato su registri generali|architetture basate sui registri generali]].
 
=== Architettura CISC e architettura RISC ===
Quando i transistor disponibili su un solo chip erano pochi e i calcolatori venivano spesso programmati in assembly, era naturale sfruttarli in modo tale da avere CPU con istruzioni potenti, evolute e complesse: più queste erano vicine alle istruzioni dei linguaggi di programmazione ad alto livello più il computer sarebbe stato facile da programmare, e i programmi avrebbero occupato poco spazio in memoria (anch'essa poca e preziosa). Le CPU progettate secondo questo approccio sono dette CISC ed avevano unità di controllo complesse capaci di sfruttare al meglio pochi registri e i cui programmi erano di dimensioni relativamente piccole. A cavallo fra gli anni '70 e gli '80 la situazione però cambiò rapidamente: la [[RAM]] divenne più economica e comparvero i primi compilatori moderni, ottimizzanti, in grado di generare linguaggio macchina molto efficiente: per questo si iniziò a pensare ad un nuovo modo di progettare le CPU, prendendo in esame la possibilità di usare i transistor disponibili per avere invece molti registri e un set di istruzioni elementare, molto ridotto, che delegasse al compilatore il lavoro di tradurre le istruzioni complesse in serie di istruzioni più semplici, permettendo così di avere unità di controllo particolarmente semplici e veloci. Attualmente la distinzione fra queste due classi di architetture è venuta in gran parte meno: il numero di transistor disponibili su un solo chip è aumentato tanto da poter gestire molti registri ed anche set di istruzioni complesse.
 
==== Architettura CISC ====
{{vedi anche|Complex instruction set computer}}
CISC è l'acronimo di ''Complex Instruction Set Computer'': tipicamente un processore di questo tipo implementa un numero relativamente scarso (una decina) di registri di uso generale, ed ha una unità di controllo microprogrammata: la logica del programma è memorizzata in una memoria veloce situata nella parte di controllo, invece di essere espressa tramite una [[rete combinatoria]].
 
CISC è l'acronimo di ''Complexcomplex Instructioninstruction Setset Computercomputer'': tipicamente un processore di questo tipo implementa un numero relativamente scarso (una decina) di registri di uso generale, ede ha una un'unità di controllo microprogrammata: la logica del programma è memorizzata in una memoria veloce situata nella parte di controllo, invece di essere espressa tramite una [[rete combinatoria]].
Il set di istruzioni associato a CPU di tipo CISC è molto esteso e composto in genere di alcune centinaia di codici operativi diversi che svolgono funzioni anche molto complesse, fra cui sono caratteristici i trasferimenti memoria-memoria, assenti nei RISC; le istruzioni hanno lunghezza variabile e possono presentarsi in formati diversi, e sono necessari due o più (a volte molti di più) cicli di [[clock]] per completare un'istruzione; è possibile specificare la posizione dei dati necessari alle istruzioni usando molti [[metodi di indirizzamento]] diversi. Il ridotto numero di registri interni obbliga questi processori a scrivere in memoria ogni volta che si verifica una chiamata di funzione, che si verifica un [[context switch]] o che viene salvato un registro nello [[stack]].
 
Il set di istruzioni associato a CPU di tipo CISC è molto esteso e composto in genere di alcune centinaia di codici operativi diversi che svolgono funzioni anche molto complesse, fra cui sono caratteristici i trasferimenti memoria-memoria, assenti nei RISC; le istruzioni hanno lunghezza variabile e possono presentarsi in formati diversi, e sono necessari due o più (a volte molti di più) cicli di ''[[clock]]'' per completare un'istruzione; è possibile specificare la posizione dei dati necessari alle istruzioni usando molti [[metodi di indirizzamento]] diversi. Il ridotto numero di registri interni obbliga questi processori a scrivere in memoria ogni volta che si verifica una chiamata di funzione, che si verifica ununa [[contextcommutazione di switchcontesto]] o che viene salvato un registro nellonella [[Call stack|pila delle chiamate]].
 
Programmare in Assembly una CPU CISC è un compito (relativamente) facile, perché le istruzioni presenti sono più vicine a quelle dei [[linguaggio di programmazione ad alto livello|linguaggi ad alto livello]].
 
==== Architettura RISC ====
{{vedi anche|Reduced instruction set computer}}
RISC è l'acronimo di ''Reduced Instruction Set Computer''. Il tipico set di istruzioni RISC è molto piccolo, circa sessanta o settanta istruzioni molto elementari (logiche, aritmetiche e istruzioni di trasferimento memoria-registro e registro-registro): hanno tutte lo stesso formato e la stessa lunghezza, e molte vengono eseguite in un solo ciclo di clock. La diretta conseguenza di questa scelta progettuale è che i processori RISC posseggono una unità di controllo semplice e a bassa latenza, riservando invece molto spazio per i registri interni: una CPU RISC ha di solito da un minimo di un centinaio ad alcune migliaia di registri interni generici, organizzati in un file di registri. Il fatto di avere un formato unico di istruzione permette di strutturare l'unità di controllo come una ''[[Pipeline dati|pipeline]]'', cioè una catena di montaggio a più stadi: questa innovazione ha il notevole vantaggio di ridurre il ''critical path'' interno alla CPU e consente ai RISC di raggiungere frequenze di clock più alte rispetto agli analoghi CISC.
 
RISC è l'acronimo di ''Reducedreduced Instructioninstruction Setset Computercomputer''. Il tipico set di istruzioni RISC è molto piccolo, circa sessanta o settanta istruzioni molto elementari (logiche, aritmetiche e istruzioni di trasferimento memoria-registro e registro-registro): hanno tutte lo stesso formato e la stessa lunghezza, e molte vengono eseguite in un solo ciclo di clock. La diretta conseguenza di questa scelta progettuale è che i processori RISC posseggono una un'unità di controllo semplice e a bassa latenza, riservando invece molto spazio per i registri interni: una CPU RISC ha di solito da un minimo di un centinaio ad alcune migliaia di registri interni generici, organizzati in un file di registri. Il fatto di avere un formato unico di istruzione permette di strutturare l'unità di controllo come una ''[[Pipeline dati|pipeline]]'', cioè una catena di montaggio a più stadi: questa innovazione ha il notevole vantaggio di ridurre il ''critical path'' interno alla CPU e consente ai RISC di raggiungere frequenze di clock più alte rispetto agli analoghi CISC.
Nel caso di ''context-switch'' o di chiamata a subroutine o comunque di uso dello stack i RISC spesso invece di accedere alla memoria di sistema usano un meccanismo chiamato ''register renaming'', che consiste nel rinominare i registri in modo da usare per la nuova esecuzione una diversa zona del file di registri, senza dover accedere alla memoria ogni volta.
 
Nel caso di ''context-switch''[[commutazione di contesto]] o di chiamata a subroutine[[Funzione (informatica)|funzione]] o comunque di uso dellodella [[Call stack|pila delle chiamate]] i RISC spesso invece di accedere alla memoria di sistema usano un meccanismo chiamato ''register renaming'', che consiste nel rinominare i registri in modo da usare per la nuova esecuzione una diversa zona del file di registri, senza dover accedere alla memoria ogni volta.
==== Confronto tra architettura RISC e CISC ====
La semplicità dei RISC si traduce in una minore espressività del linguaggio assembly: il numero di word necessarie per esprimere una computazione in una macchina RISC è maggiore/uguale alla controparte CISC: questo si traduce in programmi più grossi, penalità molto alta in altre epoche, in cui la [[RAM]] era una componente costosa e di bassa capacità. L'architettura CISC dipende dal compilatore più di quanto non dipenda il RISC: dato che le istruzioni prevedono più metodi di indirizzamento, e che son presenti istruzioni dalla semantica complessa, al compilatore viene prospettato un ampio ventaglio di scelte per quanto concerne la traduzione di una istruzione, e non sempre la scelta migliore è banale. Come spesso accade nei problemi di ottimizzazione, la scelta della configurazione migliore è un compito [[NP-Completo|NP completo]], e non è pensabile utilizzare un compilatore che, per ogni istruzione, valuti la scelta migliore in base al contesto. Si conoscono solo delle buone [[Euristica|euristiche]], ma il problema dell'ottimizzazione è un problema di ricerca aperto. La stessa macchina CISC può essere dunque più o meno veloce rispetto ad una macchina comparabile RISC in base al compilatore utilizzato.
 
==== Architettura CISCRISC MISC ====
==Temperature d'esercizio==
{{vedi anche|Minimal instruction set computer}}
La temperatura d'esercizio della CPU varia molto da modello a modello; generalmente quelli destinati ai dispositivi portatili hanno un range di funzionamento maggiore e allo stesso modo consumi ridotti rispetto ai modelli destinati alle postazioni fisse.
 
La ''Minimal instruction set computer'' è un'[[Architettura (computer)|architettura]] per [[microprocessore|microprocessori]] basata su un numero minimale di istruzioni.
Le temperature possono essere controllate in vario modo; in alcuni modelli non è necessario il raffreddamento, ovvero non attuabile in modo congeniale per via delle caratteristiche delle macchine che lo devono accogliere o per il fatto che non se ne presenta la necessità come i processori precedenti al [[Intel 80486|486]] (quest'ultimo può funzionare senza dissipatore, ma a frequenze inferiori a 33&nbsp;MHz).
 
==== Confronto tra architettura RISC e CISC ====
I modelli successivi necessitano di un dissipatore passivo, e nella fattispecie i processori [[Pentium]] necessitano anche di una ventola in modo da poter dissipare maggiormente il calore prodotto<ref>[http://web.tiscali.it/newser/Manuali/informatica/Raffreddamento.doc Raffreddamento]</ref>.
La semplicità dei RISC si traduce in una minore espressività del [[linguaggio assembly]]: il numero di word necessarie per esprimere una computazione in una macchina RISC è maggiore/uguale alla controparte CISC: questo si traduce in programmi più grossi, penalità molto alta in altre epoche, in cui la [[RAM]] era una componente costosa e di bassa capacità. L'architettura CISC dipende dal compilatore più di quanto non dipenda il RISC: dato che le istruzioni prevedono più metodi di indirizzamento, e che son presenti istruzioni dalla semantica complessa, al compilatore viene prospettato un ampio ventaglio di scelte per quanto concerne la traduzione di una un'istruzione, e non sempre la scelta migliore è banale. Come spesso accade nei problemi di ottimizzazione, la scelta della configurazione migliore è un compito [[NP-Completo|NP completo]], e non è pensabile utilizzare un compilatore che, per ogni istruzione, valuti la scelta migliore in base al contesto. Si conoscono solo delle buone [[Euristica|euristiche]], ma il problema dell'ottimizzazione è un problema di ricerca aperto. La stessa macchina CISC può essere dunque più o meno veloce rispetto ada una macchina comparabile RISC in base al compilatore utilizzato.
 
== Temperature d'esercizio ==
Per i processori del primo decennio del 2010 esiste anche la thermal throttle, una funzione della scheda madre che permette di ridurre le prestazioni del processore (tramite tensione e altri parametri del processore) qualora esso raggiunga temperature vicine a quelle critiche.
La temperatura d'esercizio della CPU varia molto da modello a modello; generalmente quelli destinati ai dispositivi portatili hanno un range di funzionamento maggiore e allo stesso modo consumi ridotti rispetto ai modelli destinati alle postazioni fisse.
 
Le temperature possono essere controllate in vario modo; in alcuni modelli non è necessario il raffreddamento, ovvero non attuabile in modo congeniale per via delle caratteristiche delle macchine che lo devono accogliere o per il fatto che non se ne presenta la necessità come i processori precedenti al [[Intel 80486|486]] (quest'ultimo può funzionare senza dissipatore, ma a frequenze inferiori a 33&nbsp; MHz).
 
I modelli successivi necessitano di un dissipatore passivo, e nella fattispecie i processori [[Pentium]] necessitano anche di una [[ventola]] in modo da poter dissipare maggiormente il calore prodotto.<ref>[http://web.tiscali.it/newser/Manuali/informatica/Raffreddamento.doc Raffreddamento]</ref>.
 
Con l'aumentare delle prestazioni, e quindi delle frequenze di esercizio, la [[AMD]] ha implementato la funzione [[Cool'n'Quiet]] (attivabile dal [[BIOS]]) che, in assenza di pesanti elaborazioni della CPU, ne riduce la frequenza di lavoro:
== Difetti ==
I processori, come i [[software|programmi informatici]], possono essere affetti da [[bug]], ovvero azioni, comportamenti e risposte non in linea con la logica desiderata o richiestainattesi; tali difetti possono richiedere la sostituzione del componente o l'aggiornamento del [[microcodice]] del processore o la modifica del BIOS o UEFI.
{{Vedi anche|Bug}}
I processori, come i [[software|programmi informatici]], possono essere affetti da [[bug]], ovvero azioni, comportamenti e risposte non in linea con la logica desiderata o richiesta; tali difetti possono richiedere la sostituzione del componente o l'aggiornamento del [[microcodice]] del processore o la modifica del BIOS o UEFI.
 
Uno dei primi bug della storia è stato il [[Pentium FDIV bug]] e il [[Halt and Catch Fire]], mentre allo stato attuale hanno suscitato molto clamore i bug [[Meltdown (vulnerabilità di sicurezza)|Meltdown]] e [[Spectre (vulnerabilità di sicurezza)|Spectre]] che hanno colpito quasi trasversalmente tutte le CPU recenti.<ref>[{{Cita web|url=https://www.qdss.it/bug-nelle-cpu-storia-senza-lieto-fine-approfondimento-5686648 |titolo=I bug nelle CPU: una storia senza lieto fine – Approfondimento]|sito=QDSS.it|accesso=22 maggio 2019|urlarchivio=https://web.archive.org/web/20180116135331/https://www.qdss.it/bug-nelle-cpu-storia-senza-lieto-fine-approfondimento-5686648|dataarchivio=16 gennaio 2018|urlmorto=sì}}</ref>
 
== Note ==
<references />
 
== Bibliografia ==
* {{cita libro|autore=[[Andrew Stuart Tanenbaum]]|titolo=Architettura dei calcolatori. Un approccio strutturale|editore=Pearson Education|città=Milano|anno=2006|url=http://books.google.it/books?id=hK8lJ4BPOYcC|pp=49-65|capitolo=Processori|isbn=978-88-7192-271-3|cid=adc}}
 
== Voci correlate ==
* [[Advanced Configuration and Power Interface|ACPI]]
* [[Architettura dei calcolatori]]
* [[Computer]]
* [[Circuito integrato]]
* [[CPUID]]
* [[CPU cache]]
* [[Clock]]
* [[Instruction set]]
* [[Microprocessore]]
* [[Multiprocessore]]
* [[Microcontrollore]]
* [[CPU cacheOverclocking]]
* [[Velocità di clockTransistor]]
* [[CPUIDUnderclocking]]
* [[Advanced Configuration and Power Interface|ACPI]]
 
== Altri progetti ==
{{interprogetto|commons=Category:Microprocessors|wikt=CPU|preposizione=sulla}}
 
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{cita web|url=http://www.sciencystuff.com/?p=24|titolo=Uno sguardo più da vicino ad un processore|lingua=en}}
* {{FOLDOC|central processing unit}}
* {{cita web|http://www.tomshw.it/cont/articolo/intel-mostra-come-si-costruisce-un-processore/22605/1.html|Articolo illustrato sulla fabbricazione di una CPU (in breve)}}
* {{cita web |url 1 = http://www.tomshw.it/cpucont/articolo/intel-mostra-come-si-costruisce-un-processore/22605/1.php?guide=20070425html |titolo 2 = Articolo illustrato sulla fabbricazione di una CPU (più in dettagliobreve) | accesso = 3 novembre 2009 | urlarchivio = https://web.archive.org/web/20091104233346/http://www.tomshw.it/cont/articolo/intel-mostra-come-si-costruisce-un-processore/22605/1.html | dataarchivio = 4 novembre 2009 | urlmorto = sì }}
* {{cita web|url=http://www.tomshw.it/cpu.php?guide=20070425|titolo=Articolo illustrato sulla fabbricazione di una CPU (più in dettaglio)|accesso=3 novembre 2009|urlarchivio=https://web.archive.org/web/20070611133911/http://www.tomshw.it/cpu.php?guide=20070425|dataarchivio=11 giugno 2007|urlmorto=sì}}
* {{en}}[httphttps://sourceforge.net/projects/johnnysimulator/ JOHNNY] Emulatore macchina di von Neumann particolarmente per l'insegnamento (Open Source)
* [https://web.archive.org/web/20160305215703/http://harvardmachine.it/ Harvard Machine 74] CPU con architettura Harvard a 8 bit realizzata con tecnologia TTL
* {{cita web|url=https://spectrum.ieee.org/the-surprising-story-of-the-first-microprocessors|titolo=The Surprising Story of the First Microprocessors|accesso22 gennaio 2024|lingua=en|sito=spectrum.ieee.org}}
* {{Treccani|cpu}}
 
{{Componenti basilari dei computer}}