Tecniche della Programmazione, 2017-18, Parte1 Per alcune slide di questa lezione ho tratto spunto, o brutalmente usato, quelle della raccolta dei proff. F.Frati e C.Limongelli, che ringrazio Tecniche della Programmazione, M.Temperini, 2017-2018 parte1, lezione1
(HARDWARE)
Memoria Centrale Consente di registrare (MEMORIZZARE ) dati/istruzioni in modo temporaneo: il contenuto scompare quando la memoria non e alimentata (la memoria e VOLATILE) - Operazione di MEMORIZZAZIONE: un dato/istruzione viene copiato in un area di memoria - Operazione di ACCESSO: il valore contenuto in un area di memoria viene acceduto, ad esempio viene copiato altrove per farci qualche altra operazione La chiamano RAM: Random Access Memory; non vuol dire che si accede a caso vuol dire che le operazioni di accesso e memorizzazione sono possibili ovunque, senza un ordine obbligatorio che imponga di visitare un area prima di un altra a priori. (Gli indirizzi, gli indirizzi!!!!) La CPU accede direttamente alla RAM, attraverso il BUS.
Struttura semplificata della memoria centrale gruppo di celle (LOCAZIONI DI MEMORIA); ciascuna (PAROLA) di 16/32/64 bit Indirizzi delle celle BUS indirizzi Cella selezionata in base all indirizzo Accesso Memorizzazione BUS di controllo BUS dati dato acceduto, o da memorizzare
Bah, vedremo per ora vale quanto scritto prima: kb 1024, etc!!!!
Si', ma... Cosa c'e' in una cella? 000000000 (Load) codice operazione IND What the hell, instructions, numbers... in a word DATA; in another word INFORMATION REG istr. macchina (load) da memoria a registro 0000000010 (add) R1 R2 Codice Reg1 Reg2 operazione istr. macchina per operazione tra due registri + -2 00003752 numero: un dato, che sicuramente rappresenta un'informazione...; in questo caso un numero rappresentato con segno, esponente e mantissa (ma potrebbe essere altro - intero, carattere... chissa'...)
Funzionamento di ACCESSO e MEMORIZZAZIONE In ACCESSO, il processore invia l indirizzo della cella da visitare, attraverso il BUS INDIRIZZI. E il valore acceduto e reso disponibile attraverso il BUS DATI. In MEMORIZZAZIONE, il processore invia il dato da copiare in memoria, attraverso il BUS DATI, e l indirizzo della locazione in cui eseguire la copia, attraverso il BUS NDIRIZZI. E Il valore viene copiato nella cella indicate. Ciasun accesso avviene in un tempo INDIPENDENTE DALLA LOCAZIONE (cioe dall indirizzo: remember, Random Access Memory)
Struttura della CPU accedi / memorizza
Elementi di una CPU CPU Unità di controllo Unità aritmetico logica (ALU) Registri Unità di controllo Control Unit CU) Svolge funzioni di controllo, decide quali istruzioni eseguire. Unità aritmetico logica (Arithmetic-Logic Unit ALU) esegue le operazioni aritmetico-logiche (+,-,ecc., confronto). Registri memoria ad alta velocità usata per risultati temporanei e informazioni di controllo; il valore massimo memorizzabile in un registro è determinato dalle dimensioni del registro; esistono registri di uso generico e registri specifici:
Registri (1/2) Esistono registri di uso generico e registri specifici : PC: contatore delle istruzioni (program counter) contiene l indirizzo della prossima istruzione da eseguire IR: registro delle istruzioni (instruction register) contiene l istruzione che deve essere eseguita PSW: program status word contiene informazioni, opportunamente codificate, sull esito dell ultima istruzione che è stata eseguita
Registri (2/2) MAR: registro indirizzi della memoria indirizzo della cella di memoria che deve essere acceduta o memorizzata MDR: registro dati della memoria dato che è stato acceduto o che deve essere memorizzato registri generali per memorizzare gli operandi ed il risultato di una operazione
Unità Aritmetico-Logica L'Unità Aritmetico-Logica (ALU) è costituita da un insieme di circuiti in grado di svolgere le operazioni di tipo aritmetico e logico La ALU accede ai valori di registry, esegue operazioni tra quei valori, memorizza risultati delle operazioni in registri
si', ma che fa la CPU? (che fa la ALU in collaborazione con la CU?) eseguele istruzionidel programma, chedeveesserescritto in linguaggio macchina... no?chealtro? ESEGUE Istruzioni MACCHINA per elaborazione dati aritmetiche logiche (AND, OR, NOT) relazionali (maggiore, minore, uguale,...) ESEGUE Istr. MACCHINA per controllo flusso esecuz. sequenza selezione ciclo salto (Jump) ad una data istruzione ESEGUE Istruzioni MACCHINA per trasferimento info dati ed istruzioni fra CPU e memoria dati fra CPU e dispositivi di I/O (tramite interfacce)
Istruzioni macchina? I circuiti della CPU collegano registri ed eseguono operazioni di accesso e memorizzazione su registry. Attraverso il BUS, e i registri, i circuiti possono interagire con la memoria e con le interfacce di I/O Yawn Piu o meno ogni circuito corrisponde ad una delle operazioni (compiti, lavori, cose che possono essere fatte) che la CPU puo eseguire usando e controllando le altre strutture del calcolatore. Yes! Queste sono le istruzioni eseguibili dalla CPU E queste sono le istruzioni macchina,
Istruzioni macchina! E queste sono le istruzioni macchina, nel senso che un programma scritto in linguaggio macchina, descrive la sequenza di istruzioni macchina che devono essere eseguite per acquisire i dati di input e risolvere il problema. Per essere eseguito, il programma va memorizzato (cioe messo in memoria). Ogni istruzione va scritta in memoria specificando il suo codice (codice operativo che identifica il circuito) (per questo si parla di codice sorgente, codice di programma, codifica per scrittura di un programma ) e quali registri sono coinvolti nell operazione da eseguire, e se serve, anche quali indirizzi di RAM devono essere coinvolti nell operazione. Continua con i Cenni sul linguaggio macchina
Memoria Cache La velocità con cui la CPU esegue le sue operazioni è la massima possibile in tutto il sistema di elaborazione. Il BUS trasmette dati alla sua velocità, che e' minore. La memoria gestisce le sue locazioni a velocità ancora minore. Le operazioni che coinvolgono le periferiche (unità di I/O, memoria esterna...) sono diversificate ma sempre (molto) più lente. Così, in quest'immensità, può succedere che il processore debba fermarsi ad aspettare che altre componenti del calcolatore finiscano il loro lavoro. Ad esempio se la CPU ha richiesto un dato alla RAM, la risposta arriverà un bel po' di clock dopo, lasciando la CPU inattiva per quel po' di tempo. Per diminuire i "clock di inattività della CPU", la soluzione consiste nell'usare una memoria più veloce della RAM e far interagire questa con la CPU. MA questa memoria è più costosa e quindi più piccola della RAM: non si può solo sostituire la RAM con questa memoria più veloce...che si chiama CACHE. Come funziona? Parti contigue della RAM vengono trasferite nella cache: la CPU interagisce con quelle. Quando i dati che servono non si trovano in cache, altre parti di RAM vengono messe in cache, al posto di quelle inutili. Cosi' la CPU interagisce con una memoria ad alta velocità, invece che con la RAM.
Cenni sul linguaggio macchina e sull esecuzione di un programma scritto in linguaggio macchina (ciclo di esecuzione delle istruzioni macchina da parte della CPU: Fetch, Decode, Execute)
CPU... R 0 R 1 R 1 L istruzione in IR, corrispondente all indirizzo in PC, viene riconosciuta (decodificata) e il relative circuito viene attivato C I ALU CU IR PC C I RAM Dati Programma in linguaggio macchina
Istruzioni di trasferimento: registri RAM 00000000 0000 00000000000000000011 R 0 R 1 R 2 00000001 0010 00000000000000000110 0001 0010 0011 0100 0101 0110 Codice registro Indirizzo locazione in RAM 8 bit 4 bit 20 bit Load Codice 00000000: copia nel registro specificato il contenuto della locazione specificata Store Codice 00000001: copia nella locazione specificata il contenuto del registro
Istruzioni aritmetiche eseguono somma, differenza, moltiplicazione e divisione usando i registri come operandi C Op R i R j ADD 00000010 SUB 00000100 MULT 00000110 DIV 00001000 MOD 00001010 Codice Reg-i Reg-j - 8 bit 4 bit Non usati 4 bit
Istruzioni di I/O: unita I/O RAM 00010000 0000 00000000000000000011 OUTPUT unit: 0001 INPUT unit: 0000 0001 0010 0011 0100 00010001 0001 00000000000000000110 0101 0110 Codice Unita Indirizzo locazione in RAM 8 bit 4 bit 20 bit write Codice 00010001: trasferisce all unita di output specificata il dato presente nella locazione specificata read Codice 00010000: legge un dato dall unita di input specificata e lo copia nella locazione specificata
Istruzioni di confronto confrontano il contenuto di 2 registri R i ed R j : se R i < R j viene messo -1 nel registro RC se R i = R j 0 in RC se R i > R j 1 in RC R C i Cf R j 00100000 Reg-i Reg-j - RC 8 bit 4 bit Non usati 4 bit COMP 00100000
STOP termina il programma Codice: STOP 10000001 10000001 8 bit Non usati
esempio scriviamo un programma macchina che: trasferisce il contenuto di 2 parole di indirizzo 64 e 68 della RAM nei registri R 0 ed R 1 li somma trasferisce la somma nella parola di indirizzo 60 della RAM
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro R0 (ind. 0000); Si trasferisce il contenuto della locazione 1000100 nel registro R1 (ind. 0001); Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 E poi si termina
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro 0000; Si trasferisce il contenuto della locazione 1000100 nel registro 0001; Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 00000000 0000 00000000000001000000 00000000 0001 0000000000000100100 00000010 0000 0001 00000001 0000 00000000000000111100 10000001 10000001000000000000000000000000
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro 0000; Si trasferisce il contenuto della locazione 1000100 nel registro 0001; Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 00000000 0000 00000000000001000000 Load 64 in R0 00000000 0001 0000000000000100100 00000010 0000 0001 00000001 0000 00000000000000111100 10000001 10000001000000000000000000000000
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro 0000; Si trasferisce il contenuto della locazione 1000100 nel registro 0001; Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 00000000 0000 00000000000001000000 00000000 0001 0000000000000100100 Load 4 in R0 Load 68 in R1 00000010 0000 0001 00000001 0000 00000000000000111100 10000001 10000001000000000000000000000000
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro 0000; Si trasferisce il contenuto della locazione 1000100 nel registro 0001; Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 00000000 0000 00000000000001000000 00000000 0001 0000000000000100100 00000010 0000 0001 Load 64 in R0 Load 68 in R1 Somma R0+R1 in R0 68 in R1 00000001 0000 00000000000000111100 10000001 10000001000000000000000000000000
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro 0000; Si trasferisce il contenuto della locazione 1000100 nel registro 0001; Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 00000000 0000 00000000000001000000 00000000 0001 0000000000000100100 00000010 0000 0001 00000001 0000 00000000000000111100 Load 64 in R0 Load 68 in R1 Somma R0+R1 in R0 68 in R1 Store R0 in ind.60 10000001 10000001000000000000000000000000
Algoritmo Si trasferisce il contenuto della locazione 1000000 nel registro 0000; Si trasferisce il contenuto della locazione 1000100 nel registro 0001; Si esegue la somma tra R0 ed R1 (avendo che il risultato viene memorizzato nel registro R0) Si trasferisce il contenuto del registro R0 nella locazione di indirizzo 00111100 00000000 0000 00000000000001000000 00000000 0001 0000000000000100100 00000010 0000 0001 00000001 0000 00000000000000111100 10000001 Load 64 in R0 Load 68 in R1 Somma R0+R1 in R0 68 in R1 Store R0 in ind.60 Stop
000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 000001000000000100 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 Programma in linguaggio macchina
000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 RUN 000001000000000111 PC 000001000000000100 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 Il programma che inizia li viene eseguito ripetendo il ciclo seguente: FETCH ISTR in PC IR DECODE Analisi IR code EXECUTE Circuito code attivato
X 000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 RUN 000001000000000111 PC 000001000000000100 prima 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 FETCH ISTR in PC IR DECODE Analisi IR code EXECUTE Circuito code attivato
X Y 000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 RUN 000001000000000111 PC 000001000000000100 seconda 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 FETCH ISTR in PC IR DECODE Analisi IR code EXECUTE Circuito code attivato
X Y 000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 RUN 000001000000000111 PC 000001000000000100 Terza. X+Y -> R0 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 FETCH ISTR in PC IR DECODE Analisi IR code EXECUTE Circuito code attivato
X Y X+Y 000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 RUN 000001000000000111 PC 000001000000000100 quarta 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 FETCH ISTR in PC IR DECODE Analisi IR code EXECUTE Circuito code attivato
X Y 000000000000111100 000000000000111101 000000000000111110 000000000000111111 000000000001000000 000000000001000001 000000000001000010 000000000001000011 000000000001000100 000000000001000101 61 RUN 000001000000000111 PC 000001000000000100 Quinta (stop) 00000000000000000000000001000000 000001000000000111 00000000000100000000000000100100 000001000000001000 00000010000000010000000000000000 000001000000001001 00000001000000000000000000111100 000001000000001010 10000001000000000000000000000000 000001000000001011 000001000000001100 FETCH ISTR in PC IR DECODE Analisi IR code EXECUTE Circuito code attivato
Cosa succede? Ciclo di esecuzione delle istruzioni Tre FASI, ripetute fino a quando si arriva a STOP (cioe, in altre parole, ripeture fintantoche non si arriva a STOP) - FETCH il processore si procura l istruzione da eseguire (ne ha l indirizzo nel PC, chiede, e la mette nell IR - DECODE l istruzione viene decodificata, cioe si decide che istruzione e - EXECUTE l istruzione in IR viene eseguita, cioe si attiva il circuito corrispondente (e qui puo essere che alter component del calcolatore vengano coinvolte)
Si, vabbe, ma in dettaglio? Quando il programma viene mandato in esecuzione, - avviene il caricamento (Loading) in memoria centrale - avviene lo START dell'esecuzione, copiando l'indirizzo della prima istruzione nel registro PC (Program Counter). Poi vengono eseguite ripetutamente le tre fasi... FETCH - la CU (Contro Unit) accede PC, cosi' sa qual e' l'indirizzo della prossima istruzione da eseguire; - il contenuto di PC viene copiato in MAR (Memory Address Register) - la CU chiede l'accesso alla locazione cha ha indirizzo dato da MAR, attraverso il bus controllo (questa locazione contiene l'istruzione da eseguire) - la memoria invia il contenuto della locazione (l'istruzione) tramite il bus dati, copiandola nel registro MDR (Memory Data Register) - la CU copia MDR in IR: adesso IR contiene l'istruzione da eseguire - PC viene incrementato di 1, cosi' ora punta a quella che dovrebbe essere la prossima istruzione da eseguire
Si, vabbe, ma in dettaglio? Quando il programma viene mandato in esecuzione, - avviene il caricamento (Loading) in memoria centrale - avviene lo START dell'esecuzione, copiando l'indirizzo della prima istruzione nel registro PC (Program Counter). Poi vengono eseguite ripetutamente le tre fasi... FETCH - la CU (Contro Unit) accede PC, cosi' sa qual e' l'indirizzo della prossima istruzione da eseguire; - il contenuto di PC viene copiato in MAR (Memory Address Register) - la CU chiede l'accesso alla locazione cha ha indirizzo dato da MAR, attraverso il bus controllo (questa locazione contiene l'istruzione da eseguire) - la memoria invia il contenuto della locazione (l'istruzione) tramite il bus dati, copiandola nel registro MDR (Memory Data Register) - la CU copia MDR in IR: adesso IR contiene l'istruzione da eseguire - PC viene incrementato di 1, cosi' ora punta a quella che dovrebbe essere la prossima istruzione da eseguire DECODE - la CU analizza IR e capisce qual e' il codice dell'istruzione; di conseguenza sa anche quali operandi aspettarsi (numero di registro, indirizzo in RAM... nulla...) - la CU recupera gli operandi con altre richieste sul bus controllo, ricevendo risposta sul bus dati. - I valori ricevuti vanno nei registri della ALU che sono coinvolti nell'operazione che sta per essere eseguita
Si, vabbe, ma in dettaglio? Quando il programma viene mandato in esecuzione, - avviene il caricamento (Loading) in memoria centrale - avviene lo START dell'esecuzione, copiando l'indirizzo della prima istruzione nel registro PC (Program Counter). Poi vengono eseguite ripetutamente le tre fasi... FETCH - la CU (Contro Unit) accede PC, cosi' sa qual e' l'indirizzo della prossima istruzione da eseguire; - il contenuto di PC viene copiato in MAR (Memory Address Register) - la CU chiede l'accesso alla locazione cha ha indirizzo dato da MAR, attraverso il bus controllo (questa locazione contiene l'istruzione da eseguire) - la memoria invia il contenuto della locazione (l'istruzione) tramite il bus dati, copiandola nel registro MDR (Memory Data Register) - la CU copia MDR in IR: adesso IR contiene l'istruzione da eseguire - PC viene incrementato di 1, cosi' ora punta a quella che dovrebbe essere la prossima istruzione da eseguire DECODE - la CU analizza IR e capisce qual e' il codice dell'istruzione; di conseguenza sa anche quali operandi aspettarsi (numero di registro, indirizzo in RAM... nulla...) - la CU recupera gli operandi con altre richieste sul bus controllo, ricevendo risposta sul bus dati. - I valori ricevuti vanno nei registri della ALU che sono coinvolti nell'operazione che sta per essere eseguita EXECUTE - la CU coordina l'esecuzione, coinvolgendo le parti necessarie (le periferiche di I/O per le operazioni di lettura/scrittura, la ALU per le operazioni di competenza, bus e memoria per gli accessi e memorizzazioni eventuali - l'esito dell'operazione viene registrato nella PSW (Program Status Word). I bit della PSW dicono, ad esempio, se l'ultima operazione aritmetica ha restituito 0, se c'e' stato un riporto, se c'e' stato un errore, se c'e' un'interrupt (sospensione del programma)...vengano coinvolte)
Si, vabbe, ma in dettaglio? Quando il programma viene mandato in esecuzione, - avviene il caricamento (Loading) in memoria centrale - avviene lo START dell'esecuzione, copiando l'indirizzo della prima istruzione nel registro PC (Program Counter). Poi vengono eseguite ripetutamente le tre fasi... FETCH - la CU (Contro Unit) accede PC, cosi' sa qual e' l'indirizzo della prossima istruzione da eseguire; - il contenuto di PC viene copiato in MAR (Memory Address Register) - la CU chiede l'accesso alla locazione cha ha indirizzo dato da MAR, attraverso il bus controllo (questa locazione contiene l'istruzione da eseguire) - la memoria invia il contenuto della locazione (l'istruzione) tramite il bus dati, copiandola nel registro MDR (Memory Data Register) - la CU copia MDR in IR: adesso IR contiene l'istruzione da eseguire - PC viene incrementato di 1, cosi' ora punta a quella che dovrebbe essere la prossima istruzione da eseguire DECODE - la CU analizza IR e capisce qual e' il codice dell'istruzione; di conseguenza sa anche quali operandi aspettarsi (numero di registro, indirizzo in RAM... nulla...) - la CU recupera gli operandi con altre richieste sul bus controllo, ricevendo risposta sul bus dati. I valori ricevuti vanno nei registri della ALU che sono coinvolti nell'operazione che sta per essere eseguita EXECUTE - la CU coordina l'esecuzione, coinvolgendo le parti necessarie (le periferiche di I/O per le operazioni di lettura/scrittura, la ALU per le operazioni di competenza, bus e memoria per gli accessi e memorizzazioni eventuali - l'esito dell'operazione viene registrato nella PSW (Program Status Word). I bit della PSW dicono, ad esempio, se l'ultima operazione aritmetica ha restituito 0, se c'e' stato un riporto, se c'e' stato un errore, se c'e' un'interrupt (sospensione del programma)...vengano coinvolte)