Indice dei contenuti
Questo articolo è parte di una serie di approfondimenti dedicati all'architettura dei calcolatori e ha lo scopo di introdurre i concetti di base dell'architettura hardware dei sistemi di elaborazione.
Dopo una breve introduzione, nella quale cercheremo di rispondere alla domanda "che cos'è un calcolatore?" fornendo una definizione adeguata, andremo ad esplorare le varie componenti hardware che compongono un elaboratore-tipo: la Central Processing Unit (CPU), la Random Access Memory (RAM), le Periferiche di input & output e il Bus di sistema.
Che cos'è un calcolatore?
Un calcolatore è prima di tutto un sistema, ovvero un oggetto costituito da molte parti - note come componenti - che hanno il compito di interagire e cooperare tra loro al fine di ottenere un certo risultato.
Questa definizione è estremamente importante in quanto ci consente di mettere a fuoco un aspetto chiave del nostro oggetto di studio; per approfondire l'architettura di un sistema è infatti fondamentale svolgere una serie di operazioni di scomposizione:
- individuare e identificare i singoli componenti del sistema;
- comprendere i principi generali di funzionamento di ciascun componente;
- analizzare in che modo i vari componenti interagiscono tra di loro per produrre un risultato.
Nei prossimi paragrafi vedremo come occuparci di questi tre aspetti.
Componenti di un calcolatore
Cominciamo col mettere a fuoco le singole componenti di un calcolatore, partendo dalle due macro-categorie principali:
- Hardware. La struttura fisica del calcolatore, costituita da componenti elettronici ed elettromeccanici.
- Software. L'insieme dei programmi che consentono alle singole componenti hardware di interagire tra loro ovvero di svolgere dei compiti utili.
Il software può essere a sua volta suddiviso in due principali tipologie:
- Software di base (Kernel, Sistema operativo e driver di periferica), che si occupa di riconoscere e comunicare con le componenti harware nonché di fornire all'utente un'interfaccia di comunicazione.
- Software applicativo (MS Office, Photoshop, etc.), che si occupa di elaborare le informazioni inserite dall'utente utilizzando l'hardware a disposizione al fine di ottenere un determinato risultato.
L'hardware e il software sono organizzati a livelli (o strati, o layer): ciascun livello corrisponde a un dispositivo (reale o virtuale) in grado di eseguire un proprio insieme di operazioni il cui risultato (output) consente il funzionamento del livello successivo. L'ultimo livello, che corrisponde all'interfaccia utente del sistema operativo e dei principali applicativi, è il più semplice da utilizzare.
Hardware
In questo approfondimento ci dedicheremo all'hardware, ovvero l'insieme di componenti elettronici ed elettromeccanici che costituiscono i layer fisici dell'elaboratore.
Il più noto modello utilizzato per descrivere l'architettura di un elaboratore e la sua suddivisione nelle varie componenti hardware è quello della macchina di Von Neumann, definito alla fine degli anni '40 dall'Institute for Advanced Study di Princeton (USA).
La macchina di Von Neumann è costituita da quattro elementi funzionali fondamentali:
- Central Processing Unit (CPU): l'unità che sovraintende alle funzionalità logiche di elaborazione principali del computer, divisa a sua volta in Unità Aritmetica e Logica (ALU) e Unità di Controllo;
- Memoria Centrale, nota anche come memoria primaria o memoria di lavoro;
- Periferiche di input e/o di output (note anche come unità I/O), che hanno rispettivamente la funzione di consentire l'inserimento dei dati da elaborare dall'esterno e/o restituire all'esterno i dati elaborati;
- Bus di sistema, un'interfaccia (o set di interfacce) che ha il compito di collegare i componenti al fine di consentire la loro comunicazione e interoperabilità;
In alcuni modelli la macchina viene descritta attraverso cinque elementi funzionali, dividendo le periferiche di input e di output in due insiemi distinti.
Central Processing Unit (CPU)
L'unità centrale di elaborazione del calcolatore è chiamata CPU, acronimo di Central Processing Unit; si tratta del componente più importante del calcolatore in quanto sovrintende alle funzionalità logiche di elaborazione principali. Nelle architetture moderne la CPU è implementata attraverso un microprocessore digitale general purpose, basato tipicamente su un'architettura a registri generali.
Origini e caratteristiche
Le origini della CPU risalgono agli anni '50, quando si decide di riunire all'interno dello stesso cabinet i due processori che in precedenza venivano organizzati in due blocchi distinti:
- l'Unità Aritmetica e Logica (ALU), un processore ottimizzato per l'esecuzione di operazioni aritmetiche o logiche;
- l'Unità di Controllo, un componente che ha il compito di coordinare tutte le azioni necessarie per l'esecuzione di una istruzione e il coordinamento di insiemi di istruzioni mediante una serie di cicli di clock nei quali svolge attività di input e output.
Le moderne CPU si compongono inoltre di alcuni elementi ulteriori che consentono un incremento dell'efficienza e quindi delle prestazioni, come lo shifter (che si occupa dello spostamento dei bit per velocizzare l'esecuzione di moltiplicazioni e divisioni), una serie di registri interni (una sorta di memoria interna che ha il compito di memorizzare lo stato della CPU). A questa struttura di base, a tutt'oggi presente nella quasi totalità delle CPU, sono state poi aggiunte una serie di unità ausiliarie nel corso degli anni, tra cui:
- Floating Point Unit (FPU), un componente che si occupa di eseguire calcoli in virgola mobile;
- Memory Management Unit (MMU), un componente 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.
Funzionamento
Lo scopo principale della CPU è quello di interpretare il linguaggio macchina per svolgere le istruzioni di elaborazione e calcolo alla base di tutte le operazioni del calcolatore. Come tutti gli interpreti, si basa sul seguente ciclo:
- Acquisizione dell'istruzione (Instruction Fetch): l'istruzione da interpretare, nel suo formato atomico, viene prelevata dalla memoria;
- Decodifica (Operand Assembly): l'istruzione viene quindi decodificata, ovvero analizzata al fine di determinare l'operazione da eseguire;
- Esecuzione (Execute): a seguito della decodifica dell'istruzione, viene eseguita la computazione desiderata.
Le moderne CPU hanno migliorato l'efficienza di questo ciclo elementare inserendo delle funzionalità di parallelizzazione, ovvero svolgendo le suddette istruzioni in parallelo (instruction prefetch) e/o recuperando in parallelo i dati necessari al loro svolgimento (data prefetch). Inoltre, la stessa esecuzione delle istruzioni può essere suddivisa in passi più semplici mediante l'introduzione di un sistema di pipeline: questa innovazione, introdotta nei primi anni '80, ha consentito di "parallelizzare" internamente le istruzioni, che possono essere collocate simultaneamente su stadi diversi della pipeline e quindi decodificate ed eseguite come una catena di montaggio.
Principali Architetture
In questo paragrafo proveremo ad elencare le principali architetture che hanno contribuito a scrivere la storia delle CPU dagli anni '50 ad oggi: per ciascuna di esse cercheremo di mettere a fuoco le caratteristiche fondamentali, rimandando una trattazione più approfondita ad articoli successivi.
Von Neumann
La prima architettura per CPU nota, nella quale i dati e le istruzioni risiedono nella stessa memoria; questa architettura è stata per decenni la più comune, in quanto molto semplice, flessibile ed efficiente; inoltre, poiché dati e istruzioni vengono gestiti insieme, consente avere codice automodificante.
Harvard
I dati e le istruzioni risiedono in due memorie separate: si tratta di una scelta architetturale che può garantire prestazioni migliori poiché le due memorie possono lavorare in parallelo riducendo le alee strutturali, ma è ovviamente molto più complessa da gestire: è tipicamente utilizzata nei Digital Signal Processor (DSP).
CISC
Acronimo per Complex Instruction Set Computer, si tratta di un'architettura che prevede unità di controllo complesse che possono essere programmate in modo semplice (ovvero occupando meno memoria) utilizzando tecniche simili a quelle dei linguaggi di programmazione ad alto livello: utilizzata fino alla seconda metà degli anni '70, ovvero fino a quando la memoria RAM aveva un costo tale da rendere conveniente avere un set di istruzioni potenti all'interno della CPU.
RISC
Acronimo per Reduced Instruction Set Computer: è l'architettura che ha di fatto rimpiazzato la CISC, contraddistinta da una struttura semplice e lineare che consente di eseguire il set di istruzioni in tempi minori. Teorizzata verso la fine degli anni '70, è stata l'architettura dominante per oltre 20 anni, ponendo le basi per lo sviluppo di un gran numero di famiglie di processori tra cui AVR, PIC, ARM, DEC Alpha, PA-RISC, SPARC, MIPS, POWER e PowerPC. Tra le sue principali innovazioni vi è l'introduzione delle pipeline, resa possibile dal ridotto set di istruzioni e dalla struttura più leggera ed efficiente: la presenza delle pipeline, che si possono sinteticamente descrivere come una tecnica di pseudo-parallelizzazione delle attività di esecuzione, consente al microprocessore di eseguire la maggior parte delle istruzioni in un ciclo di clock.
x86
Menzione a parte meritano le microarchitetture messe a punto a partire dalla seconda parte degli anni '70 dalle due company che saranno destinate a dominare il mercato CPU consumer, workstation e server: Intel e Advanced Micro Devices (meglio nota con l'acronimo AMD). Si tratta di una serie di iterazioni tecnologiche durate oltre 40 anni, tutte convenzionalmente riconducibili alla macro-architettura x86, che per ragioni di spazio e per non distogliere il lettore dal focus di questo articolo abbiamo preferito trattare in un approfondimento dedicato alle CPU prodotte da Intel Corporation e AMD negli ultimi 40 anni. In questa sede ci limiteremo a dire che si tratta di un'architettura "ibrida", in quanto prevede un istruction set CISC e una core architecture RISC, con l'obiettivo di beneficiare delle caratteristiche migliori di entrambe.
Memoria Centrale
Nota anche come memoria primaria o memoria di lavoro, è collegata alla scheda madre tramite connettori chiamati socket ed alla CPU tramite il BUS di sistema. Contiene dati ed istruzioni prelevati dalla memoria di massa (o memoria secondaria) per consentire il loro prelievo ed elaborazione da parte della CPU: si tratta dunque sostanzialmente di una memoria di transito o appoggio (RAM e Cache RAM), anche se può avere limitate funzioni di memorizzazione permanente (ROM, EPROM).
Memoria secondaria: è un'unità che si aggiunge alla memoria primaria (o centrale) dell'elaboratore per accrescerne le capacità di memorizzazione. Nella maggior parte dei casi consiste in una classe di dispositivi che non sono posti a diretto contatto con il processore e che hanno caratteristiche che li rendono in grado di memorizzare i dati in modo permanente, ovvero anche volta spento il processore o il calcolatore. Questa peculiarità è ovviamente assente nei casi in cui la memoria secondaria è ottenuta tramite un RAM disk, ovvero una porzione di memoria primaria a cui è stato chiesto di emulare una memoria secondaria: in quel caso, poiché la memoria primaria utilizzata a tale scopo è di tipo volatile, i dati saranno comunque temporanei e dunque persi a seguito dello spegnimento della macchina.
Caratteristiche generali
La memoria centrale costituisce una parte fondamentale del computer in quanto determina la quantità massima di dati che possono essere prelevati e dunque elaborati dal processore, ed è quindi a tutti gli effetti un parametro prestazionale del calcolatore. Quando il sistema esaurisce la memoria disponibile possono entrare in gioco - a seconda delle caratteristiche e della configurazione del sistema operativo e/o dei programmi utilizzati - delle funzionalità di paging e/o virtual memory che prevedono l'utilizzo di una parte della memoria secondaria (tipicamente l' hard-disk) come "contenitore aggiuntivo": si tratta di tecniche che consentono alla CPU di continuare l'elaborazione delle istruzioni e quindi al calcolatore di continuare a funzionare, ma poiché la memoria secondaria è considerevolmente più lenta hanno quasi sempre l'effetto collaterale di rallentare in modo considerevole il dispositivo. Nella maggior parte dei casi in cui l'utente si accorge che "il computer è lento", quello che succede in realtà è che la memoria secondaria è costretta a fare le veci della memoria primaria, in quanto quest'ultima non è sufficiente a gestire il volume di dati richiesto dal sistema operativo e/o dalle applicazioni attive.
Sulla base di quanto detto sopra si evince come una delle caratteristiche più importanti della memoria centrale sia la capacità, ovvero la massima quantità di bit memorizzabili: questa viene generalmente misurata in byte (1 byte = 8 bit).
Tipologie di memoria
La memoria centrale si suddivide in una serie di tipologie, ciascuna delle quali svolge determinate funzioni ed è dotata di caratteristiche peculiari. Le più importanti sono:
- RAM, acronimo per Random Access Memory (traducibile in italiano come "memoria ad accesso casuale"). Il termine "random" evidenzia che non ci sono differenze ad accedere alle varie celle della memoria. Le memorie RAM si suddividono in DRAM (dinamiche) e SRAM (statiche), e vengono rispettivamente utilizzate per ospitare istruzioni operative e per svolgere funzioni di cache. Si tratta di una memoria volatile, ovvero che necessita dell'alimentazione elettrica continua per mantenere memorizzate le informazioni: in altre parole, non mantiene i dati contenuti.
- Cache RAM, una memoria associativa integrata nelle CPU e nelle schede grafiche, contraddistinta da prestazioni estremamente elevate e da un costo elevato. Viene utilizzata esclusivamente per contenere i dati e le istruzioni utilizzati più di frequente, così da migliorare notevolmente le prestazioni del componente su cui è montata.
- ROM, acronimo per Read-Only Memory ("memoria in sola lettura" in italiano): si tratta di una memoria permanente, ovvero che ha un contenuto fisso che non può essere cancellato ed inoltre non è volatile come la RAM e la Cache RAM. E' solitamente utilizzata sui componenti che contengono istruzioni di base che la CPU deve caricare per consentire l'avvio del sistema e le routine di base, che tipicamente prendono il nome di BIOS (Basic I/O System).
- EPROM, acronimo per Erasable Programmable Read Only Memory ("ROM cancellabile e programmabile" in italiano): è simile alla ROM, quindi in sola lettura, ma ha la particolarità di poter essere cancellata in particolari condizioni.
- MRAM, acronimo per Magnetoresistive RAM ("RAM magnetoresistiva" in italiano): si tratta di una memoria ad accesso casuale che utilizza le proprietà del magnetismo, al posto di una serie di impulsi elettrici, per conservare le informazioni.
La fase di trasferimento da memoria di sistema a memoria cache viene attuata da un apposito circuito che prende il nome di MMU (Memory Management Unit), lo stesso che ha anche il compito di gestire il mapping fisico/logico necessario per mettere la memoria virtuale a disposizione della CPU.
Random Access Memory (RAM)
Tra le varie tipologie elencate nel paragrafo precedente la RAM merita un approfondimento particolare, in quanto è quella più presente (e che svolge le funzioni più importanti) all'interno della tipica configurazione della maggior parte degli elaboratori moderni.
La caratteristica principale della memoria RAM è la velocità di accesso, cosa che la rende ideale come memoria primaria nella maggior parte dei computer e dei dispositivi elettronici che ne necessitano: inoltre, è possibile utilizzarla per creare uno o più RAM disk, ovvero per simulare una o più unità di memoria secondaria, espediente che consente di avere prestazioni molto elevate in lettura e in scrittura anche per la memorizzazione temporanea di dati.
Nella maggior parte degli elaboratori la memoria RAM viene collegata al sistema attraverso dei moduli che possono essere collegati direttamente sulla scheda madre attraverso dei socket appositi; è inoltre spesso incorporata, con funzionalità di cache, all'interno della CPU, della GPU e/o nel chipset della motherboard.
Periferiche di input e output
Il termine input/output (spesso abbreviato in I/O) si intende una generica attività di scambio di dati e/o segnali tra interfacce informatiche: in un elaboratore tipo, le periferiche di input e output costituiscono dunque l'interfaccia che consente al calcolatore di dialogare con l'esterno - tipicamente con un operatore, ma anche con altri sistemi/calcolatori, con l'environment, etc. - ricevendo e/o fornendo informazioni.
Come abbiamo detto all'inizio di questo approfondimento, nello studio delle architetture dei calcolatori è importante partire dalle definizioni: nei prossimi paragrafi cercheremo dunque di definire in modo il più possibile preciso il significato delle parole input e output e di fornire qualche esempio preso dal mondo reale.
Input
Input è un termine inglese che in italiano si può tradurre con "immettere": in campo informatico, questo termine definisce l'inserimento di una sequenza di dati o informazioni per mezzo di una periferica (detta appunto di input) e successivamente elaborati dal calcolatore. Si tratta di una definizione arrivata in Italia intorno agli anni sessanta e inizialmente veniva utilizzata sia per indicare i dati di ingresso che i supporti fisici o logici che li contenevano; successivamente, con l'avvento delle metodologie di gestione dei processi informatici, questa sorta di "equivoco iniziale" è venuto meno: oggi con il termine input ci si riferisce in modo pressoché univoco (anche al di fuori del contesto informatico) a un insieme di elementi in entrata in un sistema finalizzati a realizzare o produrre qualcosa.
L'estrema praticità del termine, che riesce a indicare un concetto non poi così semplice in modo breve e conciso, ha favorito il suo utilizzo anche nel linguaggio corrente, come sinonimo di impulso o direttiva che consenta l'avvio di qualche opera, iniziativa o azione.
Dati e metodi di input
Nei primi elaboratori il più semplice dato di input era il bit, che conteneva un'informazione binaria: zero (0) oppure uno (1); l'estrema semplicità del bit rendeva possibile inserirlo all'interno dell'elaboratore con interfacce estremamente semplici, come interruttori, switch, pulsanti e leve. Il passaggio successivo si ebbe con l'arrivo della tastiera, che consentì il passaggio dal bit al carattere: quest'ultimo, inviato al calcolatore mediante la pressione di un singolo tasto, viene trasformato (convertito) in una sequenza di bit (inizialmente 5 con l'adozione del codice Baudot, poi 7/8 con l'avvento del codice ASCII). Parallelamente alle tastiere si diffusero anche le schede perforate, dei supporti di registrazione in cui le informazioni venivano registrate sotto forma di perforazioni in codice: le prime schede perforate permettevano di introdurre fino a 80 caratteri alla volta e furono molto utilizzate per l'inserimento diretto delle istruzioni di base al calcolatore (i cosiddetti sorgenti) per via dell'elevata componente di ripetitibilità che contraddistingueva queste ultime, a differenza dei dati di lavoro che cambiavano ad ogni elaborazione. La diffusione delle schede perforate e la loro catalogazione all'interno di appositi raccoglitori portò alla nascita del termine "libreria" (library), ancora oggi molto utilizzato per classificare quelle particolari tipologie di software intermedio (middleware) utilizzate come base di partenza nella attività di sviluppo software.
Curiosità: Una delle aziende leader nel mercato delle schede perforate, la Computing Tabulating Recording Co. (C-T-R), cambiò nome nel 1924 mutandolo in International Business Machines Corporation, più nota come IBM.
Periferiche di Input
Segue un elenco delle principali periferiche di input oggi utilizzate:
- Tastiera
- Mouse
- Joystick o Gamepad (ma anche volanti, cloche, pedali, paddle, etc.)
- Pannelli touch-screen
- Memorie di massa (pendrive, unità esterne, lettori CD/DVD/BluRay, etc.)
- Scanner
- Microfono
- Webcam
- Penne ottiche
- Tavolette grafiche
... e così via.
Output
Output è un termine inglese che in italiano si può tradurre con "produrre": in campo informatico, questo termine definisce la fuoriuscita di una sequenza di dati o informazioni da un elaboratore, che solitamente avviene per mezzo di una periferica (detta appunto di output) a beneficio di un operatore, di un altro sistema o dell'ambiente esterno.
In senso generico, il termine output viene utilizzato anche in altri settori (economia, ingegneria, etc.) per identificare il prodotto o il risultato di un determinato processo.
Caratteristiche
Nei primi elaboratori l'output era costituito dall'accensione o meno di mini lampadine organizzate in file orizzontali sul pannello di controllo: ciascuna lampadina rappresentava un bit. La sequenza di bit risultante veniva poi interpretata in esadecimale oppure ottale. Nel corso dei decenni, il progresso tecnologico ha consentito di sostituire quella modalità embrionale con periferiche in grado di fornire output estremamente precisi e dettagliati: video ad alta definizione, audio di qualità professionale, stampe ad altissima risoluzione, e così via.
Periferiche di Output
Segue un elenco delle principali periferiche di output oggi utilizzate:
- Schermi (Monitor, TV, pannelli in tecnologia touch-screen, etc.)
- Stampanti e plotter
- Periferiche audio (casse, cuffie, etc.)
- Memorie di massa (pendrive, unità esterne, lettori CD/DVD/BluRay, etc.)
... e così via.
Bus di sistema
Veniamo dunque all'ultimo componente presente nell'elenco dell'architettura Von Neumann: il bus di sistema, ovvero il canale di comunicazione che permette a tutte le componenti del calcolatore di interfacciarsi tra loro scambiandosi informazioni o dati attraverso la trasmissione e la ricezione di segnali.
Caratteristiche
Il bus di sistema si compone di un insieme di fili di rame incisi su una scheda elettronica (nota come motherboard o scheda madre) che collegano una serie di connettori che consentono l'innesto dei moduli di memoria (es. RAM) e delle interfacce necessarie al collegamento dei componenti interni del calcolatore e periferiche di Input e Output (I/O): sia i connettori che le relative interfacce possono essere diversi tra loro a seconda del protocollo utilizzato per la connessione per quella determinata periferica.
Il bus di sistema è suddiviso in tre bus minori:
- Bus dati: utilizzato per trasferire dati (es. tra memoria e CPU, tra CPU e interfacce di I/O, etc.)
- Bus indirizzi: identifica la posizione delle celle di memoria in cui la CPU va a effettuare operazioni di lettura e/o scrittura.
- Bus di controllo: utilizzato per controllare e selezionare le unità coinvolte in un trasferimento dati (sorgente e destinazione) e definirne le modalità di interazione (lettura o scrittura).
Tipi di bus di sistema
Il bus di sistema ha attraversato moltissime evoluzioni tecnologiche nel corso dei vari decenni. Di seguito riassumiamo gli standard più importanti, limitatamente al periodo "recente":
- ISA (acronimo di Industry Standard Architecture). Bus di sistema utilizzato nei primi PC “IBM compatibili” degli anni '80, originariamente a 8 bit, quindi evoluto in ISA-AT a 16 bit e infine nell'EISA a 16/32 bit.
- MCA. Bus proprietario IBM introdotto alla fine degli anni '80: a 32 bit con retrocompatibilità a 16 bit.
- VESA Local Bus (acronimo di Video Electronics Standards Association, dal nome dell'azienda che lo ha sviluppato). Come suggerito dal nome si tratta di un bus locale, ovvero connesso direttamente alla CPU, utilizzato per le connessioni video. Il VESA Local Bus lavorava sul bus ISA ma, a differenza di quest'ultimo, aveva un accesso diretto alla memoria di sistema che lo rendeva molto più veloce.
- PCI (Peripheral Component Interconnect). Bus introdotto nel 1993 come successore dell'ISA.
- AGP (Accelerated Graphics Port). Altro bus locale, introdotto nel 1997 per le connessioni video ad alta velocità su standard PCI 2.1.
- PCI Express. Evoluzione del bus PCI, introdotto a partire dal 2004 e ancora in produzione alla data odierna nella sua versione più recente (PCIe 5.0).
Conclusioni
La nostra panoramica sulle principali componenti di un calcolatore è giunta al termine: ci auguriamo che i contenuti siano stati di vostro gradimento e di piacevole lettura.
Per approfondire altri aspetti legati al funzionamento dei microprocessori e delle varie componenti dei computer vi consigliamo di leggere la nostra serie di approfondimenti dedicata all’architettura dei calcolatori.