Macchina di Von Neumann ed estensioni
La macchina di Von Neumann è il modello organizzativo della maggior parte degli elaboratori. È costituita da quattro elementi fondamentali:
Elementi fondamentali
- Memoria centrale: accoglie dati e programmi sui quali opera l'elaboratore. Tutta l'informazione, prima di essere elaborata, deve passare dalla memoria centrale. Questa è organizzata in una sequenza di celle di memoria e ciascuna contiene una parola, cioè una sequenza di bit. Tutte le parole di un elaboratore hanno la stessa capacità. La memoria centrale è volatile: il suo contenuto è perduto se il calcolatore viene spento. Tuttavia, alcune memorie sono alimentate da batterie autonome che le rendono permanenti. Le celle di memoria sono indirizzabili; l’indirizzo è la posizione relativa di una cella di memoria rispetto alla prima cella; l’indirizzamento avviene tramite il registro indirizzi della CPU (un registro è un dispositivo capace di memorizzare una sequenza di bit). Le operazioni in memoria sono: lettura della memoria e scrittura in memoria. Avvengono grazie al registro dati. Nel primo caso, il registro è caricato con una parola di memoria; nel secondo la memoria è caricata con il contenuto del registro dati. Questa memoria è detta RAM, cioè memoria leggibile/scrivibile per effetto delle istruzioni di un programma. Esistono anche memorie ROM, solo leggibili; EROM, cancellabili; PROM, programmabili, ed EPROM.
-
Bus di sistema: è un insieme di connessioni elementari (linee) lungo le quali viene trasferita informazione. Collega CPU, memoria e le interfacce di ingresso/uscita. In ogni istante di tempo collega due unità funzionali, sotto il controllo della CPU, che seleziona connessioni da attivare e operazione da compiere, mentre le altre unità entrano in funzione solo se chiamate; la CPU ha il ruolo di master e le altre unità di slave. Le linee bus si differenziano in base al tipo di informazione trasportata:
- Bus dati: trasferisce dati da master a slave o viceversa.
- Bus indirizzi: trasmette il contenuto del registro indirizzi.
- Bus controlli: trasmette da master a slave un codice corrispondente all’operazione da svolgere e da slave a master informazioni relative all’espletamento della richiesta.
-
CPU (Central Processing Unit, Unità di elaborazione): contiene gli elementi circuitali che regolano il funzionamento dell’elaboratore, esegue quindi i programmi contenuti in memoria centrale prelevando, decodificando ed eseguendo le istruzioni. È costituita da più elementi circuitali:
- Unità di controllo: responsabile del prelievo/decodifica e dell’invio dei segnali di controllo.
- Clock: sincronizza le operazioni su una data sequenza.
- ALU: realizza le operazioni logico matematiche necessarie.
- Registro dati.
- Registro indirizzi.
- Registro istruzione corrente: contiene l’istruzione in esecuzione.
- Contatore di programma: indirizzo della prossima istruzione da eseguire.
- Registro interruzioni.
- Altri registri di lavoro.
- Registro di stato: riporta in alcuni bit indicazioni sul risultato delle operazioni svolte dalla ALU.
-
Interfacce di ingresso/uscita: gli elementi circuitali che permettono di collegare l’elaboratore alle varie periferiche. Si differenziano molto a seconda del tipo di periferica; tuttavia, un’interfaccia elementare contiene i seguenti elementi:
- Registro dati della periferica: per scambiare dati con la periferica.
- Registro comando della periferica: che contiene il comando che la periferica dovrà eseguire.
- Informazione sullo stato della periferica.
Esecuzione dei programmi
L’esecuzione dei programmi si articola in tre fasi:
-
Fetch phase: acquisizione dalla memoria centrale.
- Il contenuto del registro contatore di programma è copiato nel registro indirizzi.
- Lettura dalla memoria centrale: il contenuto della cella indirizzata è trasferito nel registro dati tramite il bus di sistema.
- Il contenuto del registro dati è trasferito nel registro istruzione corrente.
- Il valore del contatore di programma è incrementato di uno, a meno che non si memorizzi un indirizzo differente, alterando così l’esecuzione sequenziale del programma (branch).
- Interpretazione: decodifica dell’istruzione.
- Esecuzione: esecuzione dell’istruzione.
Problemi della macchina di Von Neumann
La macchina di Von Neumann così presentata ha più problemi:
- L’esecuzione dei programmi avviene in sequenza.
- La CPU trasferisce dati attraverso il bus e attende risposte da componenti più lenti.
- La velocità di accesso alla RAM è bassa rispetto alla velocità di elaborazione della CPU.
- La dimensione dei registri determina la quantità di informazione su cui l’elaboratore può lavorare.
- La quantità di RAM può influire sulla potenza di elaborazione.
- La frequenza di clock determina la velocità di esecuzione delle istruzioni.
- L’ampiezza del bus dati determina quanti dati vengono trasferiti.
- L’ampiezza del bus indirizzi determina la quantità di memoria a cui può accedere la CPU.
Estensioni della macchina di Von Neumann
Sono state quindi introdotte delle estensioni:
-
Introduzione della possibilità di eseguire in parallelo le istruzioni: architetture pipeline e superscalari.
- Pipeline: ogni fase è affidata a un dispositivo specifico.
- Superpipeline: la pipeline è più lunga, con otto o più stadi.
- Superscalare: possibilità di eseguire più istruzioni in ogni stadio della pipeline.
- Parola di istruzione lunga: si iniziano più istruzioni in ogni ciclo di clock.
- Schedulazione dinamica della pipeline: evita il verificarsi di condizioni critiche quali la necessità di attendere il completamento di un’istruzione quando le successive sono già pronte.
-
Uso di gerarchie di memorie: memorie cache.
Una memoria cache è un’area di memoria ad alta velocità di accesso e dimensioni piccole rispetto alla memoria primaria; è situata tra questa e il processore. Contiene i dati usati più di frequente dal processore: se il processore trova i dati in memoria cache ha un hit, altrimenti un miss.
-
Uso di più processori: architetture multiprocessore.
- Permette di lavorare in parallelo.
- Flussi di controllo:
- SISD (Von Neumann).
- SIMD
- MISD
- MIMD
- Memoria:
- Distribuita: ogni processore ha un banco privato di memoria; i processori comunicano tra loro tramite una rete di interconnessione.
- Condivisa: tutti i processori condividono l’accesso a un banco comune di memoria, tramite bus di sistema.
Il sistema operativo
Il sistema operativo è uno strato software che opera direttamente sull’hardware. Opera le azioni necessarie a caricare i programmi in memoria centrale, eseguirli, leggere e scrivere dati, compiere operazioni di ingresso/uscita con le periferiche, ecc. Rende cioè disponibile all’utente l’architettura del calcolatore. Può essere mono-utente (cioè dedicato a un singolo utente) o multi-utente (se condiviso da più utenti); anche nel secondo caso l’impressione di ciascun utente è che il sistema gli sia dedicato. È organizzato per strati funzionali, con un’architettura detta a buccia di cipolla; ciascuno strato funzionale realizza una macchina virtuale, cioè una macchina che maschera le caratteristiche della macchina hardware e offre ai suoi utenti un insieme ben definito di funzionalità.
Funzioni del sistema operativo
- Gestore dei processi: è responsabile dell’esecuzione dei programmi da parte dell’unità di elaborazione. Deve quindi garantire l’esecuzione contemporanea di molti processi, quindi deve scegliere a quali consentire accesso alla CPU. Offre agli strati superiori una macchina virtuale in cui ciascun programma ha un’unità di elaborazione dedicata a disposizione.
- Gestore della memoria: alloca la memoria e la partiziona tra i vari programmi che la richiedono. Offre agli strati superiori una macchina virtuale in cui ciascun programma opera come se avesse a disposizione una memoria dedicata.
- Driver: sono responsabili delle operazioni di ingresso/uscita che coinvolgono le periferiche.
- File system: gestisce i file in memoria di massa.
- Interprete comandi: consente all’utente di attivare i programmi. Si presenta con un’interfaccia alfanumerica (MS-DOS) o con un’interfaccia grafica (Windows).
I primi tre strati sono detti kernel (nucleo) del sistema operativo. Il sistema operativo cerca di ottimizzare le prestazioni del sistema informatico, attraverso la gestione delle risorse. Il carico complessivo rallenta il sistema, fino ad arrivare a una situazione di sovraccarico.
Concetto di processo
Un processo si riferisce all’esecuzione di un programma ed è quindi un concetto dinamico, caratterizzato da un codice eseguibile E e da uno stato S, cioè i valori contenuti nei registri della CPU e in memoria centrale. L’unità di elaborazione che esegue i processi è detta processore, presente singolarmente nell’architettura standard di Von Neumann. Programmi e processi non sono in corrispondenza biunivoca: a uno stesso programma possono essere associati più processi. I linguaggi di programmazione detti linguaggi concorrenti si basano proprio su questo principio: ciascun programma comporta l’esecuzione di vari processi, ciascuno dei quali esegue un compito particolare.
I processi sono classificabili come in esecuzione, pronti o in attesa. Un solo processo può essere in esecuzione (cioè eseguito dal processore) in un dato istante, gli altri devono essere pronti o in attesa. La sospensione del processo in esecuzione è detta interruzione interna; con questa il processo passa da in esecuzione a in attesa. L’interruzione interna è causata da una particolare istruzione, detta “chiamata di sistema”.