Elementi di informatica e programmazione 1p.pdf
Document Details
Uploaded by Deleted User
Full Transcript
Problema: classe di domande omogenee, le quali coinvolgono delle variabili di ingresso (input) e di uscita (output) Istanza di un problema: domanda con una variabile di input precisa (1 domanda tra le tante) Per risolvere un determinato problema noi possiamo avvalerci di un algoritmo Algoritmo: meto...
Problema: classe di domande omogenee, le quali coinvolgono delle variabili di ingresso (input) e di uscita (output) Istanza di un problema: domanda con una variabile di input precisa (1 domanda tra le tante) Per risolvere un determinato problema noi possiamo avvalerci di un algoritmo Algoritmo: metodo/procedura che specifica come produrre una soluzione per ogni possibile istanze del problema; esso è descritto mediante una sequenza di istruzioni elementari. Esso viene svolto in 5 fasi principali: 1. Identifico il problema 2. Analisi del problema 3. Descrizione dell'algoritmo (scrittura del programma) 4. Interpretazione del programma (descrizione interpretata in codice binario) 5. Attuazione della soluzione Le prime 3 fasi sono svolte da un umano (1° soggetto) mentre le ultime 2 possono essere effettuate sia da una macchia che da un uomo (2° soggetto) Nel risolvere un problema noi possiamo utilizzare 2 tipologie di scomposizione di esso: - Top-down: prima risolvo il problema generale dando per scontate le problematiche minori e poi risolvo problematiche minori che fanno parte del problema e che abbiamo dato inizialmente per scontate - Bottom-up: prima risolvo le problematiche minori e solo in seguito il problema generale Esempio di un algoritmo: Problema: "quanto vale la radice quadrata intera y (var. in uscita) di x (var. in entrata)?" 1) Assegna a y il valore 1 2) Se allora vai al passo 3, altrimenti vai al passo 5 3) Incrementa y di 1 unità 4) Vai al passo 2 5) Decrementa y di 1 unità 6) Fine 2° versione (se il calcolatore può effettuare solo + e -)-> "quanto vale il quadrato z (var. in uscita) di un intero y (var. d'ingresso)" 1) Assegna a z il valore 0 2) Assegna w (variabile ausiliaria) il valore 1 3) Se w y allora vai al passo 4 altrimenti vai al passo 7 4) Incrementa w di 1 unità 5) Incrementa z di 1 unità 6) Vai al passo 3 7) fine Istruzione di controllo Se un problema è risolvibile allora esistono infiniti algoritmi per risolverlo in quanto posso aggiungere istruzioni che potenzialmente si annullano a vicenda Cenni storici Allo stesso tempo ci sono problemi che non hanno un algoritmo che li possa risolvere, come già assodato da Alan Turing. All'inizio dello scorso secolo infatti è avvenuta una crisi dei fondamenti della matematica su basi logiche e non su assiomi. Russel, un noto matematico, si accorge che con la logica si possono esporre dei teoremi anche se sono falsi mentre Godel si accorge che in matematica si possono esporre teoremi che non possono essere ne veri ne falsi (autoreferenziali) Turing parte dai risultati di Godel e dimostra che possono esserci problemi che non possono essere risolti dalle macchine Ad esempio i problemi decidibili, vale a dire quelli che parlano di se stessi; es. vedere se un programma termina o meno-> la macchina non lo può fare e, per questo, esiste la fase di collaudo Elementi di informatica e programmazione 1p Pagina 1 Le macchine non sono consapevoli di quello che eseguono, infatti, chi risolve veramente il problema è l'uomo. La fase di attuazione (quindi la fase svolta dal 2° soggetto) è solitamente svolta dalla macchina in quanto più efficiente dell'uomo (più veloce, più affidabile, ha più memoria ed è più economica del lavoro manuale dell'uomo) Il calcolatore (computer in italiano, il quale differisce dalla calcolatrice perché essa è preimpostata) infatti è colui che attua la soluzione (esecutore) di un problema I problemi autoreferenziali, ad esempio, non sono risolvibili da un programma. Se il 1° soggetto è umano e il 2° è una macchina allora bisogna trovare un linguaggio che la macchina sia in grado di interpretare (lingue umane (ita, eng, ecc.)→linguaggio naturale) Nella scrittura di un programma dobbiamo specificare: - Le azioni che l'attuatore deve compiere le quali devono essere semplici e in quantità finita (pragmatica) - Le regole, descritte in modo completo e non ambiguo (caratterizzazione sintattica, significato delle istruzioni) Nella fase di programmazione vi possono essere degli errori: - Nella 1° fase gli errori sono di tipo funzionale (sbaglio ad identificare il problema e sono errori gravi e costosi) - Nella 2° fase gli errori sono di tipo logico primari (l'algoritmo che ho definito non risolve il problema) - Errori nella fase di descrizione, vale a dire che il programma non traduce correttamente l'algoritmo (errori logici secondari)→ possono essere: ○ Errori semantici (costosi da correggere perché difficili da individuare→ c'è il collaudo) ○ Errori sintattici (economici da correggere perché automaticamente rilevati dalla macchina, abbiamo sbagliato ad utilizzare le regole del linguaggio) Se gli errori vengono effettuati dalle macchine vengono definiti errori operativi (particolarmente rari) Definizioni importanti per il concetto dell'algoritmo Computazione: esecuzione di un algoritmo in corrispondenza di certi dati iniziali Passo di computazione: ogni singolo passo elementare che l'esecutore compie durante la computazione Processo: sequenza di passi elementari che l'esecutore compie in corrispondenza di certi dati iniziali durante l'esecuzione di un algoritmo Flusso di esecuzione: ordine di esecuzione delle istruzioni L'algoritmo è il concetto statico che esiste nel momento in cui io lo descrivo mentre il processo è il concetto dinamico, siccome varia nel tempo (i passi di computazione aumentano nel tempo) Proprietà di un algoritmo: ▫ Finitezza: gli algoritmi devono essere scrivibili e il n° di istruzioni deve essere finito (al contrario il processo potrebbe essere infinito) ▫ Univocità: le istruzioni devono essere univocamente interpretabili ▫ Effettività: le istruzioni devono essere di complessità limitata tempi finiti di esecuzione ▫ Determinismo: per ogni passo della computazione esiste almeno un passo successivo ▫ Correttezza: calcola correttamente la funzione rappresentata ▫ Efficienza: algoritmo utilizza una certa quantità di risorse fisiche (tempo di calcolo e quantità di memoria utilizzata) ▫ Terminazione: numero finito di passi di computazione n.b. non confondere finitezza (la quale si riferisce alle istruzioni dell'algoritmo) e terminazione (che si riferisce alla quantità di passi del processo) Elementi di informatica e programmazione 1p Pagina 2 Un algoritmo è una sequenza di istruzioni contenenti delle variabili Le istruzioni possono essere di 3 tipologie: Elaborazione (richiedono un calcolo) → istruzioni di assegnamento (è utile immagazzinare in una variabile il risultato di calcolo) Input/output Controllo Le variabili devono avere delle precise caratteristiche: - Nome (C è case-sensitive e quindi possiamo trovare una variabile x e una X) - Locazione di memoria - Tipo (il linguaggio che prevede dei tipi per le variabili viene definito tipizzato)→ si specifica il dominio della variabile (es. le variabili intere possono assumere solo valori intesi) - Può avere un valore assegnato (esso può cambiare nel corso del programma) - Possono comparire in istruzioni di assegnamento ed espressioni - Variabilità (costante, modificabile, ecc.) - Struttura ○ Elementari (int, float, bool, ecc.) ○ Strutturate (es. data calendario=3 int) - Origine (alcune sono già definite nel linguaggio, altrimenti possiamo definirle noi) - Visibilità del codice ○ Globali (utilizzate in tutto il programma) ○ Locali (utilizzate solo in certi pezzi del programma) - Visibilità nel flusso di esecuzione ○ Statiche (valore memorizzato dall'inizio alla fine) ○ Automatica (valore memorizzato solo in certi pezzi) Istruzioni di assegnamento/elaborazione ○ Notazione: xy ○ Servono per attribuire un valore alla variabile ○ Da un lato della freccia potrebbe esserci anche una operazione (tipo y+1 ecc.) Esempio: Con x=7 e y=9 Se voglio scambiare i valori di x e y è necessaria una terza variabili tmp e quindi faremo tmp x tmp=7, x=7, y=9 xy tmp=7, x=9, y=9 y tmp tmp=7, x=9 y=7 Istruzioni aritmetico-logiche - Espressioni aritmetiche ○ Assegnamento o controllo ○ Operandi: variabili, costanti, espressioni aritmetiche ○ Operatori: somma (+), sottrazione (-), moltiplicazione (*), divisione intera (/), resto (%) ○ Semantica: quella usuale dell'aritmetica - Espressioni relazionali ○ Confronto ○ Operandi: variabili, costanti, espressioni aritmetiche ○ Operatori: uguaglianza (==), diversità (!=), minoranza () tra numeri ○ Semantica: quella delle disequazioni fra numeri - Espressioni logiche e predicati logici ○ Operandi: variabili, costanti, espressioni relazionali ○ Operatori: congiunzione (AND), disgiunzione (OR) e negazione (NOT) ○ Semantica: quella dell'Algebra di Boole (logica proposizionale) Elementi di informatica e programmazione 1p Pagina 3 Operatori dell'algebra di Boole: Negazione not A Congiunzione A and B Disgiunzione A or B Disgiunzione esclusiva A xor B Implicazione (se…allora) Doppia implicazione (se e solo se) Gli operatori logici possono essere unari (negazione) o binari (tutti gli altri) A B A and B A or B A xor B 0 0 0 0 0 1 1 0 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 Proprietà da conoscere: And (*,moltiplicazione logica) Or(+,somma logica) Identità A*1=A A+0=A Elemento nullo A*0=0 A+1=A Idempotenza A*A=A A+A=A Inverso A*(-A)=0 A+(-A)=1 Commutativa A*B=B*A A+B=B+A Associativa A*(B*C)=(A*B)*C A+(B+C)=(A+B)+C Distributiva A*(B+C)=(A*B)+(B*C) A+(B*C)=(A+B)*(B+C) Teorema di assorbimento A*(A+B)=A A+(A*B)=A Teorema di De Morgan -(A*B)=(-A)+(-B) -(A+B)=(-A)*(-B) += OR, *=AND Dimostrazione del teorema di assorbimento (versione dell'OR): Enunciato: A+(A*B)=A A si può scrivere come (A*1) Quindi diventa (A*1)+(A*B)→ uso la proprietà distributiva (?) quindi (A*1)*(1+B) ma 1+B=1 Quindi diventa A*1=A Dimostrazione del teorema di assorbimento (versione dell'AND): Enunciato: A*(A+B)=A A si può scrivere come (A*A) Quindi diventa (A*A)+(A*B)→ frutto l'assorbimento dell'OR quindi A+(A*B)=A Dimostrazione del teorema di De Morgan Enunciato: -(A*B)= -A + (-B) 1- → 2- Elementi di informatica e programmazione 1p Pagina 4 Schemi a blocchi È una modalità di rappresentazione degli algoritmo ed una simbologia comunemente utilizzata: 1- Blocco di inizio 2- Blocco di input/output 3- Blocco di fine 4- Blocco di elaborazione (istruzione di elaborazione) 5- Selezione a 2 vie 6- Sottoprogramma (per operazioni complesse) Questi blocchi sono unità elementari per costituire uno schema a blocchi, le quali tra loro sono unite da archi (unità + archi= cammino) Es. 1 "Acquisire 2 dati e visualizzare il massimo tra i due" (input, output) 1) Acquisisci un dato e memorizzalo in x 2) Acquisisci un dato e memorizzalo in y 3) Assegna a m il valore di x 4) Se y>m allora vai al passo 5, altrimenti vai al passo 6 5) Assegna a m il valore di y 6) Visualizza m 7) Termina Es. 2 "Acquisire un interno n e visualizzare il max tra n interi acquisiti" (input, output) 1) Acquisisci un dato e memorizzalo in n 2) Acquisisci un dato e memorizzalo in m 3) Assegna a m il valore di x 4) Assegna ad i il valore 1 5) Se i i calcolatori moderni hanno una scheda grafica per migliorare questo aspetto) - Sovraccarico di lavoro per la CPU (lavora anche quando non è coinvolta-> i calcolatori moderni hanno i DMA (data memory access)) CPU La CPU è suddivisa in 2 parti (entrambe composte da parti logiche): - Unità di controllo: comanda tutti i dispositivi del calcolatore; rete sequenziale (le uscita dipendono dai dati d'ingresso e dall'azione svolte in precedenza (stato)) - Data path: suddivisa in ALU (unità aritmetico-logica) e registri (memorie di piccolissime dimensioni, max. una parola di memoria) ○ ALU-> elabora i dati (svolge le operazioni); è un dispositivo combinatoriale (l'uscita dipende unicamente dai suoi dati di ingresso) Elementi di informatica e programmazione 1p Pagina 11 Memoria centrale La memoria centrale, la cui capacità è misurata in byte (memorizzabili contemporaneamente), è suddivisa in parole di memoria (unità minima trasferibile-> non posso trasferirne una quantità minore)→ più parole di memoria insieme costituiscono una pagina di memoria L'indirizzo è omologato al concetto di parola o byte In alcuni calcolatori l'indirizzo è assegnato, in altri l'indirizzo è costituito dal 1° byte della parola Es. se ho 32 bit posso distinguere in 2^32 parole di memoria (4 giga di parole vale a dire 8 GB) e 2 ^32 byte (4 Gigabyte) Nella struttura del processore vi sono 5 principali registri (il cui nome descrive una funzione): 1- MAR (memory access registrer) → memorizza gli indirizzi dei dati in memoria fuori dalla CPU 2- MDR (memory data register) → memorizza i dati che circolano da e verso la CPU 3- PC (program counter, è anche detto IP, vale a dire istruction pointer) → indica l'indirizzo della prossima istruzione da eseguire 4- IR (istruction register) → memorizza l'istruzione da eseguire 5- PSW (processor status word) → è legata direttamente alla ALU, indica lo stato del processore (tra cui l'esito dell'ultima operazione della ALU); ciascun bit porta una diversa informazione (configurazione tra 2 possibili/2 entità informative)-> ogni bit risponde ad una yes or no question (motivo per il quale la ALU è direttamente collegata alla PSW) Non tutti i bit riguardano strettamente il risultato dell'ultima operazione logica poichè alcune istruzioni hanno più libertà rispetto ad altre ma quest'informazione è massicciamente presente all'interno del registro PSW Cosa vuol dire che un calcolatore è a 32 bit piuttosto che a 64 bit? I 32/64 bit si riferiscono ai bit delle parole di memoria e ai bit di ampiezza degli indirizzi → vincolano anche i bit che i registri della CPU sono tenuti a memorizzare Quindi (prendendo come riferimento 32 bit): ▫ Parole di memoria 32 bit ▫ Ampiezza indirizzi 32 bit ▫ MAR 32 bit ▫ PC 32 bit ▫ MDR 32 bit (non può essere meno) ▫ IR almeno 32 bit (richiede bit tanti quanti ne richiede l'istruzione più lunga possibile in quanto impostato con i dati che sono caricati dalla memoria) ▫ PSW 32 bit (tanti bit quanti sono quelli delle parole di memoria), se 32 bit sono troppi alcuni non vengono utilizzati (se sono superflui) Ogni CPU ha un proprio linguaggio macchina, il quale serve per codificare le istruzioni macchina (che vanno nell'istruction register (IR)), dipende dal linguaggio adottato dal processore stesso Elementi di informatica e programmazione 1p Pagina 12 Ciclo macchina Il ciclo macchina è il ciclo che compie la CPU quando deve svolgere delle operazioni; è svolto dall'unità di controllo È costituito da 3 fasi: 1) FETCH: acquisisce una istruzione del programma ▫ Prendi l'istruzione corrente dalla memoria e mettila in IR ▫ Incrementa il PC affinché contenga l'indirizzo della prossima istruzione ▫ Questa fase prevede di trasferire dalla memoria centrale all'IR: 1- Impostare MAR al valore PC 2- L'unità di controllo attiva il segnale di lettura sul bus di controllo 3- PC incrementato di 2 unità (se le istruzioni sono codificate da 2 byte) 4- La memoria centrale capisce di essere coinvolta, percepisce l'indirizzo sul BUS indirizzi e presenta il dato sul BUS dati 5- L'istruzione finisce in MDR 6- L'unità di controllo attiva i comandi necessari per spostare l'istanza da MDR a IR 2) DECODE: decodifica le istruzioni (codificate dal linguaggio macchina)→si interpreta l'istruzione da eseguire ▫ Le istruzioni possono essere di 3 tipologie: ○ Elaborazione (aritmetico-logiche) ○ I/O (trasferimento da e verso la CPU) ○ Scelta semplice 3) EXECUTE: manda comandi alla ALU (per la selezione dell'operazione), ai registri della CPU (per la lettura/scrittura), al bus per accedere alla memoria ecc. ▫ Se l'istruzione usa una parola in memoria, determina dove si trova e carica la memoria nei registri della CPU Torna al punto 1 e inizia a eseguire l'istruzione successiva Le istruzioni sono organizzate in campi: - Codice operativo tipologia di istruzione da eseguire e come interpretare i bit successivi - Operandi sorgente e destinazione dato o indirizzi dove recuperare/depositare i dati (nei registri o in memoria) ○ Esistono 3 tipologie di operandi: ▪ Immediato: contiene il valore del dato ▪ A registro: contiene un riferimento ad un registro della CPU, il dato non sta all'interno dell'istruzione ▪ A memoria: contiene l'indirizzo della parole di memoria dove c'è il dato, il dato è nella memoria centrale Es: istruzioni da decodificare 1- IR parola di memoria con indirizzo nel PC, (PCPC+2) 2- Codifico i registri attraverso il numero corrispondente a 3- Manda all'unità di controllo il comando somma tramite operazione; devo spostare da a RA,RB (RA /RB ) L'unità di controllo manda segnale di esegui L'unità di controllo attiva i comandi per portare in il valore di RC Istruzioni diverse comporta n° di passi diversi / operazioni diverse e tempi diversi Elementi di informatica e programmazione 1p Pagina 13 Indirizzamento in memoria Nell'IR ci sono numerosi campi: uno per il codice operativo e altri per i dati; un indirizzo non può essere memorizzato interamente in un solo campo e di conseguenza son stati trovati degli escamotage (indirizzamento) Gli indirizzamenti possono essere di 4 tipologie: 1) Diretto - A pagina zero si riferiscono alle parole della pagina n° zero - A pagina corrente si riferiscono alle parole della pagina indicata dal PC (12 bit più significativi presenti nel PC) Nell'ipotesi di avere un indirizzamento di 5 bit, possiamo supporre che 2 bit (i più significativi) indichino il n° di pagina e i restanti 3 (meno significativi) indichino lo scostamento di pagina Esempio: 00 000 (pagina n°0, parola 0, vale a dire la 1° parola della pagina) 00 111 (pagina n°0, parola 7) 2) Indiretto (non trovo nell'IR direttamente un riferimento alla parola di memoria in cui guardare ma trovo nell'IR un riferimento a un qualcos'altro contenente l'indirizzo del dato che sto cercando, doppio passaggio) - Rispetto ai registri → c'è un riferimento al registro (n° registro) contenente l'indirizzo della memoria dove è presente il dato (in memoria) - Rispetto alla memoria → la memoria è coinvolta 2 volte; come quello diretto può essere a pagina zero o a pagina corrente (nel campo dello scostamento poniamo lo scostamento della parola nella pagina zero dove stavolta non trovo il dato ma trovo l'indirizzo dove è memorizzato il dato in memoria) 3) Relativo - Rispetto al PC → all'interno del campo di scostamento, vi è uno scostamento che una volta sommato all'indirizzo presente nel PC mi permette di ricavare dove si trova il dato in memoria - Rispetto a un registro → all'interno del campo di scostamento, vi è uno scostamento che una volta sommato al dato presente in un registro mi permette di trovare l'indirizzo di memoria nel quale è presente il dato che sto cercando (certe CPU utilizzano un registro a DOC per questo scopo (registro indice)) 4) Relativo con auto incremento o auto decremento → simile al registro precedente, differiscono per la presenza di un incremento o di un decremento del valore del registro indice; dopo aver reperito il dato dalla memoria tramite l'indirizzo presente nel registro indice si incrementa/decrementa il valore del registro indice di quante unità quante sono quelle dedicate per memorizzare le parole di memoria (byte dedicati alle parole di memoria) [Indirizzamento utile quando i dati in memoria sono memorizzati attraverso parole consecutive] Esempio di indirizzamento indiretto rispetto ai registri "Caricare nel registro R4 il dato presente nel registro R2" 1) FETCH PCPC+2 2) DECODE 3) ESECUZIONE: - MAR (l'unità di controllo attiva i componenti coinvolti per effettuare il trasferimento) - l'unità di controllo attiva la linea "leggi", la memoria centrale viene coinvolta e pone sul BUS dati il dato presente sulla memoria - - L'interpretazione avviene tramite hardware (flip-flop) presenti nell'unità di controllo Elementi di informatica e programmazione 1p Pagina 14 Linguaggio assembly - Rappresentazione simbolica del linguaggio macchina (binario), costituita da nomi simbolici o identificatori - Esempio: Somma ADD 0000 Caricamento LOAD 1001 Salta se uguale BEQ 1011 - L'assembly è più leggibile: - Permette di associare dei nomi simbolici alle configurazioni di bit che indicano codici di operazioni o indirizzi di registri - Permette l'utilizzo di variabili cioè nomi simbolici per identificare certe parole di memoria che contengono dati - Permette l'utilizzo di etichette cioè nomi simbolici per identificare certe parole di memoria che contengono istruzioni Programma assemblatore: traduce da linguaggio assembly in linguaggio macchina Esiste una tabella codici in cui le associazioni tra codice operativo e sequenza di bit sono sempre uguali ed esiste una tabella simboli in cui le associazioni (variabili + indirizzi)/(etichette + indirizzi) variano da programma a programma L'associazione creata per le variabili sono indirizzi delle parole di memoria che hanno memorizzati i dati mentre quella creata per le etichette sono gli indirizzi delle parole di memoria che hanno istruzioni. Gli indirizzi sono poi usati per creare il programma in linguaggio macchina (questi sono indirizzi con cui il programma macchina funziona in una specifica posizione della memoria) L'associazione tra (variabili e indirizzi) e (etichette e parole di memoria) sono caricati come se il programma fosse caricato nella pagina 0 della memoria I programmi risiedono sul disco fisso nella memoria di massa. Quando il sistema operativo li avvia il caricamento avviene grande al programma detto loader (carica i programmi nella memoria centrale). Il caricatore corregge gli indirizzi con le pagine in cui il programma è effettivamente caricato. Il loader cambia i bit che indicano il numero della pagina, lasciando inalterato l scorrimento Elementi di informatica e programmazione 1p Pagina 15 Periodo di clock - Un orologio (clock) fornisce una scadenza temporale a cui tutte le attività elementari sono sincronizzate (serve per sincronizzare le esecuzioni) - Un segnale di clock è un livello di tensione che evolve con un periodo (tempo di ciclo) predeterminato e costante (intervallo di tempo tra 2 fronti di salita successivi) - La frequenza di clock è l'inverso del periodo (numero di cicli di clock al secondo) - Periodo di clock è il tempo che intercorre tra 2 fronti di salita - Il ciclo di clock è l'unità di tempo di base di un processore di computer; si misura in hertz (Hz), che è l'inverso della velocità di clock (ciclo di clock=frequenza/velocità di clock=periodo) Es. istruzione di somma: Fase di FETCH 6 passi 6 cicli di clock Fase di ESECUZIONE 6 passi 6 cicli di clock Totale per l'istruzione somma: 12 cicli di clock Istruzioni macchine diverse necessitano diversi cicli di clock (e in diverso numero) Se dovessi valutare quale tra 2 CPU (CPU1 e CPU2) è la più potente cosa dovrei prendere in considerazione? - Frequenza di clock (sì ma non basta da sola in quanto CPU diverse usano diversi linguaggi macchina) - MIPS (mega instruction per seconds), unità di misura che però ignora la frequenza del clock (da considerare ma da sola non basta) - Elapsed time (tempo trascorso), vale a dire il tempo trascorso tra l'inizio e la fine dell'esecuzione di un compito (sì ma da solo in basta perché non rientra solo il lavoro della CPU ma anche i tempi delle periferiche) - CPU time (metodo di confronto tra le CPU) ○ Tempo richiesto dalla CPU escludendo il tempo impiegato per prendere i dati dalle periferiche ○ Si calcola in questo modo: (cicli di clock per programma(dedicati all'esecuzione del programma)) * (periodo di clock) oppure (n° istruzioni macchina eseguite dal programma)* (CPI) ▪ CPI (clock per instruction, si ricava eseguendo dei programmi campione) ○ CPU time (più è basso più la CPU è veloce)= Esempio: Devo eseguire CPU1 3 istruzioni il programma sarà 1/3 più lungo rispetto a quello della CPU2 CPU2 possibilità di eseguire 2 istruzioni il programma sarà 1/3 più corto rispetto a quello della CPU1 (CPU2= 2/3 CPU1) La CPU1 avrà un minore CPI ma nonostante ciò il CPI della CPU2 non sarà mai maggiore di 1/3 rispetto a quello della CPU1 e quindi la CPU2 risulta essere migliore Logiche di progettazione della CPU Vi sono 2 diverse logiche di progettazione della CPU: - CISC (Complex Instruction Set Computer): basata sull'idea di realizzare a livello hardware funzionalità sempre più complesse, in modo che il processore sia in grado di eseguirle direttamente - RISC (Reduced Instruction Set Computer): basata sull'idea di avere poche istruzioni che i compilatori riescono a tradurre efficacemente in linguaggio macchina Elementi di informatica e programmazione 1p Pagina 16 CISC ○ Istruzioni macchina complesse possono richiedere anche un elevato numero di cicli di clock per essere eseguite ma dovrebbero consentire di ridurre il numero di istruzioni richieste per il completamento dell'esecuzione di un programma ○ La dimensione del programma eseguibile , e con essa il numero delle istruzioni da cui è costituito, dipende dall'abilità del compilatore che viene utilizzato per tradurre in linguaggio macchina il codice scritto in un linguaggio di programmazione di alto livello RISC ○ Inventato nel corso degli anni Ottanta del secolo scorso dall'incapacità dei migliori calcolatori di sfruttare al meglio un insieme di istruzioni complesse e ne utilizzavano un sottoinsieme ridotto ○ Basata sull'idea di rendere molto semplici le istruzioni riconosciute dalla CPU, e di inserire di tali istruzioni solo quelle che i compilatori riescono ad utilizzare facilmente ○ Si creano CPU capaci di eseguire le istruzioni a velocità molto elevate, riducendo sensibilmente il loro periodo di clock ○ Nel progettare una CPU RISC si cerca di ridurre la complessità dell'insieme delle istruzioni per ottenere un basso valore di CPI e un'elevata frequenza di clock, compensando in questo modo il grande numero di istruzioni necessarie per completare il processo Tipo di CPU CISC RISC Cicli di clock per istruzione (CPI) Alto Basso Numero di istruzioni per un processo Basso Alto Frequenza di clock Media (o meglio Alta) Alta (o meglio altissima) Esistono anche architetture miste (dette CRISC), il cui obiettivo è quello di bilanciare la complessità dell'insieme delle istruzioni con la velocità di esecuzione, garantendo in ogni caso la completa compatibilità con le versioni precedenti dal punto di vista delle istruzioni eseguibili La ricerca nei settori dei compilatori ha consentito poi di migliorare l'utilizzo delle istruzioni più complesse e di sfruttare sempre più le unità funzionali complesse inserite nelle CPU CISC In modo complementare, negli ultimi anni le CPU RISC hanno avuto una notevole diffusione, grazie alla famiglia di processori basati sull'architettura ARM, che equipaggiano smartphone, tablet e dispositivi embedded di diverso genere Memoria Caratteristiche: - Velocità inteso come velocità di trasferimento (megabyte al secondo/larghezza di banda), tempo di accesso (tempo tra richiesta e completamento dell'azione) e ciclo di memoria (tempo di accesso + intervallo di tempo che deve trascorrere prima che possa iniziare un successivo accesso di memoria) - Volatilità: se la memoria perde o meno i dati a computer spento ○ Volatile= perde i dati in seguito allo spegnimento del computer ○ Non voltatile= mantiene i dati anche a computer spento - Capacità (quanta memoria disponibile abbiamo) - Costo - Supporto alla CPU: deve fornire alla CPU dati e istruzioni il più rapidamente possibile - Archivio dati e programmi: ne garantisce la conservazione a calcolatore spento e la reperibilità anche dopo elevati periodi - Diverse esigenze (contrastanti): velocità e non volatilità - Obiettivo: avere una memoria grande e veloce (ed economica) - Compromesso: integrare una memoria piccola e veloce con altri dispositivi grandi e lenti In base a queste caratteristiche possiamo dire che una soluzione per ottenere le migliori prestazioni è implementare memorie di diverso tipo e con diverso scopo; per esempio la caratteristica principale della memoria centrale è la velocità mentre quella della memoria di massa è la grande capacità e la non volatilità Elementi di informatica e programmazione 1p Pagina 17 Tecnologie costruttive della memoria Tecnologia Velocità Capacit Volatilit Costo per à à bit Elettroniche ALTA MEDIA SI ALTO Memoria centrale (velocità) Es. RAM (riferimento ai BUS) e Cache (non fa riferimento ai BUS) Elettroniche MEDIA MEDIA NO MEDIO- Memoria di massa (capaci e non volatili) ALTO Es. SSD (status solid disk/dischi a stato solido) Magnetiche BASSA ALTA NO MEDIO Memoria di massa (capaci e non volatili) Es. disco fisso (hard disk) Ottiche BASSA MEDIA NO BASSO Memoria di massa (più adatta alla distribuzione) Es. CDROM, DVD Classificazione della memoria in base all'accesso 1. Accesso sequenziale: - le celle (dette record) sono posizionate in successione e l'accesso a un dato richiede la lettura di tutti quelli che lo precedono - In alcuni casi l'indirizzo di ogni cella viene memorizzato prima del record, come separazione tra un record e il successivo - L'accesso sequenziale in genere viene realizzato mediante un dispositivo meccanico (testina di lettura/scrittura) che si muove sequenzialmente da un record al successivo, controllando a ogni spostamento se l'indirizzo corrisponde a quello cercato - Questo metodo di accesso è, per esempio, usato per accedere a dati memorizzati su nastri magnetici - Il tempo di accesso è molto variabile e dipende dalla distanza tra la posizione attuale del sistema di lettura/scrittura e la posizione della cella cercata 2. Accesso casuale (memorie elettroniche): - l'accesso a una cella non richiede la lettura delle precedenti poiché la tecnologia costruttiva consente di selezionare ogni cella di memoria indipendentemente dalle altre, e il tempo di accesso è per tanto indipendente dalla posizione ed è costante in tutte le celle - Il termine RAM (random access memory), impiegato per indicare la memoria ad accesso casuale, è ormai considerato come sinonimo di memoria centrale 3. Accesso misto (tra sequenziale e casuale/solitamente per disco magnetico/hard disk): - l'indirizzo di una cella di memoria non consente di determinare con precisone la collocazione fisica sul dispositivo di memorizzazione - l'accesso al dato viene quindi portato a termine compiendo diversi accessi per giungere in prossimità del dato e infine effettuando una ricerca sequenziale per arrivare alla cella cercata - Il tempo di accesso è molto variabile e dipende dalla posizione fisica della cella rispetto alla posizione dal sistema di lettura/scrittura all'inizio della lettura - Le unità a dischi sono caratterizzate da un metodo di accesso misto 4. Accesso associativo: - Metodo ad accesso casuale che permette di effettuare un confronto tra alcuni bit in posizioni specifiche all'interno di una parola di memoria per verificarne l'uguaglianza con una parola di riferimento, eseguendo tale operazione simultaneamente su più parole Elementi di informatica e programmazione 1p Pagina 18 - La parola viene selezionata in base a una parte del suo contenuto (invece che dal suo indirizzo) - Come nel caso delle memorie ad accesso casuale, il tempo di accesso è costante per tutte le celle - Le tecnologie elettroniche impiegate per realizzare metodi di accesso associativi sono piuttosto raffinate e costose, ma consentono velocità di lettura assai elevate - Tempo di accesso costante - Le memorie cache utilizzano in genere questo metodo In passato sono state adottate tecnologie assai diversificate per la realizzazione delle memorie; le soluzioni più impiegate attualmente fanno uso di semiconduttori in silicio con tecnologie a larghissima scala di integrazione per la memoria centrale (VLSI) e di tecnologie magnetiche (dischi e nastri), ottiche (compact disc) o allo stato solido (SSD) per le memorie di massa La memoria centrale, realizzata mediante circuiti di semiconduttori ad accesso casuale (RAM), è di tipo volatile ma esiste comunque una memoria a semiconduttori di tipo non volatile, che viene scritta nel momento della sua produzione e che non può essere cancellata → tale memoria, di sola lettura, è chiamata ROM (read only memory) ed è utilizzata per contenere le informazioni di inizializzazione del calcolatore, che vengono usate a ogni accensione, o altre funzioni che devono essere permanentemente utilizzabili (es. sistema di diagnosi del corretto funzionamento delle varie unità) Memorie flash ▪ A partire dalla ROM, negli anni 80 sono state sviluppate delle memorie elettroniche riscrivibili non volatili, le cosiddette memorie flash (flash-drive=USB). Il loro costo era inizialmente elevato ma si è progressivamente ridotto, il che ha favorito la loro diffusione (es. nei tablet o nei riproduttori MP3). ▪ Le memorie flash costituiscono una tipologia di dispositivi di memoria che possono essere usati sia come memoria di massa relativamente piccola ma molto veloce, sia come memoria centrale relativamente lenta ma nonostante ciò adatta per limitate esigenze di prestazioni (es. Chromebook) ▪ Rispetto alle memorie elettroniche tradizionali, quelle flash hanno il vantaggio di combinare la riscrivibilità con la non volatilità, ma sono caratterizzate da tempi di accesso, soprattutto di scrittura, molto più lenti ▪ La lettura delle memorie flash richiede un tempo che varia tra circa 100 ns per gli accessi sequenziali e qualche microsecondo per gli accesi casuali Gerarchia tra le memorie 1) Memoria interna: registri, memoria cache, memoria centrale (RAM)→ memoria interna (vi sono tante interazioni tra questo tipo di memorie e la CPU) Caratteristiche: capacità inferiore, tempo di accesso minore, frequenza di accesso maggiore 2) Dischi magnetici: hard disk, CD, DVD→ memoria esterna online Caratteristiche: capacità medie, tempo di accesso medio, frequenza di accesso medio 3) Dischi ottici: CD-ROM, CD-RW, DVD, nastri→ memoria offline Caratteristiche: capacità elevate, tempo di accesso alto, frequenza di accesso minore (esterne) Collocazione fisica delle memorie all'interno del calcolatore (1=registri/2=cache I liv./3=cache II liv./chip=circuito integrato) Elementi di informatica e programmazione 1p Pagina 19 Caratteristiche dei livelli di gerarchia di memoria Capacità Tempo di accesso Velocità di trasferimento Registri 1 KB 1 ns - (ordine del ciclo di clock) Cache 1-10 MB 10 ns 100 GB/s RAM 1-10 GB 100 ns 10 GB/s (uso necessario dei BUS) SSD 100-1000 GB 100 (microsecondi) < 1 GB/s HD 100-1000 GB 10 ms 0.1 GB/s Nastri, CD GB per unità 100 ms 0.01 GB/s (senza un vero limite di capienza) Legenda: Memorie centrali obiettivo: velocità (memorie volatili) Memoria di massa obiettivo: capienza (memorie non volatili) - La memoria cache è meno capiente della RAM (mille volte più piccola) - Quando si cerca un dato, prima si verifica se il blocco in cui esso è contenuto si trova nella cache, e in questo caso la ricerca si conclude in breve tempo; in caso contrario si deve accedere alla RAM e quindi si deve attendere un tempo maggiore - Se supponiamo che la capacità della cache sia di 1 unità e la capacità della RAM 1000 unità con un tempo di accesso 10 volte superiore a quello della cache; se non si adotta nessun accorgimento per la disposizione dei dati allora avremo che su 1000 richieste, solo 1 troverà il dato nella cache e le altre 999 dovranno accedere anche alla RAM Il tempo medio di accesso al sistema di memoria può essere calcolato in questo modo: Il quale è maggiore dei 100 ns della RAM - Questa organizzazione è conveniente solo se esiste un criterio efficiente per scegliere quali blocchi della RAM devono essere trasferiti nel livello superiore, in modo che la maggior parte degli accessi della memoria si risolva in una ricerca limitata a tale livello - Occorre dunque prevedere con una certa precisione il comportamento dei programmi eseguiti dal calcolatore, in modo da trasferire nella cache quei blocchi richiesti con maggior frequenza - Il comportamento medio dei programmi è prevedibile: statisticamente un programma indirizza più del 90% delle sue richieste di lettura/scrittura a un'area di memoria di dimensioni inferiori al 10% dell'area complessiva occupata dal programma e dai suoi dati - Questo è il fondamento del "principio di località", nello specifico: ○ Località spaziale: quando un programma fa riferimento a un elemento (istruzione o dato), è molto probabile che quello stesso programma faccia riferimento entro breve tempo ad altri elementi il cui indirizzo è vicino a quello dell'elemento riferito ○ Località temporale: quando un programma fa riferimento a un elemento, è molto probabile che quello stesso programma faccia riferimento entro breve tempo allo stesso elemento - Il principio di località afferma che le informazioni usate più recentemente e quelle in posizioni contigue verranno molto probabilmente utilizzate nel prossimo futuro: è evidente che favorendo l'accesso a tali informazioni si migliorano le prestazioni complessive del sistema - Per questo, quando la CPU richiede un'istruzione oppure un dato che non si trova nella cache, questa informazione viene prelevata dalla RAM e trasferita nella cache insieme alle celle adiacenti, che si trovano nello stesso blocco della cella di memoria richiesta Elementi di informatica e programmazione 1p Pagina 20 - Nel caso la cache sia già piena, il nuovo blocco ne sostituisce uno vecchio, rimuovendo in genere il blocco che contiene i dati non utilizzati da più tempo, secondo una politica di sostituzione che prende il nome di LRU (least recently used) - Gestita in questo modo, la combinazione di una cache con una RAM consente di ottenere un sistema di memoria che unisce le caratteristiche migliori delle due memorie: la grande capacità e i bassi costi della RAM e l'alta velocità della cache - Si prenda ancora in esame l'esempio precedente, in cui però, grazie al principio di località, la distribuzione degli accessi tra la cache e la RAM non è più proporzionale alla loro dimensione relativa - In casi reali, la struttura dei programmi eseguiti da un calcolatore è tale da consentire frequenze di successo superiori al 90%: adottando questo valore come riferimento (dunque nel 90% dei casi l'accesso riguarda la cache mentre nel rimanente 10% delle richieste è necessario aspettare la risposta della RAM), il tempo medio di accesso è calcolabile in questo modo: con un miglioramento che questa volta arriva al 91% rispetto alle 10 unità per tempo necessarie per accedere alla RAM - La tecnica presentata per due soli livelli può essere applicata a un numero maggiore di livelli, dove il primo livello corrisponde alla memoria più veloce, più piccola e più costosa, mentre ai livelli sottostanti si trovano memorie sempre più grandi ma anche sempre più lente Memoria cache (informazioni aggiuntive e esempi) - Divisa in blocchi (gruppi di parole consecutive), ognuno con una propria etichetta associata - Prendiamo come esempio dei blocchi da 16 bit (16 parole) Per distinguere una parola tra 16, ho bisogno di 4 bit (log in base 2 di 16), ragione per cui gli indirizzi possono essere distinti in 2 parti (12 bit che indicano l'etichetta e 4 bit che indicano la posizione della parola all'interno del blocco) (etichetta costituita da tutti 0 e uno scostamento definito da 4 zeri-> in esadecimale lo posso scrivere come 0x (0x=base 16) 000, i primi 3 zeri indicano l'etichetta e l'ultimo lo scostamento; ciascuna di queste cifre in base 16 riassume un blocco di 4 bit) - I dati in cache vengono caricati in base agli indirizzi della memoria centrale (es. in un blocco posso andare a caricare le prime 16 parole della memoria centrale e l'etichetta sarà formata da 3 zeri in base 16 e le 16 parole nei 4 bit rimanenti/su un blocco intermedio possono esserci anche le parole iniziali) - L'accesso avviene in base agli indirizzi della memoria RAM→ la circuiteria all'interno della cache è tale per cui è possibile effettuare tanti confronti contemporaneamente e vengono effettuati dei confronti tra i 12 bit dell'indirizzo della RAM e le varie etichette - Potrebbe succedere che tutti questi confronti diano esito negativo (il dato non è presente nella cache); potrebbe anche succede che un confronto (e in questo caso sarà l'unico) dia esito positivo e che quindi il dato sia nella cache - Se un esito è positivo, l'accesso a questo blocchetto avviene con una circuiteria a multiplex simile a quella della RAM (tempo di accesso alla parola di tipo random access / tempo di accesso costante) - Sulla base dei 4 bit riesco ad ottenere in un colpo solo lo scostamento della parola che sto cercando all'interno del blocco Elementi di informatica e programmazione 1p Pagina 21 - Per com'è effettuata la circuiteria, tutti i confronti avvengono in un unico ciclo di clock (essenzialmente in un colpo solo) e in un secondo ciclo di clock viene trovata la parola all'interno del blocco (per questo motivo tempo di accesso costante, non dipende dalla posizione della parola che sto cercando all'interno della cache) - Quando viene effettuato un caricamento dalla RAM alla cache non mi limito a caricare la parola di memoria cercata ma anche quelle ad essa adiacenti I dispositivi per le memorie di massa Le caratteristiche fondamentali che si richiedono a una memoria di massa sono la non volatilità e la grande capacità. Le principali tecnologie utilizzate per soddisfare queste richieste sono quella magnetica e quella ottica, con un recente aumento di diffusione dell'uso delle memorie flash. Dischi e nastri magnetici - I dispositivi di memorizzazione magnetici sono costituiti da un sottile strato di materiale magnetico il cui stato di magnetizzazione consente di memorizzare i dati - Le operazioni di lettura e scrittura sono effettuate tramite una testina che viene posizionata in prossimità della faccia magnetizzata e che può rilevare e modificare lo stato di magnetizzazione della superficie sottostante - I primi dispositivi di memoria di massa impiegati furono i nastri magnetici, che presentano notevoli analogie con i nastri impiegati nelle audio e videocassette (come loro, i nastri magnetici sono poi spariti dal mercato); la peculiarità è che le informazioni vengono registrate in formato digitale associando inoltre a ogni byte un bit di parità per verificare la correttezza della registrazione - Le informazioni vengono scritte e lette a blocchi, chiamati record fisici, separati tra loro da spazi appositi (inter-record gap) - L'accesso alle informazioni memorizzate su un nastro è sequenziale: se la testina dell'unità nastro è posizionata all'inizio del record 1, per leggere il record N occorre avvolgere il nastro, leggendo, uno per volta, anche tutti i record posizionati tra il record 2 e il record N-1 - Se la testina si trova oltre il record N, è necessario riavvolgere parzialmente il nastro, per poi iniziare la ricerca in avanti - I nastri sono in movimento solo durante le operazioni di lettura/scrittura - I tempi di accesso sono molto lenti e le operazioni di ricerca, lettura e scrittura possono richiedere anche alcuni minuti; si tratta però del metodo di memorizzazione a costo minore nella gerarchia di memoria - Nei dischi magnetici in generale, il materiale magnetico viene steso su entrambe le facce di un supporto di forma circolare; le informazioni sono memorizzate sul disco in cerchi concentrici, chiamati tracce (quantità di informazioni costanti), tutti della stessa lunghezza, corrispondente alla dimensione della testina, e tutti contenenti lo stesso numero di bit: la densità di memorizzazione, cioè il numero di bit per unità di superficie, cresce quindi andando dalla periferia verso il centro del disco Elementi di informatica e programmazione 1p Pagina 22 - L'insieme delle tracce è suddiviso in settori e ogni settore ospita un blocco di dati (record, ogni file contiene almeno 1 record), che rappresenta in genere l'unità minima di trasferimento tra disco e RAM - Sia tracce adiacenti sia settori successivi sono separati da gap, ossia parti vuote, che servono a evitare errori nella lettura o nella scrittura dei dati provocati da un posizionamento poco preciso della testina (le testine sono imperniate nello stesso braccio) - Per poter utilizzare un disco, la sua superficie deve essere organizzata in tracce e settori con un'operazione detta formattazione, che consente di identificare la posizione di ogni settore all'interno di ogni traccia mediante un insieme di dati di controllo memorizzati sul disco - Durante il suo funzionamento, il disco ruota a velocità costante→ per leggere o scrivere occorre posizionare la testina sulla traccia desiderata e all'inizio del settore - Il tempo necessario per posizionare la testina sulla traccia richiesta è chiamato tempo di ricerca (seek time) e varia da pochi millisecondi a qualche decina di millisecondi a seconda della distanza della testina dalla traccia di destinazione - Quando la traccia è raggiunta, il sistema attende che la rotazione del disco faccia posizionare il settore cercato sotto la testina (tempo di rotazione o latency time, misurato in RPM (revolution per minute) e varia tra i 5400 RMP (5400 giri in un minuto con tempo di accesso 5,4 ms) oppure 10 800 RMP (con un tempo di accesso di 2,7 ms)), quindi attiva l'operazione - Il tempo totale di accesso è dato da: seek time+ latency time - Per eseguire un trasferimento occorre dunque specificare all'interfaccia di ingresso/uscita del disco, traccia, settore e numero di parole da trasferire, l'indirizzo della memoria centrale da dove proviene o dove deve essere memorizzata l'informazione e il tipo di operazione (se lettura/scrittura) - Un tipico hard disk è alloggiato all'interno di un disk drive dove si trovano più dischi sovrapposti a distanza di pochi millimetri l'uno dall'altro, le testine di lettura/scrittura, un motore per far ruotare i dischi e tutti gli elementi elettronici necessari per il controllo e l'esecuzione delle operazioni di lettura e scrittura - I dispositivi più recenti sono dotati di una memoria elettronica dedicata alla memorizzazione dei dati del disco usati più di frequente, sono equipaggiati con interfacce veloci di ingresso/uscita di tipo Serial ATA o SCSI (Small computer standard interface) e hanno velocità di rotazione che arriva a oltre 10 000 giri al minuto - Questi tipi di sistemi possono raggiungere velocità di trasferimento di oltre 6 GB/s con temi medi di accesso di qualche millisecondo e capacità fino a qualche terabyte - I floppy disk si erano diffusi con l'avvento del PC e hanno rappresentato per anni uno strumento standard e molto diffuso per il trasferimento dei dati e programmi; funzionano secondo lo stesso principio dei dischi fissi, con la differenza che ogni unità contiene un solo disco, inserito in una confezione rigida (in origine essa era flessibile, da qui il nome floppy) che protegge la superficie magnetica quando il disco viene estratto dall'unità di lettura/scrittura Elementi di informatica e programmazione 1p Pagina 23 - Al contrario degli hard disk, che in genere sono sempre in rotazione, i floppy disk rimangono fermi, in modo da consentirne l'estrazione durante i periodi di inattività, e vengono messi in rotazione solo quando giunge una richiesta di accesso, cosa che provoca un ritardo iniziale dovuto al tempo necessario per raggiungere la velocità di regime (i floppy disk sono stati sostituiti dalle memorie flash) Dischi ottici - Accanto ai dischi magnetici sono stati ampiamente diffusi anche i dischi ottici: CD (compact disc), DVD (digital versatile disc), con capacità che va da poco più di 600 MB per i CD fino a circa 17 GB nei DVD a doppio strato (dual layer) e doppia faccia - Grazie alla loro elevata capacità, i dischi ottici sono stati utilizzati per memorizzare grandi quantità di dati: a cavallo fra il XX e il XXI secolo, sono stati in commercio dischi contenenti le raccolte delle diverse legislazioni, enciclopedie, testi di medicina, manuali e sistemi operativi o di programmi complessi, corsi multimediale ecc. - I DVD sono ancora un supporto comune (seppur obsoleto e sempre meno popolare) per la distribuzione di contenuti audiovisivi come film - CD e DVD condividono le dimensioni fisiche del supporto, che per entrambi è un disco di 12 cm di diametro e dello spessore di poco superiore a 1 mm - I dati vengono memorizzati intervenendo su zone microscopiche (pit/land) di materiale riflettente annegato in un supporto plastico trasparente circolare - La lettura avviene utilizzando un raggio laser che esplora la superficie e identifica il valore dei bit in base alla riflessione del fascio luminoso - Al fine di privilegiare la capacità rispetto alla velocità di accesso, i dati non sono organizzati in tracce e settori come nei dischi magnetici, ma secondo un unico percorso a spirale che dal centro del disco arriva fino alla periferia - Nonostante l'accesso di tipo sequenziale, le attuali tecnologie ottiche e la presenza di una memoria elettronica interna al lettore consentono di raggiungere velocità di trasferimento dell'ordine di qualche decina di MB/s - Rispetto ai CD, i DVD sono caratterizzati dalla possibilità di memorizzare i dati con una maggiore risoluzione, cioè con pit e land di dimensioni minori e con una spirale più stretta: questo consente di aumentare la capacità di uno strato fino ai 4.7 GB - Sfruttando in maniera opportuna materiali semi-trasparenti, è possibile scrivere i dati su due strati: il primo strato è realizzato in modo da risultare trasparente al raggio laser che viene utilizzato per leggere il secondo strato, sottostante→ in questo modo la capacità complessiva di una faccia di un DVD arriva fino a 8,5 GB (il secondo strato ha una capacità di 3.8 GB, rispetto ai 4.7 GB del primo strato) - Se si usano entrambe le facce del disco si possono raggiungere 17 GB - A differenza dei dischi magnetici, i dischi ottici possono essere prodotti in serie stampando direttamente su di essi dei dati, cosa che ne riduce sensibilmente i costi di produzione, a patto che il numero delle copie sia sufficientemente elevato - Per evitare che eventuali piccole imperfezioni di stampa possano pregiudicare la disponibilità dei dati archiviati sui dischi ottici, è necessario utilizzare un codice che sia in grado di correggere automaticamente gli errori provocati da questi difetti Elementi di informatica e programmazione 1p Pagina 24 - I dischi stampati in questo modo non possono essere più modificati (scritti) e per questo motivo vengono denotati come CD-ROM e DVD-ROM (infatti ROM è l'acronimo di Read only memory, cioè di sola lettura) - Esistono anche dischi ottici scrivibili (CD-R, DVD-R, DVD+R) che sono posti in commercio senza alcun contenuto e in cui pit e land possono essere ottenuti "bruciando" delle parti del supporto tramite un laser (quello del dispositivo masterizzatore) di potenza superiore a quello normalmente utilizzato per la lettura - Il grado di riflettività delle zone bruciate sarà diverso da quello delle zone che invece non sono state toccate, perciò il laser di lettura sarà in grado di distinguere gli 0 dagli 1 - Dischi di questo tipo sono anche detti WORM (Write once read many) per enfatizzare il fatto che le informazioni che vi vengono scritte non possono essere più modificate (write once) ma possono essere molte volte (read many) - Mentre per i CD esiste un solo standard di registrazione delle informazioni, per i DVD sono diffusi due standard, indicati appunto come DVD+R e DVD-R - I dispositivi di lettura leggono entrambi i tipi di DVD ma si possono trovare masterizzatori capaci di operare solo su supporti di uno dei due tipi, in genere allo scopo di raggiungere una maggiore velocità di scrittura dei dati - I dischi ottici di questo tipo sono stati adottati per il salvataggio di dati importanti, che si dovevano mantenere disponibili per lunghi periodi di tempo (il tempo di decadimento dei dischi ottici, se conservati in maniera adeguata, è stimato in secoli, mentre quello dei supporti magnetici è di qualche anno o al massimo qualche decennio) - Un'ulteriore, categoria di dischi è costituita dai dischi ottici riscrivibili (CD-RW, DVD-RW, DVD+RW, DVD-RAM) in cui le informazioni registrate sul supporto possono anche essere cancellate e riscritte, grazie al fatto che la "bruciatura" non è definitiva, ma altera soltanto le caratteristiche di riflettività del materiale - Sottoponendo il disco a un opportuno ciclo di riscaldamento/raffreddamento, esso può tornare allo stato originario - Tali dischi stanno diventando sempre più diffusi come strumenti a basso costo per la registrazione di informazioni di utilizzo limitato nel tempo - Esistono però delle applicazioni che richiedono la memorizzazione e l'elaborazione di una quantità di dati superiore a quella che viene immagazzinata anche in un DVD a doppio strato, per esempio la registrazione digitale di video ad alta risoluzione, che negli standard più evoluti (8 K a 8192 x 4320 pixel) può richiedere più di 600 MB per ogni minuto di registrazione, cioè più di 60 GB per un film di un paio d'ore - Per soddisfare queste esigenze sono stati introdotti sistemi più evoluti come il blu-ray, che possono superare i 20 GB per ogni strato di disco La gestione delle periferiche - La presenza di un'ampia varietà di dispositivi periferici in un sistema di elaborazione solleva molteplici problemi; innanzitutto, la diversa natura dei dispositivi richiede di adattarne le caratteristiche fisiche e logiche a quelle del calcolatore, per permetterne la connessione attraverso il bus - È inoltre necessario un meccanismo per identificare i singoli dispositivi, al fine di indirizzare correttamente la comunicazione fra il sottosistema unità centrale-memoria e la particolare periferica considerata - Infine le velocità di lavoro dei singoli dispositivi possono essere molto diverse fra loro; se ad esempio il flusso dei dati prodotto da una tastiera è tipicamente intermittente e fortemente limitato dalla capacità umana di digitazione, che arriva a poche decine di byte al minuto al più, un disco fisso è in grado di fornire un flusso relativamente costante di decine di Mbyte al secondo - → vi è la necessità di sincronizzare l'attività del sottosistema unità centrale-memoria con quella dei dispositivi periferici Elementi di informatica e programmazione 1p Pagina 25 L'interfaccia di ingresso/uscita - Una delle funzioni principali di un calcolatore è la comunicazione con l'ambiente esterno, in particolar modo con gli utenti, attraverso dei dispositivi di ingresso/uscita quali la tastiera, il video, le stampanti ecc. (periferiche) - In generale, ogni periferica viene controllata tramite un'opportuna interfaccia, che ha il compito di tradurre i segnali interni al calcolatore in un formato appropriato per la periferica stessa - Queste interfacce sono realizzate tramite schede che vengono inserite nel calcolatore e sono connesse direttamente al bus mediante opportuni connettori, mentre il collegamento con le periferiche avviene attraverso porte di ingresso/uscita predisposte sulla scheda stessa e accessibili dall'esterno - All'interno di un personal computer, insieme alla scheda madre su cui sono inseriti i chip della CPU e della memoria, alcuni chip di supporto, i collegamenti del bus e i connettori per le interfacce di ingresso/uscita, sono sempre presenti (eventualmente integrate nella scheda madre) le interfacce per il collegamento al video, alla tastiera, al mouse e alla stampante - La trasmissione di dati tra interfaccia di ingresso/uscita e periferica può avvenire secondo 2 modalità 1. Seriale, in cui un byte viene trasmesso un bit per volta (come nel caso del mouse) 2. Parallela, in cui tutti i bit del byte vengono trasmessi contemporaneamente (come nelle prime interfacce di collegamento delle stampanti) - Ogni dispositivo di ingresso/uscita, che stabilisce un'interfaccia tra bus e periferica, è dotato di due registri: ○ Registro dati: collegato ai bus dati, è destinato a memorizzare un dato ricevuto dal dispositivo (nel caso di un dispositivo di ingresso) o a ricevere un dato da trasferire al dispositivo (nel caso di un dispositivo di uscita) ○ Registro di controllo (o di stato): contiene informazioni di vario tipo sullo stato del dispositivo periferico, riguarda ad esempio la disponibilità al trasferimento di un dato o eventuali condizioni di errori - L'accesso da parte dell'unità centrale ad un particolare dispositivo periferico avviene in modo simile all'accesso in memoria centrale - In particolare un'operazione di lettura o scrittura avviene secondo i seguenti passi: ○ Lettura di un dato da un dispositivo di ingresso ▪ Il circuito di controllo trasferisce un dato acquisito dal dispositivo di ingresso nel registro dati ▪ L'unità centrale pone nel bus indirizzi, l'indirizzo del dispositivo cui vuole accedere; successivamente attiva il segnale di lettura nel bus comandi ▪ Il decodificatore indirizzi riconosce l'indirizzo ad esso associato ed attiva il circuito di controllo, che, ricevendo in ingresso il segnale di lettura dal bus comandi, pone nel bus dati il valore memorizzato nel registro dati ▪ Successivamente, l'unità centrale preleva il valore presente nel bus dati Elementi di informatica e programmazione 1p Pagina 26 ○ Scrittura di un dato su un dispositivo di uscita L'unità centrale pone nel bus indirizzi l'indirizzo del dispositivo cui vuole accedere e nel bus dati il dato da trasferire; successivamente, attiva il segnale di scrittura nel bus comandi Il decodificatore indirizzi riconosce l'indirizzo ad esso associato e attiva il circuito di controllo, che, ricevendo in ingresso il segnale di scrittura dal bus comandi, attiva la scrittura nel registro dati del valore presente nel bus dati Successivamente, il circuito di controllo avvia il trasferimento del dato ricevuto dal registro dati al dispositivo periferico Indirizzamento La presenza delle interfacce di ingresso-uscita consente di connettere al bus i dispositivi periferici e di riferirli individualmente Tuttavia, poiché al bus di sistema sono collegate sia le interfacce di ingresso-uscita dei dispositivi periferici sia la memoria centrale, è necessario poter riconoscere se un particolare indirizzo si riferisce alla memoria centrale oppure all'interfaccia di ingresso- uscita di un dispositivo periferico Se non fosse possibile distinguere i riferimenti alla memoria rispetto ai riferimenti alle interfacce di ingresso-uscita, potrebbe accadere che alla richiesta di accesso alla memoria da parte dell'unità centrale risponda l'interfaccia di un dispositivo che riconosca come proprio l'indirizzo posto nel bus: in tal caso, sia la memoria sia l'interfaccia potrebbero accedere contemporaneamente alle stesse linee del bus, producendo risultati errati o più in generale imprevedibili Per risolvere questo problema, esistono due tecniche alternative: 1) Ingresso-uscita mappato in memoria Questa modalità di indirizzamento consiste nell'attribuire alle interfacce di ingresso- uscita indirizzi diversi da quelli delle parole della memoria centrale La lettura o scrittura dei registri delle interfacce di ingresso-uscita avviene con le stesse modalità (e istruzioni) di lettura o scrittura in memoria centrale: l'indirizzo associato ad un dispositivo, che non corrisponde ad alcuna parola in memoria, viene ignorato da quest'ultima ma riconosciuto correttamente dal decodificatore degli indirizzi dell'interfaccia indirizzata 2) Ingresso-uscita isolato In questo caso le interfacce di ingresso-uscita possono avere indirizzi coincidenti con quelli di parola in memoria centrale; per le operazioni di lettura o scrittura dei loro registri sono quindi necessarie istruzioni speciali di ingresso-uscita, che sostanzialmente corrispondono alle ordinarie istruzioni di lettura o scrittura in memoria con l'effetto aggiuntivo di attivare opportuni segnali in una o più linee del bus comandi Tali segnali permettono di distinguere l'accesso ad un'interfaccia di ingresso-uscita rispetto all'accesso alla memoria centrale: a parità di indirizzo, nel primo caso si attiva il circuito di controllo dell'interfaccia, nel secondo caso si attiva la memoria centrale In ogni caso, l'accesso ai registri di un'interfaccia costituisce un metodo uniforme di trasferimento dell'informazione tra l'unità centrale ed un dispositivo periferico, indipendente dalle caratteristiche fisiche e logiche di quest'ultimo La capacità dei registri delle interfacce di memorizzare un dato prelevato da un dispositivo o in attesa di esservi trasferito permette un certo grado di indipendenza tra l'attività dei dispositivi periferici e quella dell'unità centrale Nel caso di un dispositivo di uscita, ad esempio, un dato può essere posto dall'unità centrale nel registro dei dati e, successivamente, trasferito dall'interfaccia al dispositivo nel momento opportuno e alla velocità appropriata, senza nessun altro intervento dell'unità centrale Elementi di informatica e programmazione 1p Pagina 27 Sincronizzazione ▪ Una volta assunto di poter trasferire informazioni da o verso i registri delle interfacce di ingresso- uscita, rimane da affrontare il problema della sincronizzazione con l'attività dei dispositivi periferici ▪ Si consideri il trasferimento di una serie di caratteri, da parte dell'unità centrale, dalla memoria centrale ad un terminale video ▪ La velocità di trasferimento dall'interfaccia al terminale video è enormemente inferiore rispetto alla velocità con cui l'unità centrale è in grado di prelevare un carattere dalla memoria centrale e di trasferirlo al registro dati dell'interfaccia ▪ D'altra parte, una volta che un carattere sia stato trasferito dall'unità centrale, è necessario che esso sia elaborato dall'interfaccia e visualizzato sul terminale prima che l'interfaccia stessa sia disponibile a ricevere un nuovo carattere ▪ Per consentire all'unità centrale di conoscere quando il terminale video è disponibile a ricevere un carattere, il registro di stato dell'interfaccia include un bit di sincronizzazione (chiamato S pronto) secondo le seguenti modalità: - Spronto viene posto a 0 dal circuito di controllo dell'interfaccia quando viene effettuata un'operazione di scrittura nel registro dati da parte dell'unità centrale - Spronto viene posto a 1 dopo che il terminale video ha completato la visualizzazione del carattere ricevuto e l'interfaccia è quindi disponibile a riceverne un altro ▪ Per una periferica d'ingresso, il bit di sincronizzazione segnala la presenza nel registro dei dati di un carattere introdotto dall'utente; Spronto assume quindi il valore 1 quando il registro dati contiene un carattere valido inserito da tastiera e viene aggiornato secondo le seguenti modalità: - Spronto viene posto a 0 dal circuito di controllo dell'interfaccia quando viene effettuata un'operazione di lettura dal registro dati da parte dell'unità centrale - Spronto viene riportato a 1 dopo che da tastiera è stato inserito un nuovo carattere ▪ Esistono 3 tecniche fondamentali per assicurare la sincronizzazione tra l'unità centrale ed un dispositivo periferico: 1- Gestione a controllo di programma Con questa tecnica la sincronizzazione viene effettuata controllando il bit S pronto prima di ogni operazione di lettura o scrittura: se il dispositivo periferico è pronto l'operazione può procedere, altrimenti l'unità centrale esegue un ciclo di attesa, con il quale controlla ripetutamente il bit Spronto in attesa che esso assuma il valore 1 CICLO: Leggi Spronto dall'interfaccia; Se Spronto=0 vai a CICLO; Scrivi il carattere nel registro dati Similmente, la lettura di un carattere dalla tastiera richiede che il programma di lettura rimanga in attesa della segnalazione della disponibilità di un nuovo carattere valido, prima di procedere, con la lettura del registro dati Nel caso della scrittura o della lettura di un'intera sequenza di dati, questo processo deve essere ovviamente ripetuto per ogni elemento della sequenza È facile comprendere come la gestione a controllo di programma comporti un utilizzo poco efficiente dell'unità centrale Considerando ad esempio il caso del terminale video o della tastiera, la velocità operativa del dispositivo è enormemente minore rispetto a quella dell'unità centrale, che spreca quindi gran parte del proprio tempo nel ciclo di attesa e risulta perciò sottoutilizzata 2- Gestione a interruzione ▫ Per superare il problema sopra evidenziato è possibile dotare le periferiche della capacità di segnalare all'unità centrale la disponibilità a trasferire un nuovo dato, in modo che questa possa impiegare in altre attività il tempo altrimenti sprecato nel ciclo di attesa Elementi di informatica e programmazione 1p Pagina 28 ▫ A questo scopo vengono utilizzate una o più linee del bus comandi mediante le quali l'interfaccia di ingresso-uscita può segnalare la propria disponibilità al trasferimento ▫ Nel momento in cui l'unità centrale riceve tale segnalazione, detta interruzione (interrupt), l'esecuzione del programma corrente viene interrotta caricando nel contatore di programma l'indirizzo di una procedura di servizio che provvede a trasferire il dato ▫ La gestione delle periferiche a interruzione richiede di risolvere diversi problemi realizzativi ▫ Ogni volta che il programma corrente viene interrotto è necessario salvare il contenuto di tutti i registri modificati dalla procedura di servizio, al fine di assicurare la prosecuzione corretta del programma dopo che la procedura di servizio sia terminata ▫ L'hardware provvede a salvare il contenuto del contatore di programma e del registro condizioni nel momento dell'interruzione, mentre la procedura di servizio provvede a salvare i registri che essa modifica per poi ripristinarli prima di terminare ▫ Un altro problema è costituito dal riconoscimento, al sopraggiungere di un'interruzione, del dispositivo che l'ha originata, al fine di eseguire la procedura di servizio appropriata ▫ Una soluzione consiste nell'interrogare uno ad uno i dispositivi che possono generare interruzioni, fino a quando venga identificata l'origine dell'interruzione pervenuta ▫ Questa tecnica (scansione o ciclo di polling) ha il grosso inconveniente di essere lenta ▫ Una soluzione migliore consiste nel prevedere che un dispositivo periferico, insieme al segnale di interruzione, ponga nel bus un codice numerico in base al quale l'unità centrale possa identificarlo univocamente→ questa tecnica (nota come interruzione vettorizzata) prevede, nei sistemi di gestione più sofisticati, che il codice numerico inviato con l'interruzione individui l'indirizzo in memoria centrale della procedura di servizio appropriata ▫ Occorre infine tener conto del fatto che un'interruzione può verificarsi in qualsiasi istante, anche durante la gestione di un'interruzione pervenuta entra in conflitto con la gestione dell'interruzione corrente ▫ Una soluzione a tale problema consiste nell'ammettere che ogni interruzione possa interrompere la gestione di un'altra interruzione, secondo il principio che l'ultima interruzione pervenuta sia la prima ad essere trattata→ questa soluzione non è esente da criticità, in quanto non è detto che l'ultima interruzione sopraggiunta sia anche la più urgente ▫ La soluzione opposta consiste nel disabilitare il sistema di ricezione delle interruzioni mentre è in corso la gestione di un'interruzione: le interruzioni che nel frattempo sopraggiungono vengono ignorate in via definitiva oppure, in una gestione più sofisticata, possono essere memorizzate in una coda e restare in attesa fino a quando non sia terminata la gestione dell'interruzione corrente → un meccanismo del genere risulta ugualmente troppo rigido, in quanto può portare a rinviare la considerazione di interruzioni che richiederebbero invece un trattamento urgente ▫ Una migliore soluzione consiste nel suddividere i vari tipi di interruzioni in classi caratterizzate da diverse priorità: la gestione di un'interruzione di una data classe viene interrotta dalle interruzioni di classi con priorità superiore ma non da quelle di classi con priorità inferiore, che non vengono servite almeno fino a quando il trattamento dell'interruzione in corso non sia terminato Accesso diretto alla memoria ▫ Nonostante la gestione delle periferiche a interruzione consenta, rispetto alla gestione a controllo di programma, di risparmiare il tempo sprecato nell'attesa che un dispositivo si renda disponibile al trasferimento dei dati, la gestione delle interruzioni, comprendente il salvataggio ed il ripristino dei registri e l'esecuzione della procedura di servizio, può comunque essere molto gravosa se le interruzioni si manifestano con frequenza elevata ▫ La soluzione adottata consiste nella gestione tramite accesso diretto alla memoria (DMA, Direct memory access): particolari dispositivi hardware, detti dispositivi di accesso diretto alla memoria (DMAC, Direct memory access controller) o più semplicemente dispositivi DMA, gestiscono le operazioni di trasferimento di un blocco di dati consecutivi tra un dispositivo periferico e la memoria centrale senza impegnare l'unità centrale ▫ I dispositivi di accesso diretto alla memoria sono collegati sia al bus di sistema sia ad uno o più dispositivi periferici da essi controllati ▫ Il loro funzionamento è regolato dall'unità centrale, che deve provvedere a inviare loro i comandi Elementi di informatica e programmazione 1p Pagina 29 ▫ Il loro funzionamento è regolato dall'unità centrale, che deve provvedere a inviare loro i comandi necessari per richiedere l'esecuzione delle operazioni desiderate, specificando l'identità del dispositivo periferico, il tipo di trasferimento richiesto e gli indirizzi in memoria del blocco di dati da trasferire ▫ Successivamente il dispositivo DMA gestisce autonomamente il trasferimento, lasciando libera l'unità centrale di proseguire nell'esecuzione del programma corrente; in particolare, il dispositivo DMA può controllare lo stato dei dispositivi periferici ed è in grado di inviare segnali opportuni ai dispositivi e alla memoria al fine di governare correttamente il processo di trasferimento ▫ Al termine del trasferimento, il dispositivo DMA segnala all'unità centrale, mediante un'interruzione, l'avvenuta esecuzione del compito ▫ La presenza di un ulteriore dispositivo attivo oltre all'unità centrale richiede un meccanismo di arbitraggio del bus per evitare che in uno stesso momento vi accedano dispositivi diversi ovvero l'unità centrale e uno o più dispositivi DMA Elementi di informatica e programmazione 1p Pagina 30 ▫ Il loro funzionamento è regolato dall'unità centrale, che deve provvedere a inviare loro i comandi necessari per richiedere l'esecuzione delle operazioni desiderate, specificando l'identità del dispositivo periferico, il tipo di trasferimento richiesto e gli indirizzi in memoria del blocco di dati da trasferire ▫ Successivamente il dispositivo DMA gestisce autonomamente il trasferimento, lasciando libera l'unità centrale di proseguire nell'esecuzione del programma corrente; in particolare, il dispositivo DMA può controllare lo stato dei dispositivi periferici ed è in grado di inviare segnali opportuni ai dispositivi e alla memoria al fine di governare correttamente il processo di trasferimento ▫ Al termine del trasferimento, il dispositivo DMA segnala all'unità centrale, mediante un'interruzione, l'avvenuta esecuzione del compito ▫ La presenza di un ulteriore dispositivo attivo oltre all'unità centrale richiede un meccanismo di arbitraggio del bus per evitare che in uno stesso momento vi accedano dispositivi diversi ovvero l'unità centrale e uno o più dispositivi DMA ▫ Si noti che la possibilità di gestire le periferiche tramite accesso diretto alla memoria, nonostante risulti più efficiente rispetto alla gestione a interruzione e a controllo di programma, non rende in ogni caso superfluo il meccanismo di gestione a interruzione ▫ In primo luogo lo stesso DMA utilizza un'interruzione per segnalare la terminazione di trasferimento; inoltre tenendo presente che l'inizializzazione e la gestione del dispositivo DMA richiede comunque un tempo non trascurabile, la tecnica tramite accesso diretto alla memoria risulta conveniente soltanto per le periferiche veloci che assicurino un flusso cospicuo e continuo di dati, quale tipicamente è prodotto dai dischi fissi ▫ Per periferiche più lente e caratterizzate da una certa discontinuità nel trasferimento di dati, come ad esempio la tastiera o il mouse, risulta più conveniente utilizzare la tecnica delle interruzioni Elementi di informatica e programmazione 1p Pagina 31