Il PC o Personal Computer è senza dubbio il tipo di sistema di elaborazione più conosciuto e utilizzato da molti anni a questa parte; grazie al suo avvento, risalente agli anni '80 del secolo scorso, si è assistito alla diffusione dell'informatica come fenomeno di massa.
In questa sede non ci soffermiamo sulla storia di questo strumento, sui motivi del suo successo e sulle prospettive future relative al suo utilizzo, ma prendiamo brevemente in esame i suoi componenti fondamentali esaminando le tecnologie su cui essi sono basati e i loro principi di funzionamento.
Questo capitolo è dedicato alla scheda madre a ai processori; nel capitolo 4 si prendono in esame le memorie centrali e le periferiche.
Essendo il settore dei PC in continua e velocissima evoluzione, è bene chiarire che le tecnologie illustrate in questo capitolo sono quelle in essere nella prima metà del 2008; sicuramente nel giro di qualche mese alcune di esse saranno superate o sostituite da altre più innovative. Quello che resta però valido è il modello della macchina di Von Neumann che rimane alla base della struttura logica anche degli attuali Personal Computer; possiamo dire che essi sono una moderna evoluzione delle idee di Von Neumann e al loro interno troviamo ancora, tra gli altri componenti, gli elementi fondamentali che erano presenti nel modello: unità di controllo e di calcolo (riunite nella CPU), memoria centrale (RAM), bus di comunicazione, dispositivi periferici o di I/O (input/output). |
La scheda madre (main board) è sicuramente un componente fondamentale di un PC in quanto ha il compito di coordinare i passaggi di informazioni fra i vari dispositivi e costituisce anche il supporto fisico cui tali dispositivi sono inseriti o collegati.
La sua scelta è importante perché è fortemente legata a quella della CPU; infatti un certo modello di processore potrà essere utilizzato solo su schede madri progettate per accoglierlo e non su altre di tipo diverso.
Anche la scelta del tipo e della quantità di memoria RAM utilizzabile dipende fortemente dalle caratteristiche della scheda madre, mentre per altri dispositivi c'è un legame meno stretto (ad esempio se una scheda dispone di slot PCI dovrebbe poter accogliere qualsiasi scheda compatibile con questo standard).
La scheda madre è costituita da un circuito stampato o PCB (Printed Circuit Board) con nucleo centrale in fibra di vetro di forma rettangolare su cui scorrono, su più livelli, delle piste in rame.
Viene usata la fibra di vetro, che è un cattivo conduttore, per fare in modo che i vari componenti della scheda siano isolati l'uno dall'altro.
Il circuito stampato è formato da una struttura laminare con quattro strati per il trasporto del segnale, uno strato di alimentazione, uno strato di terra, intervallati da strati isolanti.
Nei quattro strati di segnale si trovano le tracce in rame, assimilabili a dei fili elettrici, che uniscono punti diversi del circuito stampato (sono i bus di cui abbiamo parlato in precedenza); ovviamente il disegno delle tracce è realizzato in fabbrica in modo automatico grazie ad appositi programmi.
In alcuni casi il segnale deve passare da uno strato all'altro transitando su tracce di livelli diversi e questo è reso possibile dalla presenza delle vie, cioè di piccoli fori metallizzati che attraversano il PCB.
Gli strati di alimentazione e di terra servono ovviamente a distribuire l'alimentazione e il collegamento a terra su tutta la superficie del PCB.
Le tracce e le vie costituiscono lo schema elettrico della scheda madre e confluiscono nelle cosiddette piazzole di montaggio cioè le zone in cui vengono saldati i vari componenti.
Il montaggio di questi ultimi avviene grazie a due tecnologie:
SMT (Surface Mounting Technology): è la modalità più moderna e permette di montare i componenti a contatto diretto con la superficie ottenendo un risparmio di spazio; è completamente automatizzata e utilizzata per molti chip di piccole e medie dimensioni;
PTH (Plated Throug Hole): è la modalità tradizionale che prevede il posizionamento manuale con successiva saldatura automatizzata; viene utilizzata per i vari tipi di connettori, socket, slot, porte e per i condensatori discreti.
Gli elementi appena citati (connettori, slot, socket porte) servono a collegare alla scheda madre la CPU, la RAM, le varie periferiche.
I componenti o chip (elementi in plastica nera o ceramica della grandezza di un francobollo con piedini o PIN in metallo) direttamente saldati sulla scheda sono ad essa indissolubilmente legati e non possono essere sostituiti.
Nella figura 2.1 viene proposto un esempio di scheda risalente al 2006 circa (con socket per Pentium IV); le lettere sono state inserite per contrassegnare i vari componenti a cui faremo riferimento nel proseguo.
Uno dei compiti della scheda madre è quello di distribuire l'alimentazione ai vari componenti del sistema, sia che siano saldati sul PCB, sia che siano collegati in vario modo.
Essa viene alimentata dall'alimentatore del PC grazie al connettore a 24 poli contrassegnato dalla lettera A di figura 2.1 ed eventualmente grazie ad un secondo connettore a 4 o 8 poli posto vicino al socket e dedicato all'alimentazione del processore.
Sulla scheda madre sono poi presenti dei circuiti di trasformazione che servono a alterare le tensioni fornite dall'alimentatore per quei componenti che funzionano con tensioni non standard.
Nel caso di alcuni dispositivi che necessitano di molta energia (ad esempio dischi fissi e lettori ottici) l'alimentazione arriva, grazie ad appositi cavi, direttamente dall'alimentatore.
Quest'ultimo è un componente molto importante perché deve trasformare la corrente alternata da 220 volts della normale rete elettrica in corrente continua da 12 volts (per i dischi fissi dei PC non portatili), 5 e 3,3 volts (per la maggior parte degli altri componenti) e deve essere di potenza adeguata in base alla quantità di dispositivi presenti nel sistema e alle loro esigenze energetiche.
Le schede madre si differenziano per il fattore di forma che è un insieme di informazioni su forma, dimensione, disposizione dei componenti.
Durante la storia dei PC i fattori di forma si sono via via evoluti con l'obiettivo di razionalizzare la disposizione dei componenti interni della macchina e di migliorare i flussi d'aria interni per facilitare il raffreddamento dei dispositivi più soggetti a surriscaldarsi (CPU, dischi fissi).
Attualmente i fattori di forma più diffusi sono ATX, DTX, ITX in varie versioni; questa varietà è dovuta alla necessità di rispondere a esigenze specifiche di sistemi con caratteristiche fisiche molto diverse: server, workstation, compatti, ultracompatti e altri ancora.
Senza illustrare le caratteristiche di tutti i vari formati citiamo solo le dimensioni in millimetri del formato ATX standard e del formato più piccolo, il «Pico-ITX»: 305x244 e 100x72 rispettivamente.
Su ogni scheda madre è presente un insieme di circuiti che prende il nome di chipset con lo scopo di supportare la CPU, la memoria, la cache e di assicurare le comunicazioni attraverso i bus.
Si deve sottolineare che un chipset è realizzato per il supporto ad una specifica famiglia di processori, cosa che contribuisce a rendere esclusivo il legame fra un certo modello di scheda madre e un certo tipo di CPU.
Nei casi più comuni il chipset è costituito da due soli chip:
northbridge: ha il compito di interfacciarsi con i componenti più veloci (CPU, memoria, interfaccia grafica AGP o PCI-Express);
southbridge: si interfaccia con i componenti meno veloci (slot PCI, canali EIDE, porte USB ecc.)
Fra i due il chip più importante è sicuramente il northbridge che è anche quello che si differenzia in base al processore (ci sono cioè dei chipset diversi in cui il southbridge è lo stesso), è più veloce e realizzato con una tecnologia più «spinta» e quindi spesso necessita di un dispositivo di raffreddamento.
A tale proposito specifichiamo che i dispositivi di raffreddamento possono essere attivi come le ventole, o passivi come i dissipatori; sul northbridge viene di solito applicato un dissipatore e questo permette anche di distinguerlo dal southbridge che ne è sprovvisto.
Nella figura 2.1 i due chip sono contrassegnati rispettivamente dalle lettere B (coperto dal dissipatore) e C.
Nella figura 2.2 vediamo invece uno schema dei collegamenti del chipset.
|
Il bus di sistema è il bus (indirizzi, dati e controllo) utilizzato dai componenti veloci della macchina ed è suddiviso in FSB (Front Side Bus) che collega la CPU, la memoria e la scheda video al northbridge e BSB (Back Side Bus) che collega la CPU alla memoria cache.
I bus di I/O sono gestiti dal southbridge e ne esistono vari tipi.
Tutti questi bus e, come già sappiamo, anche la CPU, funzionano in modo sincrono grazie alla presenza di dispositivi di temporizzazione chiamati clock.
Il clock più «famoso» è quello della CPU, ma il più importante è quello del FSB in quanto gli altri vengono impostati in base ad esso: il clock della CPU come multiplo (anche non intero) e quello del bus di I/O come sottomultiplo.
Si noti anche che il bus più veloce in assoluto è il BSB che lavora alla stessa frequenza della CPU.
Nei sistemi più recenti il FSB viene sostituito da bus più veloci come HyperTransport di AMD e QPI (Quick Path Interconnect) di Intel in grado di assicurare un tasso di trasferimento dati di 4,8 o 6,4 GBps contro 1,6 GBps del FSB.
Esaminiamo ora brevemente alcuni bus di I/O tralasciando i vecchi bus ISA (Industry Standard Architecture), EISA (Extended ISA), VESA (Video Electronics Standards Association), caduti in disuso ormai da alcuni anni:
PCI (Peripheral Component Interconnection): collega il northbridge al southbridge e mette a disposizione degli slot di espansione (contrassegnati dalla lettera D nella figura 2.1) in cui inserire schede audio, schede di rete o di altro tipo; inizialmente il bus aveva ampiezza di 32 bit, velocità di 33 Mhz e banda massima di 133 MBps (Mega Byte per secondo) tutti parametri incrementati nelle versioni successive fino ai valori rispettivamente di 64 bit, 66 Mhz e 533 MBps;
PCI-X (PCI eXtended): sviluppato per schede di livello superiore che equipaggiano workstation grafiche o server; attualmente questo bus ha raggiunto una larghezza di 64 bit, una velocità di 533 Mhz e una banda massima di 4266 MBps;
AGP (Accelerated Graphics Port): pur essendo un evoluzione dello slot PCI non è da considerare un bus ma un collegamento punto a punto tra la scheda grafica (che quindi deve essere unica in ogni PC) e il northbridge; è stato inventato per soddisfare le grosse esigenze di velocità e di banda disponibile della grafica a tre dimensioni passando dalla prima versione (AGP 1X) con banda di 266 MBps alla più recente (AGP 8X) con banda di 2,1 GBps; il suo colore è grigio o verde ed è quello indicato con la lettera E nella figura 2.1;
PCMCIA (Personal Computer Memory Card International Association): è il bus per connettere schede (del formato di una carta di credito) ai PC portatili o notebook; attualmente sta perdendo di importanza in quanto da un lato alcune funzionalità un tempo assicurate da tali schede sono ora integrate nelle schede madri, mentre altre si ottengono collegando dispositivi alle porte esterne USB;
PCI Express: è il successore del PCI e del PCI-X; è con essi retro compatibile ma ne modifica ampiamente il funzionamento in quanto il trasferimento dati è seriale e non più parallelo, ha velocità di clock più alte ed è bidirezionale in simultanea.
Diamo qualche altra informazione sul nuovo bus PCI Express: gli slot PCI Express possono essere 1X, 8X, 12X, 16X, con frequenza di clock da 5Ghz a 80 Ghz e banda da 250 MBps a 4 GBps; gli slot 8X e 12X si trovano soprattutto sui server mentre i 16X sono dedicati alle schede grafiche, in sostituzione del vecchio slot AGP, e possono essercene due in ogni scheda madre dando quindi la possibilità di installare due schede grafiche dividendo tra esse il carico di lavoro.
La modifica più rilevante dovuta all'introduzione del PCI Express è però a livello di progettazione del chipset, in quanto il nuovo bus si colloca (almeno in parte) a un livello più alto (è collegato al northbridge) rispetto al vecchio PCI (collegato al southbridge).
Il nuovo standard mette a disposizione un certo numero di canali seriali bidirezionali (lanes), ad esempio 20, che possono essere aggregati in un gruppo da 16 (16X) per la scheda grafica, collegato al northbridge, e quattro gruppi da 1 (1X) per i normali slot PCI Express, collegati al southbridge.
I connettori PCI Express crescono di dimensione dal 1X al 16X e sono tra loro compatibili in senso crescente (cioè una scheda 1X può essere collegata ad uno slot 12X ma il viceversa è ovviamente impossibile).
Nella scheda madre di figura 2.1 non ci sono slot di questa nuova generazione; essi sono comunque ancora di colore bianco come i PCI ma con il lato corto dello slot posto al contrario in modo che sia impossibile inserire una scheda PCI in uno slot PCI Express o viceversa.
In una scheda madre si trovano di solito una serie di componenti direttamente integrati; questo permette di risparmiare sui costi del sistema ma impedisce la loro sostituzione; come esempi possiamo citare il chip audio, il chip di rete e, in caso di sistemi particolarmente economici e/o portatili, il chip grafico.
La presenza di un chip integrato non impedisce comunque l'utilizzo di una scheda di espansione, presumibilmente più potente, che lo sostituisca dal punto di vista funzionale: ad esempio possiamo senz'altro installare una scheda audio PCI, con caratteristiche di gestione del suono professionali, da usare al posto del chip audio integrato (in tal caso può essere necessario disattivare quest'ultimo dalle impostazioni del BIOS della macchina).
Concludiamo questo breve esame di una scheda madre di un PC indicando la posizione nella figura 2.1 di alcuni altri elementi importanti il cui ruolo verrà approfondito nei paragrafi successivi: con la lettera F è indicato il socket per l'alloggiamento della CPU; con la lettera G gli slot per inserire i moduli di memoria RAM; con la lettera H i connettori EIDE per i dischi; con la lettera I il connettore per il lettore di dischetti; con la lettera J l'alloggiamento per la batteria a bottone utile tra l'altro per la conservazione della data e dell'ora di sistema; con le lettere K alcune connessioni e porte esterne, da sinistra a destra: porte PS2 per tastiera e mouse, porte parallele e seriali, porte USB, connessioni audio.
La storia dei processori è indissolubilmente legata a quella dell'azienda Intel creatrice nel 1971 del 4004, la prima CPU, nel 1981 dell'8086 che ha equipaggiato i primi PC, e tutt'ora maggiore produttrice mondiale di microprocessori; qui si farà dunque principalmente riferimento alle CPU della famiglia x86 di cui è capostipite, appunto, l'8086 e che comprende tutte le CPU fino al Pentium IV rimasto in produzione fino al 2006 nonché i moderni processori a 64 bit con core multipli.
Questo non significa che non esistano processori prodotti da altre aziende, basti citare gli «storici» Zilog Z80 e Motorola 68000; nel settore degli attuali PC sono abbastanza diffuse le CPU prodotte dalla AMD, che sono compatibili con quelle della Intel.
In queste dispense non vogliamo entrare nei dettagli delle caratteristiche dei vari nodelli di microprocessori Intel (e AMD) che si sono via via succeduti o che sono attualmente in commercio, anche perché queste informazioni sono già obsolete o destinate a diventarlo in breve tempo, ci limitiamo invece ad esporre i concetti di base sulla loro realizzazione, la loro architettura interna e il loro funzionamento.
Un microprocessore è un core inserito in un package di ceramica (figura 2.3) e contenente milioni di transistor che si possono considerare raggruppati in:
unità di controllo e di predizione delle istruzioni;
unità di esecuzione o ALU e unità per i calcoli in virgola mobile o FPU (Floating Point Unit);
memoria locale, costituita dall'insieme dei registri;
memoria cache di primo livello o L1;
interfaccia di collegamento con l'esterno o FSB (Front Side Bus).
Notiamo che la FPU non è sempre stata integrata nella CPU; ciò è avvenuto, per i processori Intel, a partire dal 80486, prima era un chip separato e opzionale chiamato coprocessore matematico (ad esempio per l'80386 esisteva il coprocessore 80387).
Nei processori moderni invece troviamo integrate addirittura più FPU (oltre che più ALU).
Le caratteristiche più rilevanti dei processori possono essere così elencate:
ampiezza in bit dei registri;
frequenza del clock;
tecnologia costruttiva;
il numero di piedini (pin);
gestione della memoria;
architettura;
tipo di istruzioni eseguibili.
Riguardo all'ampiezza in bit dei registri si è passati dai 4 bit del processore 4004, ai 16 bit dell'8086, ai 32 bit della famiglia IA-32 (Intel Architecture 32), comprendente tutti i processori dal 80386 del 1985 ai Pentium IV, per arrivare ai 64 bit dei processori multicore Intel 64 o dei processori IA-64 (Intel Architecture 64) come l'Itanium.
Quando si afferma che una CPU è «a x bit» si intende proprio dire che l'ampiezza dei suoi registri è x bit; quindi le attuali CPU a 64 bit hanno registri di tale dimensione; l'ampiezza dei bus dati e indirizzi invece non è determinante a questo proposito (ci si può rendere conto di questo osservando i dati contenuti nella tabella 2.6 presente nel paragrafo 2.2.8 sulle generazioni delle CPU).
La frequenza del clock della CPU ha avuto continui incrementi: l'8086 aveva un clock a 8 Mhz, il valore massimo si è raggiunto nel 2005 con il Pentium IV Extreme Edition con clock a 3,72 Ghz, poi i produttori di CPU hanno cessato di spingere verso l'alto la frequenza del clock per i motivi che vedremo nel paragrafo 2.2.9 dedicato ai processori con core multipli.
Ricordiamo comunque che la frequenza del clock della CPU deve essere un multiplo, anche non intero, della frequenza del FSB della scheda madre e questo è un altro elemento che lega fortemente una CPU alla scheda che la ospita.
La parte funzionale di una CPU è il core grande qualche millimetro quadrato e ottenuto immergendo un cristallo purissimo di silice in un bagno di silice in un ambiente sterile ed estraendolo con molta lentezza; questo permette di ottenere un cilindro di silice purissima che viene poi tagliato, con lame di diamante, in dischi del diametro di 30 cm chiamati wafer (figure 2.4 e 2.5).
Su tali dischi vengono creati i transistor e i collegamenti su vari livelli o layer, grazie a ripetuti processi di fotolitografia e drogaggio.
Con la fotolitografia, grazie a delle maschere e a una apposita luce, viene rimosso il silicio dalle parti non mascherate creando così i circuiti secondo l'impronta delle maschere.
I transistor vengono poi collegati, a livelli superiori, con minuscoli fili in rame che devono essere necessariamente isolati in uno spazio ristrettissimo; per questo viene usato il silicio drogato con apposite sostanze in modo da evitare qualsiasi conduzione di corrente e da avere una elevata resistenza al calore che si sviluppa all'interno della CPU.
Al termine, i singoli chip che sono stati creati, denominati die vengono tagliati dal disco e montati sul supporto ceramico o package.
I transistor di un core vengono misurati in base alla lunghezza del canale di gate; minore è questa lunghezza, misurata in micron, e meglio è, in quanto diminuisce la distanza tra drain e source (qui non approfondiamo ulteriormente natura e funzionamento di un transistor) con i seguenti vantaggi:
maggiore velocità della CPU;
minore dissipazione di energia perché ci sono minori capacità parassite;
minore tensione di lavoro e quindi minore consumo di energia (e minore surriscaldamento).
Si parla di «tecnologia costruttiva» di un core intendendo la grandezza in micron dei transistor al suo interno; questa grandezza è in costante diminuzione e comporta il parallelo incremento del numero di transitor contenuti nel processore.
Le tecnologie più recenti sono state a 0,09 micron (o 90 nanometri) per gli ultimi Pentium IV e 0,065 micron (o 65 nanometri) per i nuovi processori a doppio core che contengono circa 300 milioni di transistor e permettono di inserire nel package anche la memoria cache L2 e L3, oltre alla L1 che era già inglobata da molto tempo.
Attualmente Intel è già passata alla tecnologia a 0,045 micron mentre AMD prevede di adeguarsi a fine 2008.
Per rendersi conto di quali limiti stia raggiungendo la tecnologia produttiva dei microprocessori si pensi che nei transistor di 45 nanometri il gate ha uno spessore di 1 nanometro corrispondente a soli 4-5 atomi di silicio (ogni atomo di silicio misura 0,22 nanometri).
A questo proposito è interessante anche citare la legge di Moore concepita nel 1965 da Gordon Moore che tre anni dopo sarebbe stato uno dei fondatori della Intel; si tratta di una legge empirica che nella sua prima versione afferma: «il numero dei transistor in un processore raddoppia ogni 12 mesi».
Questa legge si è dimostrata sostanzialmente corretta anche se venti anni dopo è stata leggermente rivista assumendo la seguente forma: «le prestazioni dei processori raddoppiano ogni 18 mesi».
Grazie ai continui miglioramenti nella tecnologia realizzativa delle CPU si è potuta abbassare anche la tensione di alimentazione (cosa molto importante specialmente per i notebook); le prime CPU venivano alimentate con tensioni di 5 volts, attualmente siamo scesi sotto i 2 volts.
Riguardo ai piedini (pin) si deve notare che i processori più recenti non hanno più i pin ma dei fori sul package; infatti i vecchi package PGA (Pin Grid Array) sono stati sostituiti dai LGA (Land Grid Array) per i quali è previsto che i pin siano sul socket della scheda madre.
Ovviamente un processore può essere installato solo su un socket adatto ad ospitarlo; a tale proposito i socket sono identificati da un numero che non è altro che la quantità di fori (o di pin) presenti sul socket stesso.
Nella figura 2.1 il socket è indicato con la lettera F.
La quantità di memoria gestibile dipende dall'ampiezza del bus indirizzi: si va dai 20 bit dell'8086, ai 32 o 36 bit delle CPU IA-32, ai 64 bit dei processori attuali.
I processori Intel usano, per la memorizzazione, la convenzione little endian con l'eccezione delle CPU Intel Itanium, per le quali può essere scelta anche la convenzione big endian impostando opportunamente un bit del registro di stato.
Inoltre le CPU Intel (e compatibili) gestiscono la memoria in modo segmentato cioè tramite la sua suddivisione in parti, chiamate appunto segmenti; una cella in questo caso viene individuata indicando l'indirizzo iniziale del segmento e l'offset della cella, cioè la sua distanza dall'inizio del segmento; questi valori vengono espressi solitamente in esadecimale nella forma «segmento:offset».
Questa organizzazione si contrappone a quella lineare o piatta (flat) adottata ad esempio dalle CPU Motorola, nella quale ogni cella è individuata semplicemente dal suo indirizzo.
Il motivo di questa scelta, operata dalla Intel, che comporta una gestione della memoria senz'altro molto più complessa, va fatto risalire all'avvento dell'8086: in esso infatti il bus indirizzi era di 20 bit e quindi la memoria gestibile ammontava a 1 MB; per conservare la retro compatibilità con il processore precedente, l'8080 che era a 8 bit ma aveva il bus indirizzi a 16 bit e quindi una memoria indirizzabile di 64 KB, fu deciso di dividere idealmente la memoria dell'8086 in 65536 segmenti parzialmente sovrapposti grandi ognuno 64 KB.
Questo è anche il motivo per cui tutti i processori Intel e compatibili prevedono un insieme di registri che si chiamano registri di segmento.
Per individuare a quale cella fisica di memoria corrisponda un indirizzo espresso in modo segmentato occorre effettuare un semplice calcolo: si moltiplica per 16 l'indirizzo del segmento (a questo scopo basta aggiungere uno zero alla sua destra) e poi si somma con l'offset.
A titolo di esempio consideriamo l'indirizzo segmentato A0E3:1B56, e facciamo quindi la somma tra A0E3016 e 1B5616 ottenendo A298616.
Come detto i segmenti di memoria dell'8086 sono parzialmente sovrapposti e ognuno inizia 16 locazioni di memoria dopo il precedente; come conseguenza di questo fatto abbiamo che una stessa cella di memoria può essere referenziata in più modi, con indirizzi segmentati diversi.
Notiamo anche che le CPU x86 sono non ortogonali intendendo per ortogonale un processore in cui i registri sono non specializzati.
Ad esempio nell'8086 abbiamo 14 registri con ruoli ben definiti (che qui non vengono approfonditi):
4 registri di segmento: CS (Segmento Codice o istruzioni), DS (Segmento Dati), SS (Segmento Stack), ES (Segmento Extra dati);
4 registri accumulatori o generali: AX, BX, CX, DX, di cui si possono utilizzare anche le rispettive metà, «alta» e «bassa», da 8 bit, identificate con AH, AL, BH, BL, CH, CL, DH, DL;
2 registri indice: DI e SI;
2 registri per la gestione della pila o stack: SP (Stack Pointer) e BP (Base Pointer);
il registro FLAGS o registro di stato;
il registro contatore di programma, qui denominato IP (Instruction Pointer).
Con il passaggio all'architettura dei processori a 32 bit, denominata IA-32 e il cui capofila è stato l'80386, ci sono molte novità che riguardano i registri e la gestione della memoria, ma molte caratteristiche rimangono inalterate (ad esempio la non ortogonalità).
I registri aumentano di numero e assumono un'ampiezza di 32 bit, salvo qualche eccezione come per i registri di segmento che assumono il nome di registri selettori e ai quali si aggiungono due ulteriori registri per segmenti extra: FS e GS.
I registri accumulatori, il registro di stato e quelli usati come offset diventano tutti a 32 bit e il loro nome cambia con l'aggiunta di una «e» iniziale; abbiamo quindi: EIP, ESP, EBP, ESI, EDI, EFLAGS, EAX, EBX, ECX, EDX.
Per i registri accumulatori rimane valida la possibilità di un uso parziale che anzi si amplia: abbiamo infatti EAX, EBX, ECX, EDX a 32 bit ma si possono ancora usare AX, BX, CX, DX per usufruire delle rispettive loro parti basse di 16 bit, a loro volta divisibili nelle sezioni da 8 bit come in precedenza.
La successiva evoluzione verso i 64 bit, con l'architettura x86-64, ha portato l'ampiezza dei registri, appunto, a 64 bit con le seguenti caratteristiche:
i nomi dei registri sono gli stessi di prima con una «R» al posto della «E»;
ci sono ulteriori otto «registri estesi» indicati con le sigle da R8 a R15;
rimane la possibilità dell'uso parziale (porzioni di 8, 16, 32 bit, ad esempio AL o AH, AX, EAX nel caso di RAX) dei registri accumulatori e dei registri indice;
per questi ultimi diviene possibile usare anche il solo byte meno significativo, (ad esempio per RSP si può usare anche SPL oltre a ESP e SP) cosa non prevista nelle CPU x86.
Riguardo alla memoria rimane la possibilità di gestirne 1 MB in modo segmentato come nell'8086 (si dice allora che si lavora in modalità reale); la novità è però la modalità protetta nella quale si gestiscono 4 GB di memoria (e molti di più con le CPU a 64 bit) con indirizzi nella forma selettore:offset chiamati indirizzi virtuali.
Questo nome dipende dal fatto che non è detto che tali indirizzi corrispondano a reali indirizzi fisici di memoria (solo da pochi anni i comuni Personal Computer hanno una dotazione di memoria centrale di qualche GB); i processori sono infatti in grado di gestire la memoria virtuale con un meccanismo detto di paginazione dinamica sfruttato poi in modo opportuno anche dai moderni sistemi operativi.
Questo argomento richiederebbe notevoli approfondimenti che però esulano dagli scopi di queste dispense.
Concludiamo citando, per i processori a 32 bit, la tabella dei descrittori, alle cui righe si riferiscono i registri selettori e che contiene indirizzi iniziali e dimensioni dei vari segmenti; questi ultimi hanno infatti dimensione variabile (massimo 4 GB).
Di ogni selettore solo 13 dei 16 bit sono usati per individuare una riga della tabella; i segmenti sono quindi al massimo 8192.
Gli indirizzi virtuali nella forma selettore:offset con offset a 32 bit, vengono tradotti in indirizzi lineari a 32 bit che, come detto, non è detto che corrispondano direttamente a indirizzi fisici di memoria.
Le architetture dei processori possono essere classificate in base al grado di parallelismo che permettono in fase di elaborazione; abbiamo le seguenti possibilità:
SISD (Single Instruction Single Data): viene eseguita una istruzione alla volta e si preleva e memorizza in memoria un solo dato alla volta; questa in pratica è l'architettura «classica», sequenziale proposta da Von Neumann ma ormai non più adottata in nessuna CPU reale;
MISD (Multiple Instruction Single Data): vengono eseguite istruzioni diverse contemporaneamente, ognuna sui propri dati (meccanismo del pipelining);
SIMD (Single Instruction Multiple Data): viene eseguita contemporaneamente la stessa operazione su più dati; è quello che avviene grazie alle istruzioni MMX (MultiMedia eXtension) introdotte da Intel all'epoca del processore Pentium per accelerare le applicazioni multimediali e poi migliorate, a partire dal Pentium III, dalle istruzioni SSE (Streaming SIMD Enhancement);
MIMD (Multiple Instruction Multiple Data): è l'architettura dei sistemi multiprocessore (o multicore) in cui ogni processore può operare autonomamente; in questo caso si parla di elaborazione parallela.
Soffermiamoci in particolare sull'architettura MISD basato sul concetto di pipeline o catena di montaggio.
L'obiettivo è quello di diminuire il tempo di elaborazione di un insieme di istruzioni senza aumentare il numero di processori coinvolti (senza ricorrere cioè al calcolo parallelo): si considerano le operazioni da svolgere come scomponibili in parti più elementari o fasi e l'unità di elaborazione organizzata in n stadi collegati in sequenza proprio come nelle catene di montaggio con ogni stadio specializzato a eseguire una certa fase; in questo modo, a regime, tutti gli stadi operano contemporaneamente su fasi diverse della stessa o di diverse istruzioni e ogni stadio elabora i dati forniti dal precedente passando i suoi risultati al successivo.
Un primo esempio di pipelining si è avuto già nel processore 8086 che era dotato di una unità di prefetch e di una omonima coda, con lo scopo di prelevare dalla memoria un certo numero di istruzioni mentre un'altra istruzione veniva decodificata e eseguita.
Il meccanismo è stato poi sviluppato e potenziato fino ad arrivare alla pipeline a 31 stadi degli ultimi modelli di Pentium IV.
L'adozione della pipeline comporta però anche dei problemi:
problemi strutturali: dovuti al fatto che alcune risorse del sistema di elaborazione possano dover essere condivise tra i vari stadi intralciando quindi l'esecuzione contemporanea delle varie fasi;
problemi di dipendenza dei dati: una fase successiva necessita di un dato che però ancora la fase precedente non ha prodotto;
problemi di dipendenza dal controllo: se durante l'esecuzione si incontra un salto le operazioni già eseguite nella pipeline sono inutili e la pipeline deve essere svuotata.
Questi inconvenienti possono portare alla necessità che alcuni stadi rimangano inattivi o meglio si pongano in esecuzione di una bolla cioè di una operazione che non fa niente, al solo scopo di attendere di poter riprendere le operazioni valide.
Il terzo tipo di problemi è il più grave, tanto che i moderni processori sono equipaggiati con un sistema di predizione dei salti (branch prediction) grazie al quale si tenta di «indovinare» in quale direzione proseguirà l'elaborazione riempendo la pipeline di conseguenza.
Nei processori più moderni, non solo viene stimato quali saranno le successive istruzioni, ma ne viene anche calcolato il risultato, aumentando il guadagno in prestazioni in caso di predizione corretta; in questo caso si parla di esecuzione speculativa.
In ogni caso la spinta a utilizzare pipeline sempre più lunghe si è esaurita e nei nuovi processori Intel a doppio core la troviamo a 14 stadi; questa lunghezza è evidentemente un punto di equilibrio che permette di avere i vantaggi della tecnica del pipelining riducendo al minimo i problemi sopra illustrati.
Chiudiamo questo paragrafo con la definizione di processore super scalare che si ha quando sono presenti più pipeline che vengono gestite in parallelo grazie ad esempio alla presenza di più unità di calcolo (il primo esempio in questo senso è stata la CPU Pentium).
In precedenza (paragrafo 1.3.3) abbiamo visto come l'esecuzione delle istruzioni può essere effettuata via hardware grazie ad opportuni circuiti, oppure (almeno in parte) tramite l'esecuzione di microprogrammi cablati nei circuiti.
Grazie all'uso dei microprogrammi è però anche possibile dotare le CPU di un repertorio di istruzioni molto complesse e di lunghezza variabile che svolgano il lavoro di molte istruzioni semplici; in questo modo si hanno istruzioni lunghe da eseguire e processori molto complessi, ma il numero di istruzioni da usare per svolgere le elaborazioni è basso.
Le CPU realizzate secondo questo criterio vengono dette CISC (Complex Instruction Set Computer).
I vantaggi delle CPU CISC sono tutti dalla parte dei programmatori che devono scrivere programmi a basso livello e che hanno a disposizione istruzioni più potenti per tale scopo.
Dal punto di vista delle prestazioni invece la situazione non è ottimale in quanto ogni istruzione complessa necessita di moltissimi cicli di clock per essere eseguita.
Partendo da questa considerazione è nata l'idea dei processori RISC (Reduced Instruction Set Computer) nei quali si utilizzano istruzioni semplici, di lunghezza fissa, che non operano direttamente in memoria ma solo con i registri, eseguite interamente via hardware e molto veloci da eseguire (anche più di una per ogni ciclo di clock).
Questa idea è stata anche supportata da una ricerca che ha dimostrato che in una CPU solo il 20% delle istruzioni compiono l'80% del lavoro; ci si è quindi concentrati a ottimizzare e rendere veloci questo 20% di istruzioni.
Inoltre istruzioni molto semplici, veloci e di lunghezza fissa permettono di ottimizzare l'efficienza delle pipeline.
Con i processori RISC il lavoro della CPU al momento dell'esecuzione è molto semplificato ma la complessità si sposta nella produzione del software in quanto il programmatore (a basso livello) ha a disposizione istruzioni molto meno potenti.
D'altra parte solo pochi programmi vengono oggi scritti direttamente con i linguaggi di basso livello (assembly); la maggior parte viene realizzata con linguaggi di programmazione avanzati, in cui quindi la maggiore complessità della programmazione RISC ricade su quegli strumenti automatici (compilatori) che devono tradurre i programmi in forma eseguibile per il processore.
Attualmente la disputa fra i sostenitori delle soluzioni RISC e CISC si è spenta e i moderni processori adottano soluzioni miste come la EPIC (Escpicitly Parallel Instruction Computing) degli Intel Itanium in cui si hanno istruzioni semplici di lunghezza fissa combinate insieme in istruzioni più lunghe in modo da poter essere elaborate contemporaneamente; in questo caso si parla anche di set di istruzioni VLIW (Very Long Instruction Word).
Sicuramente però i processori Intel della famiglia x86 possono essere considerati CISC mentre gli AMD già da tempo hanno utilizzato tecnologie miste e più orientate verso i RISC.
Infatti dal 2002 con i processori Duron, Athlon, Opteron, AMD ha abbandonato la corsa sfrenata all'aumento della frequenza del clock (che invece Intel ha continuato ancora per qualche anno) introducendo il fattore equivalente di prestazioni o Performance Rating contrassegnato da un «+» vicino all'indicazione della velocità.
In pratica significa che, ad esempio, l'Athlon XP 3200+ ha prestazioni equivalenti a un Pentium IV a 3,2 Ghz malgrado la sua frequenza di clock effettiva sia solo di 2,2 Ghz; questo è possibile proprio grazie alla diversa architettura interna della CPU oltre che a grazie una cache e un FSB molto veloci.
I processori possono essere classificati, relativamente alla loro evoluzione, in generazioni; nella tabella 2.6 vengono riassunte le varie generazioni con l'indicazione, per ognuna, del processore o della categoria di processori più significativa, dell'architettura (ampiezza dei registri), della micro-architettura, della lunghezza del bus dati e indirizzi della frequenza massima del clock e dell'anno di riferimento.
Per micro-architettura si intende il modo in cui vengono realizzati all'interno delle CPU le istruzioni tipiche di una architettura come la IA-32 o la Intel 64. |
|
Occorre sottolineare come i processori Itanium segnino un netto distacco rispetto agli altri prodotti Intel con il passaggio dall'architettura IA-32 alla IA-64: basti pensare che tali CPU abbandonano la gestione segmentata della memoria a favore di quella lineare; ovvia conseguenza è che le due famiglie di processori non sono compatibili.
I processori Intel 64 invece sono compatibili con i predecessori (questo è anche il motivo della presenza della sigla x86-64).
La tabella si riferisce a processori Intel; riguardo agli AMD possiamo citare la famiglia di processori Athlon come prodotti di maggiore spicco; in particolare la CPU Athlon 64 x2 ha portato i 64 bit e il doppio core nel mondo dei PC in anticipo rispetto ai processori di Intel.
Infatti AMD per prima ha proposto l'estensione dell'insieme di istruzioni x86 verso i 64 bit chiamandola AMD64 o anche x86-64 o x64; successivamente anche Intel ha reso compatibili i suoi processori a tale estensione denominando però la relativa tecnologia EM64T (Extended Memory 64 Technology).
Come accennato in precedenza, la corsa all'aumento della frequenza di clock delle CPU si è fermata; il massimo è stato raggiunto con i circa 3,8 Ghz degli ultimi modelli di Pentium IV.
Questo è accaduto nonostante la micro-architettura alla base di questi processori, cioè la NetBurst Micro Architecture, prevedesse frequenze teoriche fino ai 10 Ghz.
I motivi fondamentali di questa scelta sono i costi eccessivi di sviluppo e l'enorme aumento di consumi e di calore provocato da ogni ulteriore incremento della frequenza del clock.
Arrivati alla soglia dei 4 Ghz di frequenza, infatti, un altro incremento del 10% della velocità avrebbe comportato un aumento del 15% dei consumi e un miglioramento delle prestazioni molto inferiore al 10%.
Si è quindi passati da uno sviluppo «verticale» della tecnologia delle CPU ad uno «orizzontale» che consiste nell'integrare nella stessa CPU due o più core gemelli che condividono le varie risorse della CPU stessa (cache, bus, registri).
Può essere interessante notare come, fino alle CPU Pentium IV l'incremento delle prestazioni veniva perseguito con tre tipi di strategie:
aumento della frequenza del clock;
aumento della quantità di cache in modo da minimizzare gli accessi alla più lenta memoria centrale;
aumento della larghezza di banda verso la memoria centrale e diminuzione della latenza (intervallo di tempo o ritardo che intercorre tra la richiesta di un dato e il momento della sua disponibilità).
Facendo un parallelo con il mondo dei motori a scoppio, vuol dire aumentare i giri del motore ottimizzando aspirazione e scarico; ma questo non è l'unico modo di incrementare la potenza: si può anche aumentare la cilindrata (cilindri più grossi) oppure il numero di cilindri, mantenendo costante il regime di rotazione.
Per le CPU «l'aumento di cilindrata» è corrisposto al passaggio dall'architettura a 32 bit a quella a 64 bit con vantaggi però tutto sommato non eccezionali specialmente per macchine e applicazioni di fascia bassa (ambienti home e office) che non sfruttano appieno le maggiori possibilità di trasferimento e elaborazione di dati a 64 bit e di indirizzamento di una quantità di memoria enormemente maggiore (bus indirizzi a 64 bit anziché a 32 o 36).
Invece «l'aumento del numero di cilindri» per le CPU ha significato integrare due core (e poi anche 4 o 8) nello stesso package.
In questo modo si riescono ad avere prestazioni quasi doppie senza far aumentare eccessivamente i consumi e il riscaldamento del processore.
Semplificando al massimo le cose possiamo supporre che, aumentando il clock di una CPU da 2,5 Ghz a 5 Ghz, l'assorbimento di potenza passi da 75 Watt a 200 Watt; invece accostando due CPU da 2,5 Ghz il consumo si limita a 75 + 75 Watt.
Inoltre occorre osservare che la fabbricazione di CPU che operino con frequenze più basse è molto più semplice e meno costosa.
I primi processori Intel della nuova micro-architettura Core, e cioè le CPU delle famiglie Core 2 Duo e Core 2 Extreme proposte dalla metà del 2006, avevano frequenze di clock di 2,66 e 2,93 Ghz rispettivamente, inferiori quindi agli ultimi modelli di Pentium 4 con una dissipazione di soli 75 Watt contro 150 Watt.
Fra la Netburst e la Core, l'Intel ha proposto una micro-architettura dedicata ai PC portatili denominata Mobile cui sono appartenute le CPU Pentium M e Core Duo specifiche proprio per i notebook; occorre precisare che la Core Duo, pur essendo ottenuta accostando due core Pentium M e pur avendo un nome somigliante ai processori di nuova generazione, non è a considerare una CPU multicore in quanto la sua micro-architettura deriva addirittura dalla vecchia P6.
Le principali novità della micro-architettura Core possono essere così riassunte:
Wide Dynamic Execution: permette di aumentare il numero di istruzioni eseguite per ciclo di clock grazie alla pipeline a 14 stadi, a un meccanismo molto sofisticato di predizione delle diramazioni del flusso di esecuzione e all'aggiunta di buffer per le istruzioni che permettono di minimizzare la necessità di accessi alla cache in caso di diramazioni o salti;
Advanced Smart Cache: consente ai due core di condividere la stessa cache L2 in modo da ottimizzarne l'utilizzo quando uno dei due è inattivo e da non dovere duplicarne il contenuto se i due core operano sulle stesse istruzioni;
Smart memory Access: grazie alla tecnologia di predizione dello sviluppo delle operazioni vengono caricate nella cache L2 e L1 i dati e le istruzioni successive prima di avere completato quelle correnti; se la predizione risulta corretta si ha un notevole guadagno nei tempi di esecuzione;
Intelligent Power Capability: permette che i componenti della CPU temporaneamente inutilizzati vengano spenti per risparmiare energia, senza però comprometterne i tempi di reazione alla ripresa della loro attività;
Advanced Digital Media Boost: aumenta la velocità di esecuzione delle istruzioni multimediali SSE e prestazioni lavorando a 128 bit anziché a 64.
Con la successiva famiglia dei processori Core i7 con micro-architettura Nehalem si hanno i primi modelli di CPU «quad core monolitici», cioè con quattro core (e, in prospettiva, otto core) su un singolo die.
Anche nella famiglia precedente di processori esistevano modelli con quattro core, ma erano realizzati «accostando» in un unico package due blocchi dual core.
La soluzione monolitica permette di condividere alcune unità del processore e di avere una connessione diretta tra i vari core (nel caso di blocchi separati la comunicazione avviene invece grazie al bus di sistema)
Altre importanti novità introdotte con questa architettura sono:
integrazione, all'interno della CPU, del controller della memoria;
adozione di un ulteriore livello di memoria cache, denominato L3, condiviso tra tutti i core e ampio 8 MB che si aggiunge alla cache L1 (64 KB) e L2 (256 KB) dedicate ad ogni core;
processo produttivo inizialmente a 45 nanometri ma destinato a passare a 32 nanometri;
numero di transistor contenuti nel chip, almeno per i primi modelli, inferiore rispetto ai processori precedenti (731 milioni contro 820) in quanto la quantità totale di memoria cache è inferiore (nei core 2 è presente una cache L2 di 12 MB);
sostituzione del FSB con il già citato bus QPI;
«recupero» della tecnologia Hyper-Threading introdotta nei Pentium IV e adesso migliorata e rinominata Simultanues Multi-Threading, grazie alla quale ogni core fisico può elaborare contemporaneamente due distinti thread (parti in cui può essere suddivisa l'elaborazione di un processo o programma in esecuzione); in questo modo o un processore quad core equivale logicamente ad una unità con otto core.
Si deve correttamente osservare che molte delle novità introdotte nella famiglia dei processori Intel Core i7 (quad core monolitico, controller della memoria integrato, sostituzione del FSB con un bus più veloce) non sono novità assolute ma riproposizioni di soluzione introdotte in precedenza da AMD: il bus HyperTransport e il controller della RAM integrato risalgono addirittura al 2001 e al 2003 rispettivamente e sono presenti in tutte le CPU Athlon 64, la monoliticità è stata adottata nel 2007 con le CPU Phenom II X4. |
I processori multicore rientrano nella categoria MIMD come i sistemi con più processori (multiprocessore) con la differenza però che nel primo caso i core sono nella stessa CPU e condividono le risorse, nel secondo caso si hanno diverse CPU che non condividono alcuna risorsa se non un bus di comunicazione ad esse dedicato.
Si deve comunque notare, che per sfruttare appieno la presenza di core multipli, i programmi devono essere prodotti con la tecnologia SMT (Simultaneos Multithreading Technology) e i sistemi operativi devono essere multi-thread.
In pratica i programmatori devono scrivere codice secondo un modello di programmazione concorrente, in caso contrario i programmi vengono eseguiti da un solo core.
Le tipologie di programmi più adatte alle CPU multicore sono quelle che riguardano la manipolazione di video e audio, la gestione di grosse basi di dati, la grafica, i servizi offerti in background dai server di rete; invece un programma costantemente in primo piano che necessita di molte risorse, come un videogioco di ultima generazione, viene eseguito più velocemente da un processore tradizionale con clock molto spinto.