Struttura e funzione
Struttura: il modo in cui i componenti sono correlati.
Funzione: Fazione di ciascun singolo componente come parte della struttura. Sia la struttura sia il funzionamento di un calcolatore sono essenzialmente semplici. La Figura 1.1 illustra le funzioni basilari che un elaboratore può eseguire. In termini generali, esse sono quattro:
- Elaborazione dei dati (data processing)
- Memorizzazione dei dati (data storage)
- Trasmissione dei dati (data movement)
- Controllo (control)
L'evoluzione e le prestazioni del calcolatore sono state caratterizzate dall'aumento della velocità del processore, dalla diminuzione delle dimensioni dei componenti e dall'aumento della dimensione della memoria e della velocità di I/O. Un fattore responsabile del grande incremento di velocità del processore è rappresentato dalle minori dimensioni dei suoi componenti. Tuttavia, il vero guadagno in velocità degli ultimi anni deriva dall'organizzazione del processore, con l'intenso pipelining, l'uso di tecniche di esecuzione parallela e di esecuzione speculativa, che anticipa l'esecuzione di istruzioni che potrebbero essere successivamente richieste. Queste tecniche mirano a mantenere il processore impegnato per il maggior tempo possibile.
Un problema critico nella progettazione dei sistemi di elaborazione è il bilanciamento delle prestazioni dei vari elementi, di modo che i guadagni di prestazione in un'area non siano penalizzati da un ritardo in altre. Per compensare questo sfasamento cache, vengono utilizzate varie tecniche, tra cui bus di memoria più larghi e chip di memoria più sofisticati. L'oggetto più interessante, e per certi versi più complesso, è la CPU, i cui principali componenti sono:
- Unità di controllo, che controlla il susseguirsi delle operazioni;
- Unità aritmetico-logica (ALU), responsabile della elaborazione dei dati;
- Registri, che costituiscono la memoria interna della CPU;
- Interconnessioni, meccanismi che attuano la comunicazione tra unità di controllo, ALU e registri.
Evoluzione e prestazioni del calcolatore
L'evoluzione e le prestazioni dei calcolatori sono state caratterizzate dall'aumento della velocità del processore, dalla diminuzione delle dimensioni dei componenti e dall'aumento della dimensione della memoria e della velocità di I/O. Un fattore responsabile del grande incremento di velocità del processore è rappresentato dalle minori dimensioni dei suoi componenti. Tuttavia, il vero guadagno in velocità degli ultimi anni deriva dall'organizzazione del processore, con l'intenso pipelining, l'uso di tecniche di esecuzione parallela e di esecuzione speculativa, che anticipa l'esecuzione di istruzioni che potrebbero essere successivamente richieste. Queste tecniche mirano a mantenere il processore impegnato per il maggior tempo possibile.
Un problema critico nella progettazione dei sistemi di elaborazione è il bilanciamento delle prestazioni dei vari elementi, di modo che i guadagni di prestazione in un'area non siano penalizzati da un ritardo in altre. Per compensare questo sfasamento cache, vengono utilizzate varie tecniche, tra cui bus di memoria più larghi e chip di memoria più sofisticati.
La macchina di von Neumann
Tale struttura consiste di:
- Memoria centrale, che contiene dati e istruzioni,
- Unità aritmetico-logica (ALU), in grado di operare su dati binari,
- Unità di controllo, che interpreta le istruzioni in memoria e le manda in esecuzione,
- Dispositivi di I/O, azionati dall'unità di controllo.
Tutti i calcolatori odierni hanno questa stessa struttura e sono pertanto detti macchine di von Neumann. La prima rivoluzione nel mondo dei calcolatori elettronici è dovuta alla sostituzione dei tubi a vuoto con i transistor. Il transistor è più piccolo, più economico, dissipa meno calore delle valvole, e può essere usato esattamente come le valvole per costruire elaboratori. A differenza dei tubi a vuoto, il transistor è un dispositivo allo stato solido. L'uso del transistor caratterizza la seconda generazione di calcolatori. La seconda generazione vide l'introduzione di unità aritmetico-logiche e di unità di controllo più complesse, l'uso di linguaggi di programmazione ad alto livello e la fornitura di software di sistema a corredo del calcolatore.
La figura riflette la famosa legge di Moore. Gordon Moore, uno dei fondatori di Intel, nel 1965 ha osservato che il numero di transistor che potevano essere integrati in un singolo chip stava raddoppiando ogni anno e ha previsto correttamente che questo ritmo di crescita sarebbe continuato nel futuro immediato. Proprio come per i chip di memoria, la densità nei chip del processore ha continuato a crescere. Con il passare del tempo, fu possibile posizionare su ciascun chip un numero sempre crescente di elementi. Di conseguenza, per costruire un singolo processore furono richiesti sempre meno chip.
Visione ad alto livello delle funzioni e interconnessioni del calcolatore
Punti chiave:
- Il ciclo esecutivo di un'istruzione consiste nella sua lettura, seguita dall'eventuale prelievo degli operandi, dall'eventuale memorizzazione di dati e da un eventuale controllo di interrupt.
- I componenti principali in un sistema di elaborazione (processore, memoria centrale, I/O) devono essere interconnessi per scambiare dati e segnali di controllo.
- Il mezzo più comune di interconnessione è il bus di sistema condiviso costituito da più linee. Negli elaboratori attuali vi è una gerarchia di bus per migliorare le prestazioni.
Gli elementi chiave della progettazione dei bus includono l'arbitraggio (il permesso di mandare i segnali sulle linee del bus può essere centralizzato o distribuito), la temporizzazione (i segnali sui bus possono essere sincronizzati centralmente o in modo asincrono sulla base della più recente trasmissione), e l'ampiezza (il numero di linee di indirizzo e di dati).
Ad alto livello, un calcolatore consiste della CPU, della memoria e dei componenti di I/O. Questi elementi sono interconnessi per compiere la funzione base del calcolatore: eseguire programmi. Quindi, possiamo genericamente descrivere un sistema di elaborazione evidenziando il comportamento dei suoi componenti (i dati e i segnali di controllo che questi scambiano tra loro) e descrivendo le interconnessioni e i relativi controlli.
L'architettura di von Neumann si basa su tre concetti chiave:
- I dati e le istruzioni risiedono in un'unica memoria di lettura e scrittura;
- I contenuti di questa memoria sono accessibili per indirizzo, indipendentemente dal tipo di informazione rappresentata;
- L'esecuzione avviene in modo sequenziale (a meno di esplicite modifiche), da un'istruzione a quella immediatamente successiva.
Se c'è una particolare elaborazione da eseguire, è possibile costruire una configurazione di componenti logici appositamente progettata. Possiamo pensare al processo di connettere i vari componenti nella configurazione desiderata come un genere di programmazione. Il "programma" risultante è in forma hardware ed è chiamato programma cablato (hardware program). Supponiamo di costruire una generica configurazione di funzioni aritmetiche e logiche. Tale circuito eseguirà varie funzioni sui dati a seconda dei segnali di controllo applicati.
Nel caso di hardware dedicato il sistema accetta dati e produce risultati; nel caso di hardware generico, il sistema accetta dati e segnali di controllo e produce risultati. Dunque, invece di ri-cablare l'hardware per ogni nuova applicazione, il programmatore deve solo fornire un diverso insieme di segnali di controllo. Invece di ridefinire l'hardware per ciascuna applicazione, è sufficiente fornire una nuova sequenza di codici. Ogni codice è in effetti un'istruzione, e una parte dell'hardware la interpreta e genera i relativi segnali di controllo.
Per distinguere questo nuovo metodo di programmazione dal precedente, una sequenza di istruzioni è chiamata software. I due principali componenti del sistema sono: un interprete delle istruzioni e un modulo in grado di eseguire generiche istruzioni aritmetiche o logiche. Questi due componenti costituiscono la CPU. Per immettere dati e istruzioni nel sistema e per convertirli in un formato utilizzabile necessitiamo di dispositivi di input. Ed è anche richiesto un mezzo per emettere i risultati, ossia un modulo di output. Considerati assieme, i moduli di input e di output sono denominati componenti di I/O. Deve dunque essere possibile immagazzinare temporaneamente sia le istruzioni sia i dati. Tale compito è svolto dalla memoria, o memoria centrale.
Funzione del calcolatore
La funzione principale di un calcolatore è l'esecuzione di un programma, che consiste di un insieme di istruzioni registrate in memoria. Nella sua forma più semplice l'esecuzione delle istruzioni si divide in due passi: il processore legge le istruzioni dalla memoria una alla volta e le esegue. L'esecuzione di un programma consiste nella ripetizione di questo processo. L'elaborazione di una singola istruzione costituisce il suo ciclo esecutivo. I due passi sono detti fase di fetch e fase esecutiva.
All'inizio di ogni ciclo esecutivo il processore legge un'istruzione dalla memoria. In un processore tipico, un registro chiamato program counter (PC) contiene l'indirizzo della prossima istruzione da prelevare. Salvo diversa indicazione, il processore dopo il prelievo incrementa il PC, in modo che la prossima istruzione eseguita sia quella posizionata all'indirizzo di memoria immediatamente successivo. L'istruzione prelevata è caricata in un registro del processore noto come instruction register (IR). L'istruzione contiene bit che specificano l'operazione che il processore deve compiere. Il processore interpreta l'istruzione ed esegue l'azione richiesta.
In generale, queste azioni ricadono in quattro categorie:
- Processore-memoria: i dati possono essere trasferiti dal processore alla memoria o viceversa.
- Processore-I/O: i dati possono essere trasferiti verso una periferica o viceversa.
- Elaborazione dati: il processore può eseguire operazioni aritmetiche o logiche sui dati.
- Controllo: un'istruzione può specificare che la sequenza esecutiva venga alterata.
Interrupt
Praticamente tutti i calcolatori forniscono un meccanismo che consente ad altri componenti di interrompere la normale elaborazione del processore.
Classi di interrupt
- Programma: Generato da una condizione derivante dall'esecuzione di un'istruzione, quale un overflow (traboccamento), una divisione per zero, un tentativo di eseguire un'istruzione macchina scorretta o un riferimento al di fuori dello spazio di memoria dell'utente.
- Timer: Generato da un timer del processore (che permette al sistema operativo di eseguire determinate funzioni a tempi prefissati).
- I/O: Generato da un controllore di I/O, per segnalare il regolare completamento di un'operazione o una condizione di errore.
- Guasto hardware: Generato da un guasto (mancanza di alimentazione, errore di parità in memoria, etc.).
Gli interrupt sono previsti sostanzialmente per migliorare l'efficienza dell'elaborazione. Per esempio, la maggior parte dei dispositivi esterni è molto più lenta del processore. Si supponga che il processore stia trasferendo dati verso una stampante. Dopo ogni istruzione di scrittura, il processore deve fermarsi ad aspettare che la stampante completi la scrittura. Grazie agli interrupt, il processore può eseguire altre istruzioni mentre è in corso un'operazione di I/O. Quando il dispositivo esterno è pronto ad accettare altri dati dal processore, il relativo modulo di I/O manda al processore un segnale di richiesta di interrupt.
Interrupt multipli
La discussione fin qui si è concentrata sull'occorrenza di un solo interrupt. Si supponga, invece, che possano avvenire interrupt multipli. Ad esempio, un programma potrebbe ricevere dati da una linea di comunicazioni e stampare i risultati. La stampante genererà un interrupt ogni volta che completa un'operazione di stampa. Il controllore della linea di comunicazione genererà un interrupt ogni volta che arriva un'unità di dati.
Per trattare gli interrupt multipli si possono usare due approcci. Il primo è disabilitare gli interrupt durante l'elaborazione di un interrupt. Un interrupt disabilitato implica semplicemente che il processore può e deve ignorare il segnale di richiesta di interrupt. Se durante questo tempo avviene un interrupt, generalmente esso rimane pendente e sarà controllato dal processore dopo la riabilitazione degli interrupt. Un secondo approccio consiste nel definire le priorità per gli interrupt e consentire a un interrupt di priorità più alta di interrompere il trattamento di un interrupt a priorità inferiore.
Strutture di interconnessione
Un calcolatore consiste in un insieme di componenti o moduli di tre tipi fondamentali (processore, memoria, I/O) che comunicano tra loro. Dunque, devono esserci percorsi di collegamento che costituiscono la cosiddetta struttura di interconnessione.
- Memoria: tipicamente, un banco di memoria consiste di un certo numero di locazioni (celle o parole), tutte della stessa lunghezza. A ognuna di queste viene assegnato un indirizzo numerico univoco, che va da 0 a N - 1. Il contenuto di una locazione di memoria può essere letto o scritto. La natura dell'operazione è indicata dai segnali di controllo di lettura e scrittura. La locazione interessata è specificata da un indirizzo.
- Moduli di I/O: da un punto di vista interno al sistema, I/O è funzionalmente simile alla memoria. Sono possibili due operazioni, la lettura e la scrittura. Inoltre, un modulo di I/O può controllare più di un dispositivo periferico. Le interfacce di questi dispositivi sono considerate come porte e viene loro assegnato un indirizzo univoco, che va da 0 a M - 1. Inoltre, ci sono linee dati esterne per l'input e l'output dei dati. Infine, i moduli di I/O possono mandare segnali di interrupt al processore.
- Processore: legge le istruzioni e i dati, scrive i dati dopo l'elaborazione, usa segnali di controllo per gestire le operazioni del sistema e può ricevere segnali di interrupt.
L'elenco precedente definisce i dati da scambiare. Le interconnessioni garantiscono i seguenti tipi di trasferimento:
- Dalla memoria al processore: il processore legge un'istruzione o un dato dalla memoria.
- Dal processore alla memoria: il processore scrive un dato in memoria.
- Dall'I/O al processore: il processore legge i dati da una periferica.
- Dal processore all'I/O: il processore invia dati alla periferica.
- Dall'I/O alla memoria o viceversa: in questi due casi, i moduli di I/O possono scambiare dati direttamente con la memoria, senza passare per il processore, usando l'accesso diretto alla memoria (DMA).
Interconnessione a bus
Il bus è un mezzo di comunicazione che collega due o più dispositivi. Sua caratteristica peculiare è quella di essere un mezzo di trasmissione condiviso. Al bus si collegano più dispositivi, e un segnale trasmesso da uno di essi è disponibile per la ricezione da parte di tutti gli altri dispositivi connessi al bus. Generalmente, un bus consiste di più percorsi di comunicazione, detti linee. Ogni linea è in grado di trasmettere segnali che rappresentano i bit: 0 o 1.
Struttura dei bus
Il bus di sistema consiste tipicamente di un numero di linee che va da circa 50 a qualche centinaio. A ogni linea viene assegnato un particolare significato o funzione. Sebbene esistano vari schemi, le linee dei bus possono essere classificate in tre gruppi funzionali:
- Linee dati: forniscono il percorso su cui viaggiano i dati tra i moduli di sistema, e collettivamente sono chiamate bus dati, consistono di un numero di linee separate che va da 32 a qualche centinaio. Il numero di linee viene detto ampiezza del bus dati. Poiché ogni linea può trasportare solo un bit alla volta, il numero di linee determina quanti bit possano essere trasportati contemporaneamente.
- Linee indirizzi: vengono impiegate per designare la destinazione dei dati presenti sul bus dati (o la locazione da cui prelevarli). Ad esempio, se il processore intende leggere un dato (8, 16 o 32 bit) da una locazione di memoria, ne pone l'indirizzo sulla linea degli indirizzi. Chiaramente, l'ampiezza del bus degli indirizzi determina la massima quantità di memoria di un sistema.
- Linee di controllo: vengono utilizzate per controllare l'accesso e l'uso delle linee dati e indirizzi. Poiché queste ultime sono condivise da tutti i componenti, ci deve essere un mezzo per controllare il loro uso. I segnali di controllo trasmettono sia comandi sia informazioni di temporizzazione tra i moduli del sistema. I segnali di temporizzazione indicano la validità delle informazioni di dati e indirizzi. I segnali di comando specificano le operazioni da compiere.
Il bus opera come segue. Se un modulo desidera inviare dati a un altro, deve ottenere l'uso del bus e poi trasferire i dati sul bus. Se un modulo desidera richiedere dati da un altro modulo, deve ottenere l'uso del bus.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Riassunto calcolatori elettronici e reti di calcolatori 2
-
Riassunto esame Calcolatori Elettronici, Prof. Colombo Carlo, libro consigliato Calcolatori elettronici - Architett…
-
Riassunto esame Calcolatori Elettronici, Prof. Colombo Carlo, libro consigliato Architettura e organizzazione dei c…
-
Appunti Calcolatori Elettronici