Architettura dell'elaboratore (modello di Von Neumann) L’architettura base di un elaboratore comprende: • un Processore o CPU: è l’unità che elabora le informazioni eseguendo le istruzioni di un programma. • una Memoria Centrale (o Working Memory = memoria di lavoro): è la memoria RAM in cui vengono temporanemente memorizzati dati e istruzioni dei programmi in esecuzione. • Diverse Unità Periferiche o di Input/Output (I/O). Esse consentono la comunicazione tra l'Unità Centrale (= CPU + Memoria centrale) e l'ambiente esterno. Le periferiche possono essere: a) unità di interazione utente-sistema (es: mouse, tastiera, schermo, stampante, ecc.); b) unità di memoria di massa (dischi magnetici, dischi ottici, memorie USB, nastri magnetici, ecc.); c) Unità di comunicazione tra computer (modem, schede di rete, ecc.). L'architettura di Von Neumann è caratterizzata dal fatto che sia il programma in esecuzione che i dati su cu esso lavora devono essere presenti nella memoria centrale (stored program computer). Il PROCESSORE (o CPU = Central Processing Unit) è a sua volta costituito da: − Una Unità di Controllo (CU: Control Unit). Essa sovrintende al funzionamento dell'intero processore dirigendone le operazioni. Per fare questo utilizza tra l’altro alcuni registri speciali chimati Program Counter (PC), Instruction Register (IR), Program Status Word (PSW, detto anche Status Register o Flag Register). − Una Unità Aritmetico-Logica (ALU: Arithmetic Logic Unit). L'ALU è in grado di eseguire semplici operazioni aritmetiche, logiche (AND, OR, ecc) e di confronto (uguale, maggiore, ecc.). I dati su cui opera la ALU devono essere contenuti nei registri del processore. − Un insieme di Registri (registri generali). I registri sono delle memorie di piccole dimensioni (normalmente da 8 a 64 bit ciascuno) ma ad accesso molto veloce: essi contengono informazioni (dati, indirizzi o istruzioni) che la CPU preleva dalla memoria centrale oppure informazioni che la CPU deve registrare nella memoria centrale. I registri generali sono visibili dal programmatore. Di solito sono indicati con sigle come R1, R2, R3, ecc. oppure AX, BX, CX, ecc. Inoltre per le operazioni di lettura (Read) e scrittura (Write) si utilizzano due appositi registri detti MAR (Memory Address Register o Registro Indirizzi) e MDR (Memory Data Register o Registro Dati). La MEMORIA CENTRALE (detta anche: Working Memory o Short Term Memory,) è costituita da una sequenza di di locazioni (o celle) di memoria, tutte di uguale dimensione. La dimensione di una cella è detta parola di memoria (memory word). Può essere di 1 byte oppure di 2, 4, 8 ecc. Ognuna di queste locazioni è distinta mediante un numero progressivo chiamato indirizzo di memoria. L'indirizzo viene utilizzato dalla CPU per specificare in quale locazione deve essere effettuata una operazione di lettura o di scrittura. Attenzione: non bisogna confondere l'indirizzo di una locazione di memoria con il suo contenuto. Ad esempio la cella di indirizzo 213 può contenere in un certo momento il valore 25. Il contenuto può essere cambiato con una operazione di scrittura. L'indirizzo di una cella è invece fisso. La memoria centrale è realizzata in generale mediante moduli di RAM dinamica ed è una memoria volatile. Alcune informazioni devono essere presenti in una ROM (Read Only Memory = memoria a sola lettura). Questa memoria, oltre a essere permanente, contiene informazioni fisse che devono essere sempre presenti nella memoria centrale, ad esempio le istruzioni da eseguire al momento dell'accensione dell'elaboratore. Varianti evolute della ROM sono le memorie PROM, EPROM, EEROM, ecc. Il tempo di accesso ad un dato presente in una memoria RAM è sempre lo stesso, indipendentemente da quale è la cella in cui il dato si trova. Ciò non è vero per memorie di massa come dischi magnetici, dischi ottici, nastri magnetici. Inoltre la velocità di accesso alla memoria centrale è molto superiore a quella dei dischi. I registri della CPU hanno un accesso a loro volta molto più veloce rispetto alla RAM. I computer attuali utilizzano di norma anche una o più memorie cache. La cache è costituita da moduli di RAM statica. Essa è più piccola e più veloce rispetto alla normale RAM (RAM dinamica), ma è anche molto più costosa. La cache viene usata per migliorare le prestazioni del computer rendendo mediamente più rapido l’accesso ai dati contenuti nella memoria centrale. Ciò si ottiene copiando nella temporaneamente nella cache i dati più frequentemente usati. La tabella seguente riassume le caratteristiche tipiche di alcuni tipi di memoria presenti nei personal computer. Tipo di memoria Registri della CPU Memoria centrale Dischi magnetci Nastri magnetici Tempo di accesso < 10 ns 20 - 200 ns 20 – 30 ms Diversi secondi Capacità < 1 KB 1 - 4 GB 50 – 500 GB > 100 GB Volatile Sì Sì No No Nota: ms = µs = ns = KB = MB = GB = millisecondi = millesimi di secondo = 10-3 sec microsecondi = milionesimi di secondo = 10-6 sec nanosecondi = miliardesimi di secondo = 10-9 sec KiloByte = 210 Byte (1024 byte, cioè circa mille) MegaByte = 220 Byte (circa 1 milione) GigaByte = 230 Byte (circa 1 miliardo) BUS La comunicazione tra i diversi componenti di un elaboratore avviene attraverso un insieme di linee di collegamento dette BUS. I Bus che collegano la CPU alla memoria centrale sono tre: Bus Dati, Bus Indirizzi, Bus di controllo. Il Bus Dati, bidirezionale, trasporta i dati tra il processore e la memoria centrale. La dimensione (numero di linee) del bus dati determina la dimensione in bit del dato che può essere scritto o letto con una singola operazione di lettura/scrittura (es: se il bus dati ha 16 linee si scrivono/leggono due byte per volta). Il Bus Dati è direttamento connesso al registro MDR. Il Bus Indirizzi, unidirezionale, viene utilizzato per trasmettere l'indirizzo di una locazione di memoria centrale in cui il processore deve scrivere o leggere un dato. L'indirizzo può anche identificare una periferica con la quale il processore deve comunicare. La dimensione del bus indirizzi determina lo spazio di memoria indirizzabile (es: se il bus indirizzi ha 20 linee, lo spazio indirizzabile è di 220 celle, quindi se le celle sono di 1 Byte il totale è 1 MB). Il Bus Indirizzi è direttamento connesso al registro MAR. Il Bus di Controllo, bidirezionale, trasporta informazioni di controllo necessarie per la gestione dell'attività elaborativa. Ad esempio il bus di controllo contiene una linea indicata in genere con R/W il cui valore (0 o 1) indica se si deve effettuare una operazione di lettura (R=Read) o di scrittura (W= Write). Altre linee comunemente usate sono quelle per la richiesta di interruzione (INTR = Interrupt Request) e per la risposta a un’interruzione (INTA = Interrupt Acknowledge) LETTURA / SCRITTURA in memoria centrale Per effettuare una operazione di lettura o scrittura di un dato in memoria centrale si utilizza il Registro Dati (o MDR=Memory Data Register) e il Registro Indirizzi (o MAR=Memory Address Register). Le operazioni di lettura e scrittura avvengono nel modo seguente. Lettura: − La CU pone nel registro indirizzi (MAR) l'indirizzo della locazione di memoria da cui si deve leggere il dato. − La CU invia alla memoria l’indirizzo tramite il bus indirizzi. Invia inoltre sulla linea R/W del bus di controllo il bit che indica il tipo di operazione da eseguire (R=Read). − Il dato presente nella cella di memoria specificata viene inviato alla CPU tramite il bus dati e viene copiato nel Registro Dati (MDR). Scrittura: − − − − La CU pone nel Registro Dati (MDR) il dato da scrivere in memoria e nel Registro Indirizzi (MAR) l’indirizzo dove scriverlo. La CU invia l’indirizzo alla memoria tramite il bus indirizzi. La CU invia alla memoria sulla linea R/W del bus di controllo il bit che indica il tipo di operazione da eseguire (W=Write). Il dato presente nel Registro Dati (MDR) viene inviato alla memoria tramite il bus dati e viene copiato nella cella specificata. Attenzione: il trasferimento di un dato avviene sempre mediante copia. Pertanto, ad esempio, una operazione di lettura non modifica mai la cella di memoria letta. Funzionamento del processore (ciclo di FETCH - EXECUTE) Un processore esegue dei programmi. Un programma (codice eseguibile) è costituito da una sequenza di istruzioni macchina che il processore è in grado di eseguire una per volta. Le istruzioni devono essere eseguite nell'ordine in cui si trovano, tranne quando si incontrano alcune speciali istruzioni che alterano la sequenza, causando ad esempio un salto ad un dato punto del programma. Prima di iniziare ad eseguire un programma è necessario prelevarlo da una memoria di massa (es: disco) e caricarlo in un'area della memoria centrale. Questa opeerazione viene eseguita da un apposito modulo del Sistema Operativo, detto Loader (caricatore). Per eseguire un programma la CPU preleva una per una le istruzioni che compongono il programma e le esegue fino a quando il programma non è terminato. Il ciclo di operazioni svolte dalla CPU per eseguire un programma è detto ciclo di FETCH-EXECUTE (preleva - esegui) e costituisce la normale attività svolta sempre e continuamente dal processore, dal momento dell'accensione fino allo spegnimento della macchina. Il ciclo Fetch-Execute fa uso di due speciali registri: − Program Counter (PC): contiene l'indirizzo della cella di memoria in cui si trova l'istruzione da prelevare (se l'istruzione occupa più celle consecutive, contiene l'indirizzo della prima di queste celle ). − Instruction Register (IR): contiene il codice dell'istruzione prelevata dalla memoria. Il ciclo Fetch-Execute avviene ripetendo in successione le seguenti operazioni: − Fase di Fetch. L'istruzione da eseguire viene prelevata dalla memoria centrale (all'indirizzo indicato dal PC) e copiata nel Registro Istruzione (IR). − Incremento del PC. Il valore contenuto nel registro PC viene incrementato in modo da puntare all'istruzione successiva (l'incremento deve essere pari al numero di celle occupate dall'istruzione). − Fase di Execute. Viene decodificata l'istruzione presente nell'IR (fase di Decode), vengono prelevati gli operandi (Fetch degli operandi), e viene infine eseguita l’istruzione. L'esecuzione dell'istruzione può modificare il contenuto di uno o più registri della CPU oppure di una o più locazioni di memoria centrale. In alcuni casi l'istruzione può modificare il contenuto del registro PC (es: istruzioni di JUMP) causando così un salto ad un'istruzione specifica. Le condizioni che si verificano durante l'esecuzione dell'istruzione vengono memorizzate come Flag (valore binario: 0=falso, 1=vero) in un apposito registro della CPU detto Program Status Register (PSW) (anche detto Registro dei Flag). Ad esempio ci sono flag per indicare il verificarsi di condizioni di overflow (traboccamento), carry (riporto), zero (l'istruzione ha avuto 0 come risultato), negatività (il risultato è stato negativo), ecc. Attenzione: non bisogna confondere la funzione svolta dai registri Program Counter e Instruction Register. Il PC contiene sempre l'indirizzo (puntatore) di una istruzione, mentre l'IR contiene invece il vero e proprio codice dell’istruzione. INTERRUZIONI (Interrupt) Il ciclo di esecuzione di un programma può subire delle interruzioni (interrupt) causate da richieste provenienti da dispositivi periferici (unità di I/O, dischi, ecc.) o anche da programma. Ciò avviene ad esempio quando si preme un tasto della tastiera oppure si fa un click con il mouse. La periferica invia una richiesta di interrupt alla CPU su una apposita linea del bus di controllo. La CPU di norma interrompe momentaneamente l'esecuzione del programma attuale per passare ad eseguire le istruzioni necessarie per servire l'interrupt (es: acquisire un carattere digitato, rilevare la posizione del mouse, ecc). Successivamente tornerà ad eseguire il programma interrotto. CLOCK Il lavoro della CPU è cadenzato da un apposito dispositivo detto clock che fornisce un segnale elettrico ciclico di temporizzazione (onda quadra). La velocità di clock si misura in Hertz (1HZ = un ciclo al secondo) o multipli di Hertz (es: 1 Mhz = 1 milione di cicli al secondo, 1 GHz = 1 miliardo di cicli al secondo) e fornisce un'indicazione della velocità di lavoro di una CPU. Ogni istruzione macchina viene eseguita in un numero ben preciso di cicli di clock. Un'altra misura utilizzata per i processori è il MIPS (milioni di istruzioni per secondo).