L’informatica si occupa di elaborare le informazioni in modo automatico
AUTOMATICA – disciplina che richiede un sistema che trasformi materie prime in prodotti finiti senza
l’intervento dell’uomo, quindi attraverso delle macchine
INFORMATICA – particolare accezione → manipolare in modo automatico le informazioni utilizzando
un sistema che è in grado di modificare il proprio stato autonomamente (modifica grandezze fisiche)
Devo quindi realizzare delle “macchine informatiche” in grado di elaborare le informazioni, ovvero dei
concetti astratti
Informazioni = rappresentato
Grandezza fisica = rappresentante (deve essere modificabile in modo automativo)
Devo scegliere una corrispondenza tra questi due concetti: Es.
Velocità auto – MECCANICO tachimetro
Temperatura locale – TERMICO termometro Hg
Altri esempi di rappresentanti CHIMICO ed ELETTRONICO (LED)
Come scegliere un rappresentante? (creare una macchina)
Le caratteristiche desiderate sono: Rappresentanti Elettrici
Dimensioni contenute – praticità → e- nel circuito
Veloce – modifiche rapide in relazione al rappresentato →non ci sono parti meccaniche
(sfrutto flusso nel circuito)
Economico da costruire →materiali comuni
Economico da far funzionare → sufficienti tensioni e correnti
piccole
Tecnologia più sfruttata: CIRCUITI INTEGRATI SU SILICIO (diffusi ovunque es. pc/carte di cresito…)
Dimensioni ridottissime – Micron
Velocità di variazione elevata – frazioni nanosecondo
Costi minimi
Consumi di energia minimi – frazioni di microwatt
L’utilizzo di un rappresentante elettrico è ciò che lega l’informatica e l’elettronica, la quale crea
appunto i dispositivi fisici che permettono la rappresentazione di elevati numeri di informazioni con
un’alta convenienza economica.
!! primi elaboratori → elettro-meccanici (Turing fondamenti dell’informatica e creazione del primo elaboratore
per decifrare messaggi criptati dei tedeschi in Seconda guerra mondiale)
Devo creare una corrispondenza tra il campo di variabilità dell’informazione e quello della grandezza
elettrica.
Es. rappresento T di un locale Tmin – Tmax rappresentante Tensione elettrica 0 – Vmax
CORRISPONDENZA
La più semplice è detta lineare o biunivoca (analogica) in
Vmax pratica ad ogni valore ne corrisponde uno ed uno solo.
PRO: fedele (rifletto anche le più piccole variazioni) ed intuitiva
V0 (ricavo immediatamente la correlazione)
CONTRO: vulnerabile – una variazione della curva elettrica
dovuta a vari motivi provoca un errore di rappresentazione e
valutazione! (es. usura o variazioni…)
0 Tmin T0 T0’ Tmax T
Aumenta gli errori di elaborazione – operando sui valori l’errore
di approssimazione si amplia di volta in volta.
Devo eliminare l’errore (vulnerabilità) del rappresentante con uno dei seguenti metodi:
Non rappresento tutti i valori, ma ne scelgo un numero discreto associando un sottoinsieme
finito ad una cifra (DIGIT)
Devo creare una corrispondenza tra il campo di variabilità dell’informazione e quello della grandezza
elettrica.
CORRISPONDENZA
Ad un valore non ne corrisponde solo uno, ma un insieme di
Vmax valori ed in questo caso la corrispondenza UNIVOCA è solo tra
V2 rappresentato e rappresentante e non viceversa.
V1 PRO: robusta – la variazione non ha effetto perché è possibile
V0 un’autocorrezione (riconosce il valore del rappresentante se ho
un errore relativamente piccolo) utile per elaborazioni complesse
CONTRO: poco fedele – non riesco a risalire al rappresentato
0 Tmin Tmax T
(prendo valore intermedio nell’intervallo)
considero solo due valori di rappresentante
Vmax CORRISPONDENZA
PRO: estremamente robusta – per confondere le due cifre l’errore
deve essere molto grave e l’autocorrezione è semplificata (utili per
elaborazioni complesse)
Economica – i circuiti consumano poco e possono essere più
piccoli (numerosi)
0 Tmin Tmax T
CONTRO: troppo limitata – non riesco a risalire al rappresentato poiché i valori dicono troppo poco e
per aumentare l’accuratezza devo associare al rappresentato una sequenza di rappresentanti
N bit → 2n possibili valori di rappresentato
Con la rappresentazione binaria è possibile rappresentare diversi tipi di informazioni come:
numeri
caratteri (testi – lettere alfabeto, simboli…)
forme d’onda (suoni – variazione pressione dell’aria)
immagini (matrici bidimensionali di pixel)
sequenze di suoni e immagini (filmati)
In primo luogo, cerchiamo una rappresentazione che ci consenta di riutilizzare le regole di calcolo cui
siamo abituati:
✓ ci rifacciamo alla notazione decimale, inventata in India, perfezionata dagli arabi e
introdotta in Europa da Fibonacci;
✓ si tratta di una notazione posizionale basata sulle 10 cifre decimali da 0 a 9;
✓ ogni cifra concorre al valore finale del numero con un peso dato dalla sua posizione nel
numero: unità, decine, centinaia, migliaia, … decimi, centesimi, millesimi, …;
✓ il peso è una potenza del numero 10 (base della notazione)
DECIMALE – con c cifre rappresento tutti i numeri n tali che 0 ≤ 𝑛 ≤ 10𝑐 − 1
Quindi per rappresentare un numero n servono almeno 𝐶 = [𝑙𝑜𝑔10 𝑛] = 𝑖𝑛𝑡. su(𝑙𝑜𝑔10 𝑛)𝐶𝑖𝑓𝑟𝑒
Es. (1273)10 = 1x10 3 + 2x10 3 + 7x10 1 + 3x10 0
BINARIA (8bit=1bite) – Con b bit rappresenti tutti i numeri n tali che 0 ≤ 𝑛 ≤ 2𝑏 − 1
Quindi per rappresentare un numero n servono almeno 𝑏 = [𝑙𝑜𝑔2 𝑛] = 𝑖𝑛𝑡. su(𝑙𝑜𝑔2 𝑛)𝐵𝑖𝑡
Es. (10010110)2 = 1x2 7 + 0x2 6 + 0x2 5 + 1x2 4 +0x2 3 +1x2 2 + 1x2 1 + 0x2 0
Per convertire da BIN a DEC si applica la notazione posizionale come visto precedentemente, mentre per
convertire da DEC a BIN si divide ripetutamente il numero per 2 fino ad arrivare ad un quoziente nullo
e si prendono i resti a partire dall’ultimo.
Es. (10)10 = (1010)2
Numero diviso 2 10 5 2 0
Resto 0 1 0 1
Nel caso dei numeri razionali per convertire da BIN a DEC utilizzo lo tesso procedimento:
Es. (101,01)2 = 1x2 2 + 0x2 1 + 1x2 0 + 0x2 -1 + 1x2 -2 = (5,25)10
Per numeri molto grandi conviene utilizzare la rappresentazione esponenziale:
n = m x be m=mantissa(numero predefinito in cifre significative) e = esponente che definisce il peso
delle cifre della mantissa (virgola mobile)
Es. (1100000)2 = 3x2 5
= 3x32 = (96)10 m = 11 e=2 5
n= 11x2 101
Se considero numeri relativi devo indicare il segno + o – utilizzando un bit (0=+ e 1=-)
Possono essere svolte le operazioni anche con numeri binari:
00110101 + 53 + 10010001 - 145 –
10110001 = 117 = 00110000 = 48 =
0110001 rip. 1100000 rip.
111001102 23010 011000012 97 10
Come rappresentare i caratteri in binario:
Codice ASCII – Associo una stringa di 7 bit ai caratteri alfanumerici (fino a 128 caratteri):
Per bit più significativi si intendono le prime tre cifre (six), mentre i meno significativi sono le utlime
quattro(des).
Es. (1100000)2 = ‘
Con 8 bit raddoppio il numero di caratteri rappresentabili
Come rappresentare i segnali audio (forme d’onda che variano nel tempo):
Campionamento della forma d’onda e memorizzazione dei campioni (approssimazione) —> misurazione
della variazione della pressione nel tempo e indicazione della sequenza di valori numerici in binario.
Maggiore è la frequenza del campionamento, maggiore è la fedeltà: la frequenza di campionamento
deve essere almeno doppia della massima frequenza del segnale (teorema Nyguist-Shannon)
Come rappresentare le immagini (matrice rettangolare punti chiamati pixel – risoluzione spaziale è
data dal numero di pixel e dalla risoluzione cromatica) :
I bit vanno a rappresentare i colori del pixel (approssimazione della realtà)- 8 bit per bianco e nero e
24 bit per colori (mescolare 4 colori primari)
L’unione di queste due procedure permette di codificare i filmati – sequenze di immagini discrete nel
tempo (illusione della continuità) + COMPRESSIONI utilizzate per ridurre la dimensione dei filmati
!! Tutto deve essere approssimato perché un calcolatore non può registrare infiniti dati – memoria
fisica discreta e non continua (limitata)
Bit – una cifra binaria
Byte – 8bit
Riassunto:
➢ Posso codificare diversi tipi di informazioni grazie ai bit ed alle stringhe/sequenze di bit
➢ Per non utilizzare troppi bit si possono sfruttare delle compressioni, ovvero tecniche che
sfruttano le imperfezioni del sistema percettivo umano
➢
Approfondimenti sulla rappresentazione
❖ Codifica del testo
Associazione di un codice numerico ad ogni carattere con una codifica standard chiamata
ASCII (7 bit – 2^7 caratteri), in modo che sia leggibile su dispositivi differenti.
Oggi si utilizza l’ASCII esteso che sfrutta 8 bit (1 byte) in cui si possono utilizzare simboli
particolari (2^8 caratteri)
Oltre a questo codice esistono altri linguaggi allo scopo di rappresentare diversi alfabeti
(caratteri diversi), un altro standard è l’UNICODE il quale utilizza 16 bit (2 Byte – 2^16
caratteri)
- primi 256 caratteri corrispondono ad ASCII esteso
- restante per tutti i simboli delle lingue del mondo
❖ Codifica delle immagini
Utilizzo di una matrice di punti, o griglia di pixel, la cui risoluzione è data dal numero di
punti/pixel. Essendo i pixel dei quadrati la codifica prevede un’approssimazione dell’immagine,
ottenendo alla fine una mappa di bit, le cui righe generano una sequenza.
!! Maggiore è la risoluzione (n° di pixel) migliore è la qualità dell’immagine, si considerano i
PUNTI PER POLLICE e i MEGAPIXEL.
Per codificare i colori:
BANCO E NERO: bianco=1 e nero=0
SCALA DI GRIGI: il numero rappresenta l’intensità del colore.
Es. Con 8 bit avrei 28 sfumature di grigio
COLORE: codifico combinando i tre colori primari (3 byte, 1 per ogni sfumatura di colore
primario) – codifica RGB Red, Green, Blue – con le diverse combinazioni ottengo una
gamma molto varia di colori TRUE COLOR
Es. Ho più di 16 milioni di colori —> 3x8=24 bpp (bit per pixel)
Altro tipo - ogni pixel viene associato ad una palette limitata di colori, associando ad ogni
pixel un indice (0-255) che poi può essere corrisposto ai valori RGB in una tavolozza (tabella
con corrispondenze)
Questo tipo di rappresentazione è vantaggiosa perché risparmio spazio di memorizzazione
(ho un solo byte per pixel), ma ho una risoluzione molto più bassa perché ho pochi colori.
Es. Immagine di 150 x 200 = 30000 pixel – 90000 byte
Mentre se creo una palette ne occupo molti meno
Spesso è possibile comprimere le immagini utilizzando diversi algoritmi di compressione:
- senza perdita di info GIF e PNG (no immagini nimate, supporta fino a 48 bit true color, 16 bit
scala di Grigi, 256 colori)
- con perdita info limitata JPEG
Rappresentazione vettoriale (completamente diversa) —> descrivo la forma dell’immagine
Vertici, segmenti e colore di riempimento – risparmio nell’informazione
Scalable Vector Graphic – utile per immagini geometriche, ma complicata per le immagini
normali però vantaggiosa perché compatta e possibilità di ingrandire e rimpicciolire senza
perdita di qualità
Codifica dei filmati
Digitalizzazione dei fotogrammi (insieme di immagini che fanno video)
Formati AVI e MOV e formati commessi come MPEG (sfrutta le differenze tra i fotogrammi-
memorizza solo le differenze tra due fotogrammi)
Per audio – campionamenti con frequenza (Hz – campioni al secondo) costante, associando dei
numeri ad ogni campione – formano stringa di bit
Formati WAVE AIFF, Real Audio, MIDI (simbolica, utile per dispositivi elettronici legati alla
musica perché rappresenta note) e compressa MP3
La maggior parte dei calcolatori si basa sulla “MACCHINA DI VON NEUMANN”
CPU – unità master o centrale di
elaborazione dati
Memoria di lavoro – memorizzazione
programmi da eseguire e dati su cui operare
Interfaccia di Imput/Output– mezzo di
comunicazione con altri dispositivi
(periferiche)
Bus di Sistema – insieme di linee di
connessione che uniscono le tre unità
Caratteristiche della CPU – agisce in modo sequenziale ripetendo ciclicamente, ad un tempo scandito
da un clock interno, le tre operazioni seguenti:
❖ fase di fetch – prelevamento di una stringa
di bit dall’esterno corrispondente al prossimo
programma da eseguire (insieme di
istruzione)
❖ fase di decodifica – interpretazione della
stringa di bit
❖ fase di esecuzione – esecuzione di quanto
richiesto e possibilità di scambiare dati con
l’esterno
la CPU è quindi una macchina programmabile che funziona eseguendo i “compiti” volta per colta
ogni passo corrisponde ad una stringa di bit e quindi ad un’istruzione
una sequenza di istruzioni corrisponde ad un programma
le stringe di bit devono essere scambiate tra CPU e MEMORIA DI LAVORO rispettando i tempi di
lavoro
Caratteristiche della memoria di lavoro – array (vettore) di celle contenenti “parole di memoria”,
ovvero stringe di bit e quindi informazioni
Devo quindi avere degli indirizzi/indici le cui
linee che permettono al bus di localizzare
l’informazione, trasmetterla e scegliere se
leggerla (prelevarla) o scriverla (modificarla).
Funzionamento:
1. la CPU segnala alla memoria la cella a cui è
interessata e il tipo di operazione.
2. La memoria risponde alla CPU (slave e
master)
Caratteristiche dell’Interfaccia di Input/Output – Per poter inserire il programma o i dati nella
memoria devo utilizzare dei dispositivi chiamati INTERFACCE che permettono all’uomo di “comunicare”
con il calcolatore.
Dalla CPU le interfacce vengono
considerate in modo simile alla memoria
poiché hanno delle celle, registri
(comando, stato, dato-in, dato-out), in cui
vengono registrati i comandi.
Le interfacce vengono adattate al tipo
di macchina a cui sono collegate.
Per permetterne il funzionamento è necessario definire un vocabolario specifico, detto linguaggio
macchina, comprensibile alla CPU.
Caratteristiche del Bus di Sistema – in base al numero di linee varia la complessità, ma anche il numero
di locazioni di memoria che posso indirizzare
Es. 16 linee address bus= spazio di indirizzamento pari a 216 kbyte
Data bus – trasmette in parallelo una
stringa di bit tra CPU e memoria o
interfaccia. Il numero di d linee
definisce la dimensione della cella ed
influisce sulle prestazioni, in quanto
la banda passante del bus (bit/s)
cresce al crescere di d (multiplo si 1
byte).
Address bus – serve per indicare la
cella in cui la CPU intende fare il
trasferimento. Il numero di a linee
definisce lo spazio di indirizzamento della CPU (massima quantità di celle indirizzabili) pari a 2a,
inoltre, influisce sulla potenzialità della CPU, poiché all’aumentare di a aumentano la dimensione
massima dei programmi eseguibili e la quantità di dati elaborabili.
Control Bus – costituito da fili autonomi ciascuno con il proprio significato, alcune consentono alla
CPU di gestire le interazioni con dispositivi slave, altre consentono le interazioni contrarie. Il
numero di linee dipende dalla complessità della CPU.
In sintesi, il numero di linee è correlato alle prestazioni della CPU
Struttura interna della CPU
Gli elementi chiave della CPU sono l’ALU (Aritmetic Logic Unit) e la Control Unit.
La prima si occupa di eseguire elaborazioni aritmetiche (calcoli) estremamente elementari e
logiche (AND, OR, NOT e confronti). L’esito finale di queste operazioni viene memorizzato nel
“registro” CC (Condition Code), ovvero una locazione di memoria ridotta (ca. 26/34 bit).
Combinando operazioni più semplici, che vengono eseguite molto velocemente, la CPU può
svolgere operazioni molto più complesse rapidamente.
La seconda si occupa della decodifica delle
istruzioni e della loro traduzione in una serie di
operazioni che possono essere svolte dall’ALU. In
pratica è in grado di leggere un’istruzione in
corso di elaborazione, contenuta nel “registro” IR
(Instruction Register). Questa informazione è
stata individuata dal bus, il quale legge l’indirizzo
della cella di memoria contenente l’informazione
da eseguire, contenuto nel “registro” PC (Program
Counter). In sintesi, controlla il funzionamento
della CPU e dei dispositivi slave.
Altri registri importanti sono:
❖ GPR (general purpose register) – contiene dati in
corso di elaborazione, risultati intermedi;
❖ MAR (memory adress register) – consente la CPU di emettere l’indirizzo della cella contenente
l’informazione sull’adress bus;
❖ MDR (memory data register) – consente il trasferimento di un dato dalla CPU al data buss e
viceversa.
Un altro aspetto importante è l’ISA (Instruction Set Architecture), ovvero l’insieme di istruzioni che
quella specifica CPU può comprendere ed eseguire. La codifica binaria dell’istruzione è il linguaggio
macchina specifico della CPU, ogni istruzione è caratterizzata da:
Codice operativo (opcode) – indica di quale istruzione si tratta
Operandi (operands) – contengono dati e informazioni aggiuntive per eseguire l’operazione*
(indirizzi, numeri, caratteri, dati logici)
Es.
Codice-op Reference
8bit 4bit 20bit
Corrispondente esadecimale per semplificare
Indica quale operazione Su quali dati opera Indirizzo della parola presente nell’indirizzo precedente
eseguire ([Link])
*Gli operandi si trovano nella memoria centrale, nei registri della CPU, nei dispositivi I/O oppure
possono essere immediati (presenti nell’istruzione).
Il numero di indirizzi può variare:
Uno pero ogni operando (1 o 2)
Uno per risultato
Uno per l’istruzione successiva
Svantaggi del linguaggio macchina
1. Difficile scrivere, capire e cambiare in binario
2. Gestione della RAM
Utilizzo LINGUAGGIO ASSEMBLER, ovvero una rappresentazione
simbolica del linguaggio macchina → codici e numeri più facili da
comprendere e memorizzare e identifico i numeri come INT o FLOAT
(interi/virgola mobile)
Es. ADD A, B (utilizzabile per programmare i calcolatori)
Le istruzioni eseguite tipicamente sono di tre tipi:
1. Operative – richiedono elaborazione
aritmetico (ADD, SUB…) / logica (vero o
falso → AND, OR, XOR se veri entrambi è
F, SHIFT, ROTATE) sui dati (ALU)
Confronto (COMP, FCOMP) – comparare due numeri o registri
2. Trasferimento – servono per prelevare o trasferire i dati da/a una memoria di lavoro
interfaccia I/O (LOAD/STORE)
3. Controllo – servono a variare la sequenza/ il flusso di esecuzione dell’istruzione (passo da una
ad un’altra più lontana) eseguendo dei SALTI CONDIZIONATI (al verificarsi di una condizione)
O INCONDIZIONATI
Regolano esecuzione
Istruzioni di salto (BRLT, BRLE; BRANCH…)
Evoluzione dei calcolatori
Dal 1982 la frequenza di lavoro della CPU aumentò esponenzialmente, ma lo stesso non fu per la RAM,
la quale rimase dieci volte più lenta dell’unità master. Per risolvere questo problema la CPU procede in
celle consecutive (tranne per i salti, anche se si tende a memorizzarli in celle vicine) e ripete
ciclicamente un blocco di istruzioni (variabili “ripassate”); quindi posso utilizzare una memoria CACHE
che va a caricare l’informazione richiesta, ma anche un certo numero di celle vicine (blocco),
velocizzando il processo. Questa memoria è fisicamente staccata dalla memoria di lavoro e si trova
vicino alla CPU, è piccola perché costosa da realizzare ed è volatile, ovvero ne perdo il contenuto
quando spengo il calcolatore.
Problemi da risolvere:
La memoria cache è divisa in blocchi come per la memoria di lavoro (es. 16 celle)
IN QUALI BLOCCHI COPIO?
La CPU deve individuare (HIT) la parola che necessita all’interno della cache
COME PUÒ FARLO?
Quando una parola richiesta dalla CPU (MISS) non è presente nella cache bisogna spostare
l’intero blocco contenuto nella memoria di lavoro
COME? E SE LA CACHE È PIENA?
A seconda di come rispondo a queste domande ho diverse politiche di riempimento della cache:
1. Tag Associative → vincolo fisso secondo il quale un blocco
viene copiato in un blocco prefissato della cache.
BLOCCO CACHE – il tag numero del blocco in memoria che è
stato copiato e che appartiene al gruppo che può essere
copiato in quel determinato blocco della cache.
Facile individuazione ed estrazione in caso che non sia stato
copiato nella cache (HIT/MISS)
2. Fully Associative → posso copiare il blocco in un qualsiasi punto della cache, sfrutta “Least
Recently Used” - vado ad eliminare I blocchi che sono
stati richiesti meno recentemente dalla CPU, in questo
caso però devo inserire dei contatori a saturazione per
ogni blocco (azzerati quando si accede al blocco,
aumentano di uno quando si accede ad altri blocchi –
ELIMINO QUELLO CON IL VALORE PIÙ ALTO)
La ricerca è più complessa e la costruzione è più costosa
3. Set Associative (intermedia) → ogni blocco può essere copiato solo in n blocchi predefiniti,
cerca di ottimizzare pregi e difetti delle precedenti.
Problema della scrittura in cache → quando la CPU scrive nella cache il valore modificato potrebbe
essere diverso rispetto a quello presente nella memoria di lavoro, generando quindi una discordanza.
Per risolvere possiamo:
1. Politica store thru → modifica contemporanea di cache e memoria di lavoro; molto semplice
poiché info e copie sono sempre congruenti, ma perdo il vantaggio della velocizzazione portata
dalla cache (è valida solo se i processi di scrittura sono decisamente meno di quelli di lettura)
2. Politica store in → temporaneamente non mi curo della memoria di lavoro; velocizza i processi
di scrittura, però è molto complessa perché ho un’incongruenza
Posso riscrivere il blocco nella memoria di lavoro prima di eliminarlo (rallenta)
Introduzione del bit M, il quale viene settato ad uno ogni volta che il blocco viene
modificato – riscrivo in memoria solo i blocchi che hanno 1
Costi e Velocità Dimensioni
Memoria di massa a disco magnetico:
tempo di accesso di qualche msec.
Dimensioni di qualche decina di GB;
memoria di massa online, programmi di uso quotidiano, dati di uso quotidiano.
Memoria di massa a disco ottico o a nastro:
tempo di accesso dalle centinaia di msec. alle decine di sec.
Dimensioni di centinaia di GB a basso costo
memoria di massa offline: originali dei programmi, backup dei propri dati.
La memoria di lavoro (con i livelli di cache soprastanti) è una memoria
di natura elettronica, con tempi di lavoro in linea con quelli della CPU
e ad accesso casuale, in cui ogni cella richiesta è accessibile nello stesso
tempo (cache permettendo).
La memoria a disco magnetico è una memoria di natura meccanica,
con tempi di lavoro inaccettabili per la CPU, e ad accesso sequenziale (o
misto), in cui il tempo di accesso varia a seconda della posizione del
disco richiesta.
L’ottimizzazione della CPU per aumentarne e sfruttarne le potenzialità ha come conseguenza l’aumento
dei costi per ampliamento circuiti elettronici). La CPU passa la sua esistenza ad eseguire istruzioni
macchina (FETCH, DECODE, EXEC, WRITE BACK), sfruttando tutti i suoi componenti (parti diverse) con
poca sovrapposizione fra gli elementi coinvolti nelle fasi.
Per ottimizzare la CPU bisogna cercare di eseguire le operazioni piò in parallelo, ho finito di usare
eseguire una fase, passando a quella successiva, posso utilizzare la sua parte per eseguire la stessa fase.
Legata all’informazione seguente. Si adotta quindi l’architettura PIPELINE (catena di montaggio –
attivo un info per ogni ciclo di clock), ovvero si complica la CPU creando una control UNIT per ogni
istruzione. È molto vantaggiosa poiché dopo il transitorio di avviamento (fasi di avviamento) l’ICR
(instruction Completion rate) o tasso di completamento della CPU è:
ICR pipeline = NS x ICR normal [MIPS – mille istruzioni per secondo]
Dove NS è il numero di stati della pipeline, i quali devono essere sincronizzati dal clock e non durando
tutti esattamente lo stesso tempo, l’ICR reale della pipeline è leggermente inferiore del valore teorico.
Rallentamenti delle pipeline dovuti alle dipendenze:
1. Control Dependency —> dovute all’esecuzione di istruzioni di
salto, per cui si ha un cambio del flusso di esecuzione (no
eseguo la sequenza ordinata). Questo porta allo svuotamento
della pipeline e ad una perdita di efficienza dovuta alla
necessità di riiniziare un nuovo flusso.
2. Data Dependency —> due istruzioni vicine utilizzano lo stesso
dato
3. Resource Dependency—> conflitto tra distruzioni poiché
entrambe necessitano della stessa risorsa
Sistema ultimo pezoooooooo
Un algoritmo (dall’arabo-persia) è un procedimento che consente di ottenere un risultato eseguendo in
un determinato ordine, un insieme di passi semplici, scelti tra un insieme finito di azioni eseguibili da
un elaboratore.
Le caratteristiche degli algoritmi sono:
➢ Finitezza —> la sequenza delle istruzioni deve essere finita
➢ Effettività —> deve portare ad un risultato
➢ Realizzabilità —> deve essere eseguibile materialmente (qualcuno/cosa deve poterla eseguire)
➢ Non ambiguità —> le istruzioni non devono essere confuse
Gli algoritmi “risolvono un problema”, ovvero una corrispondenza tra una serie di istanze (valori di
INPUT) e le sue soluzioni (valori di OUTPUT).
I linguaggi di programmazione permettono di comunicare ad una macchina come risolvere un
problema in modo semplice, schematico, chiaro e non ambiguo; rappresentando i programmi (algoritmi
+ strutture dati). Sono analoghi ai linguaggi naturali e sono caratterizzati da:
✓ Alfabeto (simboli) e dizionario – per formare frasi
✓ Sintassi (regole grammaticali)
✓ Semantica (significato delle frasi)
✓ Pragmatica (utilizzo a seconda del contesto)
A differenza dei linguaggi naturali non devono però essere ambigui, quindi necessitano di una
formalizzazione, definizione in maniera non equivocabile.
Nei linguaggi macchina, immediatamente comprensibili dalle macchine, le istruzioni sono
rappresentate da sequenze di numeri binari e operano direttamente sull’Hardware (registri, memoria,
unità input-output, ...). Inoltre, il linguaggio macchina è specifico per ogni processore (famiglia di
processori con struttura differente) e assumono il modello di Von Newman.
Queste ultime caratteristiche portano ad un grosso problema: i programmi applicativi dovrebbero essere
diversi per ogni calcolatore, ma gestirli in questo modo sarebbe impossibile.
Vengono quindi introdotti i sistemi operativi, ovvero degli intermedi o strati posizionati tra il
programma applicativo e la macchina hardware che permettono di utilizzare il medesimo programma
su processori diversi, semplificando l’utilizzo da parte degli utenti.
➢ BIOS —> Nella memoria ROM (solo lettura e
stabile) sono presenti i programmi minimi che
consentono il bootstrap del sistema operativo,
ovvero il suo caricamento sulla macchina. Più
nello specifico contiene i driver minimali per
“pilotare” le periferiche specifiche del calcolatore
su cui è installato (eventualmente anche
interfacce di rete). il bios è quindi una parte di
software che si interfaccia direttamente con il
calcolatore e dipende da esso.
➢ KERNEL —> si occupa occupa di gestire i processi, ovvero i programmi che poi dovranno essere
eseguiti dal processore. In contemporanea possono essere eseguiti diversi processi che devono
coesistere (accendersi, spegnersi, leggere dati…), quindi i Kernel sceglie in quale fase possono
trovarsi i processi e killarli se avviene un errore (funzione non ammessa).
Stati di un processo:
1. NEW - Appena caricato
2. READY - pronto per essere eseguito
3. RUNNING - esecuzione
4. WAITING - attesa di input o dati
5. TERMINATED - finito
➢ GESTORE DELLA MEMORIA —> si occupa della memoria di lavoro fisica e anche della memoria
virtuale, ovvero una “simulazione” di memoria maggiore rispetto a quella fisica (es. se un
programma richiede memoria maggiore rispetto a quella disponibile). Usando tecniche di
segmentazione e paginazione permette a più programmi di accedere contemporaneamente alle
porzioni della memoria
➢ GESTORE DELLE PERIFERICHE —> contiene i driver che guidano l’utilizzo delle periferiche, si
occupa quindi di leggere gli input provenienti dalle periferiche. I meccanismi di gestione sono
svariati: a controllo di program (controlla ciclicamente un determinato input- tasto
schiacciato), a interrupt (spedisce un segnale fisico di interruzione del programma alla CPU
quando viene schiacciato un tasto, la quale lancia un programma per gestire l’input di quel
determinato. Tasto), a DMA (permette di gestire l’accesso al disco in modo indipendente dal
processore, usando un processore ulteriore che si occupa solo dell’accesso alle periferiche),
virtualizzazione delle periferiche (crea uno strato di software sopra il driver che astrae la
periferica dalle sue caratteristiche fisiche — posso scrivere dei programmi che vanno a vedere la
virtualizzazione)
Plug&play (periferiche che istallano in automatico i driver)
➢ FILE SYSTEM —> si occupa nei dettagli della gestione dei file, in modo da renderli più accessibili
al sistema operativo, virtualizzando la memoria di massa. In pratica crea degli archivi di dati
(file) organizzato in strutture gerarchiche basate
su directory (cartelle), riferendosi ad essi tramite
un nome in caratteri alfanumerici e un’estensione
(normalmente 3 caratteri) che identifica il tipo di
informazione memorizzata.
Posso costruire un cammino PATHWAY che,
seguendo l’albero delle directory, permette di
raggiungere un file specifico:
Sistemi Operativi Standard:
✓ MS DOS ✓ Linux ✓ iOS
✓ Unix ✓ Mac OS ✓ Windows phone
✓ Windows ✓ Android ✓ webOS
Le caratteristiche e funzionalità dei SO dipendono dall’architettura hardware utilizzata, sul mercato
sono presenti diversi tipi di S.0. alcuni esempi tra i più noti sono:
− Unix: sviluppato negli anni 60 dai Bell Labs è uno dei primi SO. Molti sistemi successivi sono
estensioni di questo
− MS-DOS: il primo (1980) utilizzato nei PC (personal computer) dell’IBM. Realizzato da Bill Gates
e Paul Allen. DOS significa Disk Operating System; Sistema operativo in grado di gestire la
memoria di massa. SO spesso detto “IBM compatibile”, cioè utilizzabile su tutte le architetture
hardware compatibili con quelle sviluppate da IBM
− Microsoft Windows: Inizialmente (Windows 1.0 del 1985 -Windows 3.11 del 1993) solo
un’interfaccia grafica a finestre che si appoggiava al SO MS-DOS. Successivamente un vero SO
(Windows 95 – Windows XP del 2001, Vista del 2007). Attualmente SO a 64 bit (Windows 10,
Windows server 2019)
− Mac OS: SO sviluppato per un’architettura diversa da quella dei PC dell’IBM, l’architettura
Macintosh sviluppata integralmente da Apple. Si distingue fra: Il Mac OS Classic, cioè il SO
montato sul primo modello di Macintoch nel 1984 ed evolutosi, attraverso numerose versioni,
fino al 2001 (attualmente non più supportato) L’attuale Mac OS X (ten), completamente
riscritto e basato supiattaforma UNIX, commercializzato dal 2001
− Linux: Alternativa di mercato a Windows, nell’ambito dei computer che usano lo stesso tipo di
processore, sistema open-source (modificabile da tutti gli utenti) ispirato al modello di Unix,
inoltre non è un sistema proprietario (non pago).
Funzioni principali del sistema operativo:
1. Avvio dell’elaboratore → Il sistema operativo viene mandato in esecuzione al momento
dell'accensione del calcolatore. Questa fase prende il nome di bootstrap.
In generale, una parte del sistema operativo deve essere sempre mantenuta in
memoria principale e deve essere sempre pronta per l’esecuzione (parte gialla).
Questo significa che parte della memoria principale dovrà essere dedicata a
mantenere programmi e i dati riguardanti il sistema operativo; mentre la
restante sarà disponibile agli utenti ma sempre controllata dall’SO.
2. Memoria principale
3. Gestione del processore e dei programmi in esecuzione → Quando si clicca due volte sull’icona di
un programma, il sistema operativo
I. cerca il programma sull’hard disk
II. copia il programma in memoria centrale
III. imposta la CPU con l’indirizzo in memoria centrale della prima istruzione del
programma
Quanti processi possono essere eseguiti da un elaboratore? E quanti utenti possono utilizzare
“contemporaneamente” un elaboratore?
Questo dipende dal tipo di SO:
Mono-utente o multiutente (mono/multi-user)
Si distingue tra elaboratori di tipo personale e elaboratori utilizzabili da più utenti
contemporaneamente
Mono o multi-programmati (mono/multi-tasking)
Si distingue tra elaboratori in grado di gestire un solo processo alla volta oppure più processi
“contemporaneamente”
Distribuiti (o di rete)
Es. Sistemi mono-utente, mono-programmato
− Un solo utente può eseguire un solo programma alla volta
− Il programma viene “lanciato”, eseguito e quindi terminato
− Il SO MS-DOS è un esempio di sistema mono-utente, mono programmato
− La CPU è molto più veloce dei dischi e delle altre periferiche, e passa la maggior parte
del suo tempo in attesa del completamento delle operazioni demandate a questi
dispositivi. Durante l’attesa si dice che la CPU è in uno stato inattivo, detto IDLE
Un processo è costituito da 1000 istruzioni e ogni istruzione richiede 1 microsec. per essere
eseguita dalla CPU: tempo totale di esecuzione = 10 * 10 = 1 millisec.
A metà esecuzione è richiesta la lettura di un dato dal disco. Il tempo di lettura è pari ad 1
millisec.: tempo totale di esecuzione = 2 millisec. Idle time = 1millisec.
Corrisponde a 50% del tempo totale di esecuzione ed è tempo sprecato
Per evitare le situazioni di spreco evidenziate nel precedente esempio, sono stati introdotti i SO
multi-programmati
− Nei SO multi-programmati, più processi possono essere contemporaneamente presenti in
memoria principale ed eseguiti dalla CPU
− Quando la CPU è nello stato di IDLE la si può sfruttare per eseguire (parte di) un altro
processo
− Quando un processo si ferma (per esempio in attesa di un dato dall’utente) la CPU può
passare ad eseguire le istruzioni di un altro processo
− Il sistema operativo si occupa dell’alternanza tra i processi in esecuzione (illusione che
più processi vengono eseguiti contemporaneamente
4. Gestione della memoria principale →Il sistema operativo si preoccupa (attraverso un
programma chiamato Scheduler) di gestire l’allocazione, il mantenimento e la rimozione di più
programmi contemporaneamente in memoria principale (più processi). Inoltre, deve evitare che
i processi in memoria si danneggino l’uno con l’altro gestendone il posizionamento:
− Allocazione lineare: posiziona linearmente un blocco di celle consecutive, questo processo
genera però frammentazione, ovvero la creazione di piccoli spazi vuoti non utilizzabili
da processi in blocchi di grandi dimensioni (dovrebbero essere divisi in parti più piccole,
oppure bisognerebbe spostare interi programmi per unire lo spazio).
− Paginazione: suddivido la RAM in piccoli blocchetti, chiamati pagine, e può allocare i
programmi in diverse pagine per ridurre il problema della frammentazione.
5. Gestione della memoria secondaria → Permette di utilizzare la memoria secondaria qualora la
memoria principale non sia sufficiente per mantenere i processi attivi (memoria virtuale), in
breve, viene simulata più memoria primaria spostando programmi che non devono essere
utilizzati in una memoria virtuale con un conseguente aumento dei tempi di lavoro.
6. Gestione dei dispositivi di input / output
7. Interazione con l’utente —> interfaccia per vedere programmi in esecuzione e RAM utilizzata
Aggiungi file sistem ed interfaccia utente
Programmi di utilità
Software liberi
Le reti di Calcolatori
→
→
→
Il
→
→
Logica Matematica
Fogli di calcolo