Nel 1945 lo scienziato e matematico ungherese János Lajos Neumann (naturalizzato americano con il nome di John von Neumann) propose un modello di calcolatore digitale che, con molte evoluzioni, è la base per la costruzione dell'architettura hardware dei moderni computer.
Tutto partì dal lavoro del grande matematico Alan Turing che, nel 1936, propose un modello matematico astratto (noto come Macchina di Turing), ideato per definire cosa sia "calcolabile". Nel 1945 John von Neumann tradusse i concetti teorici di Turing in una architettura fisica (hardware) ideando uno schema costruttivo detto Macchina (o architettura) di von Neumann) per i primi computer reali (come l'EDVAC), e definendo componenti come la CPU, la memoria e il bus.
Relazione tra macchina di Turing e macchina di von Neumann
La relazione tra macchina di Turing (MT) e macchina di von Neumann (MdVN) è concettuale, poiché la prima è un modello teorico, l’altra è un modello architetturale pratico:
- la macchina di Turing (1936) è un modello matematico astratto che serve a definire che cosa significa "calcolare" e cosa sia "calcolabile", dimostrando che una macchina universale può eseguire qualsiasi algoritmo se dotata di istruzioni appropriate. Essendo un modello astratto, non è pensata per essere costruita, ma per studiare la calcolabilità (computabilità) e quali sono i limiti del calcolo (ad esempio il "problema della fermata");
- la macchina di von Neumann (1945) è un modello di architettura per i computer reali e serve a definire come si costruisce una macchina che esegue i calcoli nella realtà.
Il legame profondo tra MT e MdVN risiede nella Macchina Universale di Turing: Turing teorizzò che le istruzioni (il software) potessero essere trattate come dati e scritte sul nastro della macchina. Von Neumann concretizzò questa idea progettando un sistema in cui sia i dati che il programma ("programma memorizzato") risiedono nella stessa memoria centrale (RAM), permettendo al computer di passare da un compito all'altro senza dover essere fisicamente ricablato.
In sintesi, Turing ha inventato la "logica" del computer, mentre von Neumann ha progettato la "macchina" per farla funzionare.
La macchina (o architettura) di von Neumann
La MdVN consiste di 4 componenti:
- CPU (Central Processing Unit, Unità Centrale di Elaborazione): è un inseme di circuiti elettronici che possono leggere e scrivere dati in un'area di lavoro chiamata "memoria centrale", eseguire le istruzioni di un programma, impartire comandi alle periferiche (per esempio trasferire dati dalla memoria centrale ad un dispositivo).
- Memoria centrale: è un'area di lavoro unificata che contiene sia le istruzioni da eseguire che i dati necessari all'elaborazione (quella che nei PC moderni è la memoria RAM).
- Dispositivi di Input/Output (I/O): sono una serie di interfacce di comunicazione con i dispositivi fisici (periferiche) che permettono alla macchina di scambiare informazioni con l'ambiente esterno attraverso operazioni di ingresso (Input) e uscita (Output). La fase di Input riguarda l'acquisizione (o lettura) dei dati, quella di Output riguarda la scrittura (o memorizzazione) dei dati (per esempio il risultato dell'elaborazione).
- Bus di sistema: è un insieme di linee elettriche che collegano le componenti della macchina e permettono il trasferimento dati tra le varie componenti; potete pensarlo come incarnato nella motherboard (scheda madre) di un moderno PC (nella MdVN il bus è un canale unico, mentre i PC moderni usano un'evoluzione della MdVN -chiamata "architettura Harvard modificata"- con molteplici bus e interfacce di comunicazione).
Osservazioni:
- la CPU esegue programmi residenti in memoria centrale; un programma è composto da una sequenza di istruzioni che vengono eseguite dalla CPU una alla volta, sequenzialmente, nello stesso ordine in cui sono state codificate all'interno del programma. Ciascuna istruzione è eseguita seguendo un ciclo standard di lavoro noto come ciclo Fetch–Decode–Execute: la CPU preleva dalla memoria (Fetch) la prossima istruzione da eseguire, la decodifica (Decode) – cioè la identifica per capire quali operazioni compiere – ed infine la esegue (Execute), ciè effettua tutte le operazioni necessarie ad eseguire l'istruzione.
- La memoria centrale è un'area di lavoro unificata contenente istruzioni (programmi) e dati (compresi i risultati intermedi dell'elaborazione). Le memorie di massa non fanno parte della memoria centrale poiché, dal punto di vista funzionale (cioè dell'interazione con la macchina), sono dispositivi di I/O.
- Per dispositivi di Input/Output si intendono le interfacce di comunicazione non le periferiche reali; tutte le periferiche di uso comune (tastiere, mouse, stampanti, monitor ecc.) sono dispositivi di I/O; anche le memorie di massa (come i dischi rigidi) rientrano tra i dispositivi di I/O poiché scambiano dati con le altre componenti della MdVN attraverso un'interfaccia elettronica di comunicazione (il controller di periferica).
- Un bus è un canale di comunicazione che collega tra loro più componenti di un sistema in modo che possano dialogare. Dal punto di vista fisico il collegamento tra le periferiche è permanente (è costituito, ad esempio, da fili elettrici in rame); il collegamento logico riguarda solo le periferiche che devono connettersi ed è comandato dalla CPU, che decide quali connessioni fisiche attivare per stabilire il collegamento.
La MdVN segue uno schema di funzionamento molto rigido e strettamente sequenziale; le evoluzioni di questo modello introducono nell'elaborazione diverse forme di parallelismo (per esempio più pipeline – code di elaborazione – attive simultaneamente) e miglioramenti tecnologici (come le memorie cache multiivello) per migliorare l'efficienza e la velocità di esecuzione delle operazioni.
Il collo di bottiglia di von Neumann
La macchina di von Neumann utilizza una singola memoria e un singolo bus per gestire sia le istruzioni che i dati. Il vantaggio di questo approccio è la massima flessibilità e semplicità di progetto, tuttavia ha un grosso limite: la CPU non può leggere un'istruzione e contemporaneamente accedere a un dato, poiché devono condividere lo stesso "canale" (bus), e ciò rallenta l'elaborazione. Questa inefficienza enll'elaborazione è nota come von Neumann bottleneck (collo di bottigli di von Neumann): CPU e memoria comunicano tramite un canale limitato, dati e istruzioni competono sullo stesso bus.
Architettura Harvard
L'architettura Harvard evita il "collo di bottiglia di von Neumann", separando fisicamente la memoria delle istruzioni da quella dei dati, dotando ognuna di un proprio bus dedicato. In tal modo la CPU può leggere un'istruzione e accedere a un dato nello stesso ciclo di clock, raddoppiando potenzialmente la velocità di accesso.
Poiché usa due memorie fisicamente separate (una per le istruzioni e una per i dati) e due bus distinti, è velocissima per compiti specifici. La CPU può leggere la prossima istruzione mentre sta ancora scrivendo il risultato dell'operazione precedente nei dati. Lo svantaggio è che è più complessa e costosa da costruire a causa del doppio cablaggio. Questo tipo di architettura è molto comune in sistemi dove la velocità è critica, come i DSP (Digital Signal Processors) ed i microcontrollori.
Architettura Harvard modificata
L'architettura Harvard modificata è un ibrido tra l'architettura di von Neumann e l'architettura Harvard classica. È la soluzione utilizzata nella quasi totalità dei computer moderni (come i processori Intel o AMD, o in quelli ARM). Il meccanismo di funzionamento è il seguente:
- esternamente (cioè verso la RAM principale) si comporta come una macchina di von Neumann con memoria unica;
- internamente (all'interno della CPU) utilizza un'architettura Harvard con due memorie cache separate: una cache per le istruzioni e una per i dati.
Combina la flessibilità di von Neumann (poter caricare programmi dal disco come se fossero dati) con le prestazioni dell'Harvard (accessi simultanei in cache). A livello di bus ci sono due percorsi separati che partono dalla CPU verso le rispettive cache, ma che si uniscono in un unico bus di sistema quando devono accedere alla memoria RAM principale.
È la soluzione moderna perché risolve il "collo di bottiglia di Von Neumann" permettendo alla CPU di leggere un'istruzione e un dato contemporaneamente dalle cache interne, mantenendo però la semplicità e la flessibilità di avere un'unica memoria RAM esterna.