Sei sulla pagina 1di 40

Cap.

1 La rappresentazione dell’informatica e il problema della codifica


In informatica è importante definire il concetto di informazione e rappresentazione.
Informazione -> è qualcosa che viene comunicato in una qualsiasi forma scritta o
orale. L’informazione è il messaggio, ma affinché un messaggio possa essere
interpretato, mittente e destinatario, devono aver concordato un insieme di regole
con le quali scrivere. Perché persone e macchine possano utilizzare l’informazione
hanno bisogno che questa sia rappresentata. Leggere ed elaborare informazioni
implica che chi lo fa abbia concordato un codice. Esistono due modalità di
rappresentazione, nella prima le proprietà del fenomeno rappresentato sono
omomorfe alla forma della rappresentazione. Essa viene detta analogica perché la
rappresentazione varia in analogia con la grandezza reale. In tale rappresentazione
la grandezza è rappresentata in modo continuo. La seconda modalità è discreta nel
senso che utilizza un insieme finito di rappresentazioni che vengono messe in
relazione con alcuni elementi dell’universo rappresentato ed è un’approssimazione
di quella analogica. La codifica è l’insieme di convenzioni e regole da adottare per
trasformare un’informazione in una rappresentazione e viceversa. Un codice è un
sistema di simboli che permette la rappresentazione dell’informazione ed è definito
da:
- simboli
- alfabeto
- parole codice o stringhe che rappresentano le sequenze possibili
- linguaggio
Se le parole codice risultano tutte della stessa lunghezza allora si para di codifica a
lunghezza fissa, altrimenti di codifica a lunghezza variabile. I calcolatori adottano
codifiche a lunghezza fissata e definita.
Nei casi di lunghezza fissa
𝑛𝑙 ≥ 𝑘

𝑙 ≥ log 𝑛𝑘

La rappresentazione digitale
La rappresentazione binaria digitale è basata su un alfabeto costituito da due
simboli 0 e 1. Tali simboli rappresentano le unità minime di rappresentazione e
memorizzazione digitale denominate BIT. La rappresentazione digitale semplifica
la memorizzazione delle informazioni e rende i sistemi digitali meno soggetti ai
disturbi elettrici. In generale esistono tanti fenomeni diversi che possono essere
facilmente associati a un bit:
- La presenza o assenza di tensione elettrica in un circuito elettrico
- La polarità positiva e negativa di un magnete
- La presenza di un buco su un supporto ottico
- L’apertura o chiusura di una conduttura
- La condizione di acceso o spento di un interruttore
Nei sistemi di numerazione basati su numeri a precisione finita si introduce il
concetto di periodicità per cui valori non compresi nell’intervallo di definizione
vengono fatti ricadere in esso. In tali sistemi di calcolo ci possono essere degli errori,
si dice condizione di overflow quella che si verifica quando il risultato
dell’operazione è minore o è maggiore dei valori min e max dell’intervallo. Anche
l’algebra dei numeri a precisione finita è diversa da quella convenzionale in quanto
proprietà del tipo, associativa e distributiva, non sempre vengono rispettate in base
all’ordine con cui le operazioni vengono eseguite.
Il sistema binario consente di rappresentare i numeri mediante la compilazione di
due soli simboli ovvero di codificare i numeri direttamente in bit. Nel byte il bit più a
destra è quello meno significativo mentre quello a sinistra è quello più significativo.
I sistemi di numerazione vengono di solito classificati in sistemi posizionali e non
posizionali. Nei primi ogni cifra della sequenza ha un'importanza variabile a seconda
della relativa posizione, nei secondi ogni cifra della sequenza esprime una quantità
non dipendente dalla propria posizione. In informatica per evitare di dover trattare
con stringhe di bit troppo lunghe sono stati introdotti il sistema ottale e quello
esadecimale. La conversione avviene raggruppando le cifre binarie in gruppi di tre a
partire dalla posizione di peso minore. La conversione opposta avviene in modo
opposto: ogni cifra ottale viene esplosa nelle tre cifre binarie che la rappresentano.
La rappresentazione esadecimale è ancora più compatta il processo di conversione
è equivalente a quello binario ma le cifre binarie devono essere raggruppate in
gruppi di quattro.
Conversione da binario con virgola fissa a decimale
Trasformare in decimale il numero binario in virgola fissa: 110,101
Per la parte intera del numero si lavora come d’abitudine per i numeri binari interi,
ovvero moltiplicando ogni cifra per la rispettiva potenza di due data dalla sua
posizione (la cifra più vicina alla virgola va moltiplicata per 2^0, la successiva per 2^1
e così via) e sommando tutto.
parte intera in binario 110 -> 6 in decimale perché:
prima cifra: 0 * 2^0 = 0 * 0 = 0
seconda cifra: 1 * 2^1 = 1 * 2 = 2
terza cifra: 1 * 2^2 = 2 * 2 = 4
somma dei valori parte intera: 0 + 2 + 4 = 6
Per la parte dopo la virgola si lavora in modo del tutto analogo alla parte intera: si
moltiplica ogni cifra per la rispettiva potenza di due data con esponente pari alla sua
posizione e poi di somma tutto; l’esponente della potenza di due che moltiplicherà
la cifra più vicina alla virgola sarà -1, l’esponente di quella successiva -2 e così via.
parte dopo la virgola in binario 0,101 -> in decimale 0,625 perché:
prima cifra: 1 * 2^ (-1) = 1 * 0,5 = 0,5
seconda cifra: 0 * 2^ (-2) = 0 * 0,25 = 0
terza cifra: 1 * 2^ (-3) = 1 * 0,125 = 0,125
somma dei valori: 0,5 + 0 + 0,125 = 0,625
La rappresentazione del numero in decimale sarà data dalla somma della parte
intera a quella dopo la virgola.
numero complessivo
parte intera + parte dopo la virgola:
6 + 0,625 = 6,625
Conversione da decimale con virgola a binario
Come si passa da un numero decimale con la virgola a un numero binario con la
virgola
Trasformiamo 7,625 in binario
La parte intera si trasforma in binario come d’abitudine per i numeri interi.
decimale: 7 -> binario: 111
Per la parte dopo la virgola si procede ripetendo il seguente procedimento fino a
che si è rappresentata completamente la parte dopo la virgola o si sono ottenute il
numero di cifre dopo la virgola cercate.
Il procedimento consiste in questo:
– si prende il numero senza parte intera e lo si moltiplica per due, la parte intera del
risultato sarà la prima cifra dopo la virgola
0,625 * 2 = 1,250 <- 1 sarà la prima cifra dopo la virgola
– si ripete il procedimento con il risultato della moltiplicazione del passaggio
precedente.
0,25 * 2 = 0,5 <- 0 sarà la seconda cifra dopo la virgola
– bisogna fermarsi quando: o il risultato della moltiplicazione è 1 o 0 (in quel caso si
è scritto esattamente il numero da rappresentare) o ci si può fermare al numero di
cifre dopo la virgola voluto, quando si lavora al computer di norma c’è un numero
massimo di cifre memorizzabili (in questo caso il numero rappresentato non sarà
esattamente il numero da rappresentare ma una sua approssimazione).
0,5 * 2 = 1 <- 1 sarà la terza cifra dopo la virgola
0 * 2 = 0 <- dalla quarta cifra in poi ci sono solo zeri che sono omettibili
il risultato sarà poi dato dalla parte intera e dalla parte dopo la virgola quindi:
111,101 è il valore in binario del decimale 7,625
La rappresentazione dei numeri relativi
Per i numeri interi relativi ovvero tutti i numeri interi positivi e negativi incluso zero
si possono utilizzare diverse tipologie di rappresentazione, per segno e modulo,
complemento a uno, complemento a due e per eccesso. Per segno e modulo si può
utilizzare ad esempio lo 0 come segno positivo e 1 come segno negativo.
Complemento a due
SE NUMERO POSITIVO:
1) TRASFORMO IL NUMERO IN BINARIO
2) AGGIUNGO EVENTUALI ZERI DAVANTI AL NUMERO PER ARRIVARE AL
NUMERO DI BIT PER LA RAPPRESENTAZIONE IN COMPLEMENTO A DUE
Esempio: 14 con 8 bit
1) -15=1110
2) 1110 aggiungo 4 zeri davanti per arrivare a 8 bit=00001110
SE NUMERO NEGATIVO:
1) TRASFORMO IL NUMERO SENZA SEGNO IN BINARIO
2) AGGIUNGO EVENTUALI ZERI DAVANTI AL NUMERO PER ARRIVARE AL
NUMERO DI BIT PER LA RAPPRESENTAZIONE IN COMPLEMENTO A DUE
3) INVERTO I BIT (al posto di 0 metto 1 e viceversa)
4) SOMMO 1 (attenzione ad eventuali riporti nella somma)
Esempio: -14 con 8 bit
1) 14=1110
2) 1110 aggiungo 4 zeri davanti per arrivare a 8 bit=00001110
3) inverto i bit quindi 11110001
4) sommo 1 quindi 11110001+1= 11110010
Complemento a uno
Si scambiano 1 con 0 e viceversa
Per eccesso
In tale rappresentazione, il numero binario sarà associato allo zero, mentre i valori
minori a tale numero saranno i numeri negativi e quelli maggiori a quelli positivi. Nel
caso di l=8 i numeri appartenenti a (-127;+127) sono mappati nell’intervallo (0,255)
(con i numeri da 0 a 127 considerati negativi, il valore 128 vale 0, e quelli maggiori a
128 sono i positivi)
La rappresentazione dei numeri reali
Un numero reale viene rappresentato in binario attraverso una notazione scientifica
con m numero frazionario detto mantissa e la base b un numero naturale prefissato
ed e numero intero chiamato esponente. L'esponente determina l'ampiezza
dell'intervallo di valori preso in considerazione mentre il numero di cifre della
mantissa determina la precisione del numero. I valori rappresentabili in binario
appartengono invece a un sottoinsieme che contiene un numero finito di valori reali
ognuno dei quali rappresenta un intervallo del continuo. La sostituzione di un
numero reale x con il valore X rappresentante l'intervallo a cui x appartiene pone
notevoli problemi di approssimazione. Per valutare gli effetti delle approssimazioni
e gli errori che ne possono derivare è nata la disciplina chiamata calcolo numerico.
In concreto i numeri reali rappresentabili in binario godono della seguente
proprietà.
|𝑥 − 𝑋|
<𝜀
|𝑥 𝑖+1 − 𝑋𝑖|
Dove 𝜀 rappresenta l’errore e X=X se si approssima con difetto, X=X 𝑖+1 se si
approssima per eccesso.
L'insieme dei numeri reali è costituito da infiniti valori ma i numeri reali
rappresentabili sono definiti in un insieme limitato con estremi predefiniti minreal e
maxreal. Si definiscono nel caso dei numeri reali:
-l’overflow come la condizione si verifica quando i valori sono più piccoli di minreal o
più grandi di maxreal
-underflow come la condizione che si verifica quando un valore per effetto delle
approssimazioni viene confuso con lo zero.
La rappresentazione binaria dei numeri reali nota anche come rappresentazione in
virgola mobile, fissata la base consente di esprimere lo stesso valore con infinite
coppie (48.5=4.85 x 10=0.485 x 102 ). Nei numeri decimali possiamo considerare
come normalizzata la rappresentazione in cui la parte intera è formata da una sola
cifra. Per i numeri minori di uno finché la cifra più a sinistra è uno zero, si traslano
verso sinistra le cifre diverse da zero decrementando l'esponente di tante cifre
quante sono le posizioni scalate ad esempio 0.0025x100=0.2500x 10−2 . La mantissa
scalata è detta normalizzata e il numero in virgola mobile, il nome di un numero
normalizzato. Per i numeri maggiori di uno la normalizzazione avviene
semplicemente spostando la virgola a sinistra e sommando l’esponente di tante
cifre quante sono le posizioni scalate finché il numero non diventa minore di 1. La
forma normalizzata della mantissa obbliga che la sua prima cifra sia diversa da zero
e che la mantissa sia sempre un numero frazionario minore di uno. Con la
rappresentazione in virgola mobile le operazioni possono generare errori di
approssimazione. Il grande vantaggio della rappresentazione in virgola mobile è che
se si conviene che le mantisse siano trasformate in valori minori di uno con
operazioni interne, un numero reale può essere rappresentato nella memoria di un
calcolatore con numero intero indicativo della mantissa e con un altro numero
intero per l'esponente. Nel 1980 i principali costruttori di elaboratori elettronici
producevano calcolatori che utilizzavano i numeri reali, ognuno con un proprio
formato numerico e con proprie convenzioni di calcolo. Nel 1985 divenne operativo
lo standard LEEE 754 per i numeri in virgola mobile, e i maggiori costruttori
adottarono questo standard per i loro processori matematici. Tale standard
definisce principalmente tre formati numerici a virgola mobile:
-singola precisione 32 bit
-doppia precisione 64 bit
-precisione estesa 80 bit
L’algebra di boole
L'algebra di Boole consente di descrivere in forma algebrica le funzioni dei circuiti
componenti e delle reti fornendo i metodi per la realizzazione del progetto logico.
Con l'impiego di tale algebra il progetto di un'apparecchiatura numerica viene
condotto secondo una metodologia puramente matematica che fornisce
indicazioni non solo sul comportamento della rete, ma anche sulla struttura e
soprattutto sui collegamenti da realizzare fra gli n-poli elementari per ottenere
dalla rete un'elaborazione dei segnali. L’algebra di boole consente di stabilire una
corrispondenza fra espressioni algebriche e i circuiti di un calcolatore; le prime
descrivono le elaborazioni effettuate dalle seconde nonché la loro organizzazione in
termini di schemi, viceversa da una rete si trae l’espressione algebrica che la
descrive. L'algebra di Boole si sviluppa partendo alla definizione di insieme di
supporto X, detto anche sostegno, su cui sono definiti gli operatori binari che
associano a coppie di elementi X un elemento dello stesso insieme. Gli operatori
definiti nell'algebra di Boole sono due:
 l'operatore somma +
 l'operatore prodotto x
Valgono le seguenti proprietà:
I commutativa: della somma e del prodotto
II distributiva: della somma e del prodotto
III dell'esistenza dell'elemento neutro (somma 0, prodotto 1)
IV del complemento per cui per ogni elemento X del sostegno deve esistere e deve
essere unico l’elemento X’ detto complemento di X tale che X+X’=1 / XxX’=0
In più con queste si possono dimostrare ulteriori proprietà quali
V associativa: della somma e del prodotto
VI impotenza: per somma X+X=X, per il prodotto XxX=X
VII assorbimento: della somma X+(XxY)=X, del prodotto Xx(X+Y)=X
VIII del minimo e del massimo: per il minimo Xx0=0, per il massimo X+1=1
Una sestupla di elementi per cui valgono la proprietà I, V, VI, VII è detta reticolo una
proprietà del reticolo è che risulta possibile introdurre in esso una relazione d'ordine
che gode della proprietà riflessiva asimmetrica e transitiva. Un reticolo che gode
delle rimanenti proprietà è detto algebra di Boole. Tutti gli assiomi di un’algebra di
Boole sono caratterizzati dal principio di dualità che recita ‘’da una qualsiasi identità
booleana se ne ricava un'altra sostituendo l'operatore di somma con quello
prodotto e l'elemento zero con uno e viceversa’’. Inoltre nell’algebra di Boole
valgono le relazioni di de Morgan secondo cui: il complemento di una somma è
uguale al prodotto dei complimenti dei termini, e il complemento di un prodotto è
uguale alla somma dei complementi dei fattori. Se si definiscono le costanti
booleane come gli elementi appartenenti all'insieme x di sostegno, e le variabili
booleane, variabili a cui possono essere associati insiemi di costante booleane,
allora si possono costruire espressioni booleane con gli operatori di
complementazione somma e prodotto del tipo:
𝑎 𝑥 𝑏 + (~𝑏 + 𝑐 𝑥 𝑎)

In assenza di parentesi si stabilisce che:


-si eseguono per prima le complementazioni successivamente i prodotti e infine le
somme.
L'algebra binaria viene utilizzata per l'analisi e per la progettazione di circuiti per
realizzare qualsiasi operazione sui dati in ingresso a un elaboratore. Essa viene
definita attraverso un insieme di sostegno costituito da due valori zero e uno detti
bit e gli operatori di somma logica AND prodotto logico OR e di negazione NOT che
corrispondono ad altrettanti tipi di porte logiche che lavorano in bit per bit.
Per la somma si usa il simbolo +
A or B è espresso come A + B
Per il prodotto si usa il puntino
A and B è espresso come AB
Per la negazione si soprasegna la varabile
notA è espresso come A.
Nell’algebra binaria si definisce funzione booleana la corrispondenza che associa a
ogni combinazione di valori delle n variabili indipendenti un valore booleano della
variabile dipendente. Per ognuna delle variabili può assumere solo due valori, i
valori sono espressi nelle tavole di verità. Dalle tavole si nota che
-l’OR tra due variabili assume valore zero se quando entrambe le variabili sono pari
a zero e 1 negli altri tre casi
-l’AND assume valore 1 se entrambe le variabili sono pari a uno e zero negli altri casi
-il NOT si applica a una sola variabile è uguale a 1 se la variabile è zero, vale zero se
la variabile è 1.
In più grazie alle relazioni di Morgan sappiamo che una porta and può essere
ottenuta da una porta or e una not e una porta or si può ottenere da una porta and e
una not.
NOTE AGGIUNTIVE
I componenti elettronici che formano un computer possono essere sintetizzati in
due categorie principali:
◗ porte logiche;
◗ generatori di segnali.
Porte logiche: Sono dei circuiti elettronici elementari in grado di svolgere le
operazioni logiche dell’algebra booleana basata sui valori logici VERO o FALSO
(TRUE or FALSE). TRUE o FALSE corrispondono al passaggio o al non passaggio di
corrente elettrica in tali circuiti e quindi livelli logici binari 0 e 1. Le tre porte
principali sono AND, OR e NOT.
I generatori di segnali sono componenti in grado di produrre un segnale periodico
utile a sincronizzare gli elementi hardware presenti nei computer.
CODIFICA DELLE IMMAGINI
Le immagini sono informazioni continue in tre dimensioni, due spaziali e una
colorimetrica, e per codificarle occorre operare tre discretizzazioni. Le due
discretizzazioni spaziali riducono l'immagine a una matrice di punti detti pixel,
mentre la terza limita l'insieme di colori che ogni pixel può assumere a un
sottoinsieme definito. L'immagine digitale è quindi uria matrice bidimensionale di
numeri. Una immagine digitale può essere generata:
-mediante acquisizione da immagini analogiche con dispositivi detti scanner;
-da scene del mondo reale catturate con camere digitali;
-da applicazioni di grafica.
Le immagini digitali riproducono la scena dividendola in una griglia fatta di aree di
cui viene misurata la luminosità o il colore. A ogni area viene fatto corrispondere un
pixel la cui forma si discosta dalla superficie ripresa. I pixel hanno la forma di un
ellisse con l'asse verticale più lungo rispetto a quello orizzontale. Il rapporto tra i due
assi viene detto rapporto di aspetto e serve per correggere eventuali deformazioni.
Il processo di campionamento applicato a una immagine consiste quindi nel far
corrispondere a ogni pixel una porzione dell'immagine reale. Più la dimensione dei
pixel è piccola, minore è l'approssimazione tra l'immagine digitale e quella reale.
Con il termine di risoluzione si indica il numero di pixel per pollice perché le
dimensioni di un'immagine larghezza e altezza sono misurate in pollici. Solitamente
la risoluzione orizzontale è uguale a quella verticale. A ogni pixel viene poi
assegnato un indirizzo che ne determina le coordinate verticali e orizzontali (bit
mapping). Un ogni pixel dell'immagine vengono associati i bit che misurano
caratteristiche di colore. Si parla di colori veri quando a un pixel corrispondono 24
bit per un totale di 16.7 mega colori diversi, con 48 bit oggi viene gestita l’alta
definizione. Due sono i metodi usati per formare il colore: la sintesi del colore
additiva e quella sottrattiva. Nel primo caso un colore può essere ottenuto
attraverso la miscelazione di gradazione dei tre colori primari: il rosso, il verde e il
blu. Per i colori su cui si basa viene detto modello RGB (da Red, Green, Blue). Se i
colori primari sono sommati alla loro massima potenza producono il bianco per
questo motivo il modello è di tipo additivo. Il secondo modello è detto invece CMY
perché usa i colori ciano (Cyan), magenta (Magenta) e giallo (Yellow). Esso si usa
soprattutto nei processi di stampa su carta perché si basa sulla capacità propria
dell'inchiostro di assorbire la luce. Quando la luce bianca colpisce gli inchiostri,
alcune lunghezze d'onda visibili vengono assorbite, mentre altre vengono riflesse e
quindi viste: per questo motivo il modello di formazione del colore si dice
sottrattivo. Anche se il nero può essere derivato direttamente dalla combinazione
di ciano, magenta e giallo nelle stampanti, per motivi pratici, si usa anche
l'inchiostro nero (Black) e prende il nome di CMYK. In entrambi i casi i bit associati a
pixel di una immagine esprimono la misura dei tre colori base. Per ridurre la
dimensione della rappresentazione si può utilizzare un sistema di codifica dei colori
tramite tavolozza di colori (detta anche palette). La tavolozza è una codifica dei
colori, con la profondità di 8 bit per pixel, che consente di scegliere 256 colori diversi
tra i milioni di colori esistenti. Consiste nell'utilizzare una tabella numerica in cui
sono codificati solo i colori effettivamente presenti nell'immagine: ciascun pixel
sarà codificato con un numero limitato di bit (da 4 a 8) che identifica la posizione in
tabella del colore da usare. I colori della la tavolozza cambia a seconda
dell'immagine e continua dal suo contenuto. Il formato di rappresentazione di
immagini per punti è detto bitmap o raster. Esso è usato per riprodurre fotografie,
dipinti e tutte le immagini per le quali non ha importanza l'individuazione degli
elementi riprodotti.
I formati di rappresentazione più diffusi sono:
- il TIFF (Tagged Image File Format) che permette di gestire le immagini in
varie modalità: bianco e nero, scala di grigio, colori RGB, colori CMYKI TIFF
prevede il sistema di compressione LZW, che non elimina alcuna
informazione né degrada la qualità dell'immagine
- il formato EPS (Encapsulated PostScript File), impiegato inizialmente per i
disegni vettoriali, si è poi diffuso come standard anche per le immagini raster
- JPEG (Joint Photographic Expert Group) è nato con lo scopo di
standardizzare diversi formati per immagini con compressione di qualità. La
sua caratteristica principale è quella di poter scegliere il livello di
compressione e di modulare secondo il rapporto tra la qualità dell'immagine e
la quantità di bit
- il GIF (Graphics Interchange Format) trova largo uso in Internet per la
rappresentazione degli elementi grafici come pulsanti, scritte, logo. Esso
permette inoltre di rendere lo sfondo degli oggetti trasparenti per integrarli
nelle pagine del web
- il PNG (Portable Netuork Graphics) è stato inventato per sostituirsi a GIF nella
trasmissione di immagini sulla rete.
- il BMP (Bitmap) è stato sviluppato per essere compatibile con tutte le
applicazioni del mondo Windows per immagini in b/n, in scala di grigi, in scala
di colore (RGB ma non in CMYK). Non prevede l'applicazione di metodi di
compressione per cui la quantità di bit resta consistente.
Quando le immagini hanno caratteristiche geometriche ben definite, come nel
disegno tecnico, è possibile adottare una tecnica più efficiente per codificare le
figure. Nel caso di progettazione architettonica, meccanica o elettronica, (CAD da
Computer Aided Design) il disegno da memorizzare può essere facilmente
scomposto in elementi base come una linea o un arco di circonferenza. Gli oggetti
geometrici che compongono il disegno, quali punti, rette, linee, curve, cerchi, ellissi,
rettangoli, vengono rappresentati secondo formule matematiche e parametri che li
descrivono. Tale tipo di rappresentazione si definisce vettoriale. In essa è presente
tutta l'informazione necessaria a riprodurre l'immagine, a partire dalle dimensioni
del dispositivo di visualizzazione. Un grande vantaggio delle immagini vettoriali
rispetto a quelle raster risiede nella minore quantità di bit usata per la loro
rappresentazione. Le immagini bitmap, invece, se ridimensionate rispetto alle
dimensioni originali di acquisizione, hanno la tendenza a perdere di risoluzione
risultando distorte o sfocate. Un ulteriore vantaggio della rappresentazione
vettoriale risiedere nel fatto che tutti gli oggetti che compaiono nella figura
mantengono la loro identità in termini di caratteristiche descrittive per cui sono
facilitate le operazioni di modifica dell'immagine.
Immagini in movimento o video
La sequenza continua di immagini della realtà viene discretizzata ottenendo una
serie di immagini (detti frame) che variano rapidamente, ma a intervalli stabiliti. Il
frame rate è il numero di frame mostrati per secondo (fps). Al cinema il frame-rate
è di 24 fps. l sistema televisivo europeo (PAL) ha un frame-rate di 25 fps mentre
quello americano (NTSC) ne prevede 30 fps. Per digitalizzare l'immagine in
movimento è necessario digitalizzare ogni singolo frame con la tecnica vista per le
bit-map. In questo modo la quantità di bit usati per la rappresentazione dipende
dalla risoluzione di ogni singola immagine, dalla sua profondità di colore e dalla
durata del video che fissa il numero di frame complessivi.
Lo standard MPEG (Moving Picture Experts Group), associa alla semplice codifica di
ciascuna immagine anche tecniche per il suono e, soprattutto, modalità di
compressione he sfruttano il fatto che la differenza tra un frame e il successivo è
minima. Invece di conservare le informazioni di ogni frame, vengono conservate
solo quelle essenziali a ricostruire la scena originaria e quelle che si modificano,
tralasciando le variazioni impercettibili.
La codifica del suono
Il suono è un segnale analogico funzione del tempo consistente in vibrazioni che
formano un'onda, la cui ampiezza misura l'altezza dell'onda e il periodo è la
distanza tra due onde. Anche il suono deve essere campionato e discretizzato per
poter essere digitalizzato. Se il campionamento è troppo rado e vengono usati
pochi bit per misurare ogni valore istantaneo, la qualità del suono degrada nel senso
che il suono riprodotto è diverso d quello originale. Nyquist ha dimostrato che per
ottenere il segnale iniziale senza perdite è necessario campionare con una elevata
frequenza di campionamento, pari ad almeno due volte la frequenza massima del
segnale stesso. La quantizzazione è un processo irreversibile che conduce a una
sicura perdita di informazioni; tanto più l'operazione è accurata tanto più la qualità
del suono è preservata riducendo al minimo quello che viene detto rumore di
quantizzazione. La quantità di bit usati per il suono dipende dal numero di bit usato
per la quantizzazione, chiamato anche profondità del suono, dalla frequenza di
campionamento e quindi dalla durata del suono.
Cap.2 Il modello di esecutore
L'algoritmo è la descrizione di un compito da portare a termine. Se si vuole usare un
computer bisogna non solo progettare preliminarmente un algoritmo ma anche
provvedere a comunicarglielo in modo che gli risulti comprensibile. L’esecuzione di
un algoritmo da parte di un esecutore si traduce in una successione di azioni che
vengono effettuate nel tempo. Si definisce processo il lavoro svolto eseguendo
l'algoritmo e processore il suo esecutore.
Modello di von neumann. La Central processing unit CPU coordina l'esecuzione
delle operazioni fondamentali di un calcolatore, la memoria contiene l'algoritmo
che descrive le operazioni da eseguire e i dati su cui l'algoritmo stesso opera e i
dispositivi input e output sono le interfacce della CPU. Queste unità fondamentali
formano l’hardware del computer ossia l'insieme di tutti i componenti elettronici
elettrici e meccanici che costituiscono un sistema di elaborazione. Il prototipo
proposto da von neumann era basato sul concetto di programma memorizzato
ossia la macchina immagazzinava nella propria memoria i dati su cui lavorare e le
istruzioni per il suo funzionamento. Le caratteristiche che un sistema di tale tipo
presenta e che ne hanno decretato la massima e rapida diffusione in molti campi
sono:
-uno schema di funzionamento semplice nelle sue linee generali
-la velocità e l'affidabilità nelle esecuzioni di algoritmi
-un'adeguata capacità di memoria
-un costo vantaggioso.
La velocità di esecuzione si aggira sui milioni di istruzioni svolte dalla CPU in un
secondo e per tale motivo come unità di misura della capacità elaborativa dei
computer è stato usato il mips ossia milioni di istruzioni per secondo. Per
memorizzazione delle informazioni si intende il compito della memoria di
conservare informazioni per la CPU. La memorizzazione può essere temporanea,
permanente o definitiva. Con capacità di memoria si fa riferimento al numero di
informazioni che possono essere gestite e tale numero varia in base alla memoria
che utilizziamo e questo numero si misura in byte.
In genere la memoria di un calcolatore può essere vista come un insieme di
contenitori fisici di informazioni dette anche locazioni o registri di dimensioni
fissate a cui si può far riferimento mediante la posizione occupata nell'insieme detta
indirizzo di memoria. La dimensione di un registro si misura in numero di bit. Le
componenti fondamentali di una memoria sono dispositivi capaci di assumere due
stati di funzionamento:
-nelle memorie di tipo elettronico sono circuiti detti flip flop con un valore di
tensione o uguale a 5 volt o a zero volt
-nelle memorie di tipo magnetico sono una sorta di calamite polarizzate o
positivamente o negativamente
-nelle memorie di tipo ottico sono superfici con o senza un buco in modo da
riflettere diversamente il raggio laser che la colpisce.
Le operazioni consentite su un registro sono di lettura e di scrittura. Con la prima si
preleva l'informazione contenuta nel registro senza distruggerlo, con la seconda si
inserisce l'informazione nel registro eliminando quella precedente. Il
funzionamento di un registro di memoria è:
-leggere informazioni a patto che vi siano state scritte
-la lettura non cancella quanto scritto
-la scrittura di nuove informazioni obbliga a cancellare quelli precedenti che
pertanto vengono perse.
La memoria è un sistema che assolve al compito di conservare il dato depositandolo
in un registro nel caso di operazioni di scrittura e di fornire il dato conservato in un
registro nel caso contrario di operazioni di lettura. Le due operazioni vengono
anche dette di store per la scrittura del dato e di load per la lettura. La CPU indica
preventivamente l'indirizzo della locazione di memoria interessata dall'operazione,
la memoria decodificata l'indirizzo abilitando solo il registro a esso corrispondente
affinché:
-per un'operazione di store copi il dato del buffer nel registro
-per operazioni di load copi il dato del registro nel buffer, dove il buffer può essere
visto come un'area di transito dei dati dalla CPU alla memoria e viceversa.
Le operazioni di load e store richiedono tempi di attuazione che dipendono dalle
tecnologie usate per la costruzione delle memorie e dalle modalità di accesso. Le
prestazioni di un componente di memoria vengono misurate in termini di tempi di
accesso e tali operazioni possono avere tempi di accesso differenti. Nel caso di load
il tempo di accesso misura il tempo che trascorre tra la selezione del registro di
memoria e la disponibilità del suo contenuto nel registro di buffer. Il tempo di
accesso nel caso dello store misura il tempo necessario alla selezione del tempo del
registro e al deposito del contenuto del registro di buffer in esso. Le memorie
devono mostrare tempi di accesso adeguati alla capacità della CPU. La selezione di
registro è detta casuale quando il tempo di accesso non dipende dalla posizione
RAM, sequenziale quando il tempo di accesso dipende dalla posizione come avviene
nei nastri magnetici.
Alcune memorie vengono realizzate in modo che sia possibile una sola scrittura di
informazioni. Tali memorie vengono dette a sola lettura o rom. L'uso di queste
memorie è necessario quando si desidera che alcune istruzioni o dati non siano mai
alterati o persi. Si è soliti distinguere le memorie in base alla capacità di conservare
le informazioni si dicono volatili le memorie che perdono informazioni in esse
registrate quando il sistema viene spento mentre permanenti gli altri tipi di
memorie. Sono volatili le memorie elettroniche mentre le permanenti quelli di tipo
magnetico ottico e tutti i tipi di rom. Lo schema iniziale di von neumann è stato nel
tempo modificato per affiancare alla memoria centrale delle unità di memoria
ausiliaria caratterizzate da un'elevata capacità e persistenza dette memorie di
massa. La differenza fondamentale fra la memoria centrale e quella di massa risiede
nel fatto che le informazioni contenute nella memoria centrale possono essere
direttamente prelevate la CPU, mentre quelle contenute nella memoria di massa
devono essere dapprima trasferite alla memoria centrale e poi elaborate; le
informazioni prodotte dalla CPU e viceversa devono essere depositate in memoria
centrale per poi essere conservate nelle memorie di massa. Le memorie di massa
hanno tempi di accesso maggiori, sono di natura magnetica e i maggiori tempi di
accesso si giustificano pensando alle diverse attivazioni di componenti
elettromeccanici necessari a portare i dispositivi di lettura e scrittura nelle posizioni
selezionate. Per ovviare alla differenza di velocità tra i due dispositivi si impiegano
tecniche che prevedono che la memoria centrale non solo contenga dati e istruzioni
ma anche aree di accumulo dei dati in transito verso i dispositivi esterni. Tali aree
vengono dette buffer. Un buffer di input ha il compito di accumulare i dati in
memoria ricevendoli da un dispositivo lento prima che la CPU provveda a elaborarli.
Così la CPU accumula tutti i dati prodotti buffer di uscita prima di abilitarne il
trasferimento. Solitamente le memorie di massa sono di tipo magnetico ottico in
alcuni casi elettroniche in modo da mantenere le informazioni in modo permanente
a differenza della RAM che sono solo di tipo elettronico e per lo più volatili. Negli
ultimi anni sono andate sempre più diffondendosi le memorie a stato solido o flash
memory come supporto di una memoria secondaria. Si fa riferimento a una
memoria di massa semiconduttori utilizzata per sostituire i dischi magnetici: un
sistema SSD permette di memorizzare in modo non volatile grandi quantità di dati.
La CPU contiene dispositivi elettronici in grado di acquisire, interpretare ed eseguire
il programma contenuto nella memoria centrale operando la trasformazione dei
dati. Il processore centrale è composto da tre parti fondamentali l'unità di controllo
CU, l'unità logico aritmetica ALU e un insieme di registri detti interni che variano da
processore a processore in funzione della sua architettura. L'unità di controllo è
l'organo preposto all’interpretazione delle singole istruzioni e all'attivazione di tutti
i meccanismi necessari al loro espletamento. In particolare la CU ha il compito di
prelevare ogni istruzione della memoria centrale, di decodificarla, di prelevare i dati
della memoria e infine eseguire l'istruzione. Al termine dell'esecuzione di una
istruzione la cu procede al prelievo dalla memoria della successiva istruzione
secondo un ordine ricevuto rigidamente sequenziale: ossia l’esecuzione di una
istruzione può avere inizio se solo se la precedente è stata portata a termine. Perché
l'intero sistema possa avere avvio la CU deve essere informata dell'indirizzo del
registro di memoria che contiene la prima istruzione da seguire. A partire da questa
operazione iniziale detta di boot la CU deve ininterrottamente eseguire l’algoritmo
detto ciclo del processore fino allo spegnimento del sistema. Le fasi del ciclo
vengono dette fasi di boot (operazione iniziale atta ad informare la cu dell’indirizzo
del registro di memoria che contiene la prima istruzione da eseguire), fetch
(un’istruzione viene prelevata dalla memoria centrale, decodificata e memorizzata
in un registro interno), operand assembly (i dati vengono prelevati dalla memoria)
ed execute (l’istruzione viene eseguita). Se la fase di execute prevede la
memorizzazione del risultato dell’elaborazione in memoria centrale, la
corrispondente sottofase di scrittura prende anche il nome di write back. L'unità
logico aritmetica esegue operazioni aritmetiche. L’esito dei suoi calcoli viene
segnalato da appositi bit in un registro chiamato condition code. Durante le sue
elaborazioni la cu può depositare informazioni nei suoi registri interni che sono più
facilmente individuabili e hanno tempi di accesso inferiori a quelli dei registri a
memoria centrale. Il numero e il tipo di tali registri varia a seconda dell’architettura
della cpu. Principali registri interni:
-instruction register IR: contiene l’istruzione prelevata dalla memoria e che la cu sta
eseguendo
-prossima istruzione PI: ricorda alla cu la posizione in memoria della successiva
istruzione da eseguire e dopo ogni prelievo di una istruzione della memoria, il suo
valore viene incrementato in maniera tale da puntare alla prossima istruzione
-accumulatore ACC: serve come deposito di dati da parte dell’ALU , può contenere
prima di un’operazione uno degli operandi, e al termine il risultato calcolato
-condition code CC: indica le condizioni che si verificano durante l’elaborazione,
quali risultato nullo, negativo e overflow
La CPU comunica con la memoria e tutti i dispositivi tramite canali detti bus. I bus
sono quelli che hanno due unità alla volta abilitandone una alla trasmissione e l'altra
alla ricezione: il trasferimento di informazioni avviene sotto il controllo della CPU. Il
termine bus indica il canale di comunicazione condiviso da più utilizzatori. A
seconda delle informazioni trasportate si distinguono in:
-data bus
-address bus
-command bus o control bus.
Il control bus serve alla cu per indicare ai dispositivi cosa devono fare. I tipici segnali
del control bus sono quelli di read e write usati dalla cu per indicare ai dispositivi se
devono leggere un dato dal data bus oppure scriverlo su di esso
Il data bus permette ai dati di fluire tra cpu e registro di memoria selezionato per
operazioni di store e load, la cu controlla il flusso di informazioni con il mondo
esterno abilitando il transito delle informazioni dalla memoria verso le risorse di
output e viceversa da quelle di input. Il funzionamento delle memorie di massa è
simile a quello di un dispositivo che opera sia in input che in output.
L’address bus serve alla cu per comunicare l’indirizzo del dispositivo interessato da
una operazione di lettura o scrittura. Anche i dispositivi di input/output sono
identificati da un indirizzo. Tutti i componenti del sistema devono essere in grado di
riconoscere sull’address bus il proprio indirizzo. Attraverso l’address la cu effettua a
selezione del dispositivo a cui sono rivolti i comandi e i dati
Regole per lo scambio di informazioni:
-la cpu è l’unico elemento che fornisce l’indirizzo all’address bus
-memorie e dispositivi di input e output devono ascoltare l’address bus per attivarsi
quando su di esso compare il proprio indirizzo identificativo
-la memoria si attiva quando viene riconosciuto l’indirizzo corrispondente ad uno
dei registri di cui essa è composta
-il dispositivo attivo deve interpretare i segnali del control bus per eseguire i
comandi della cu
-le memorie prelevano dati dal data bus o immettono dati in esso in funzione del
comandi impartito dalla cu
-i dispositivi di input possono solo immettere dati sul data bus
-i dispositivi di output possono solo prelevare dati dal data bus
Larghezza del canale di un bus
Bus seriale: è costituito da un solo filo e su di esso i bit transitano uno dietro l’altro
Bus parallelo: è costituito da n fili e su di esso transitano n bit alla volta
Importanza delle dimensioni dei bus
Capacità di indirizzamento della cpu:
-capacità di gestire la dimensione della memoria centrale e il numero di dispositivi
in input e output
-corrisponde al numero di bit dell’address bus
-con n bit un address bus consente di selezionare un registro tra 2alla n
Velocità di scambio delle informazioni tra dispositivi:
condizionata dalla dimensione del data bus
-con m fili possono viaggiare contemporaneamente m bit
Il clock
I componenti del modello di von neumann vengono coordinati dalla cu della cpu
secondo sequenze prestabilite che corrispondono alle sue diverse capacità. A ogni
operazione che la cu è in grado di svolgere corrispondono ben prefissate sequenze
di attivazione dei diversi dispositivi. Le attività di tutti i dispositivi non avvengono
casualmente ma sono sincronizzate da un orologio interno chiamato clock. Questo
è un segnale periodico fissato, in particolare è un’onda quadra caratterizzata da un
periodo e da una frequenza misurata in hertz. Alla frequenza del clock è legato il
numero di operazioni elementari che vengono eseguite nell’unità di tempo della cu.
Clock e prestazioni:
l’esecuzione di un’operazione può richiedere più cicli di clock per la complessità
delle operazioni e per la lentezza dei dispositivi collegati alla cpu
la memoria centrale è caratterizzata mediante moduli che hanno prestazioni
inferiori rispetto alla tecnologia utilizzata per costruire le cpu. Si realizzano quindi
dei bus che rallentano la trasmissione di un fattore 10 rispetto al clock.
Lo scopo del modello di Von Neumann è quello di eseguire comandi memorizzati
nella sua memoria centrale. I comandi prendono anche il nome di istruzioni non solo
perché istruiscono la CPU sul da farsi ma anche per effettuare una distinzione con i
dati che sono gli oggetti rappresentati in memoria centrale su cui si svolgono le
attività. L'insieme delle istruzioni prende il nome di programma. Tutti i programmi
sono formati da insiemi di istruzioni che la CU della CPU esegue. Le istruzioni sono
operazioni semplici quali:
 trasferimento di dati da un registro a un altro
 operazioni aritmetiche o logiche
 controllo delle condizioni riportate dal registro CC o deducibili dal confronto
di due dei registri.
L'esecuzione di un'istruzione da parte della CU consiste nell’inoltro di una sequenza
di abilitazioni dei dispositivi il cui effetto corrisponde all'operazione richiesta. Le
moderne CU sono realizzate in logica microprogrammata. A ogni istruzione
corrisponde una sequenza di microistruzioni la cui esecuzione provoca l’attivazione
dei segnali di controllo necessari all'esecuzione dell'istruzione di partenza. La
sequenza di microistruzioni ha il compito di generare tutte le abilitazioni necessarie
all'attuazione dell’istruzione. Un circuito interno alla CU provvede alla generazione
di indirizzi per individuare una dopo l'altra le microistruzioni che un decodificatore
trasforma in segnali di abilitazione.
L'insieme dei microprogrammi composti dalle microistruzioni memorizzate nella
memoria interna alla CU prende il nome di firmware. L'esecuzione di un qualsiasi
programma si traduce nel fare applicare la CPU su un compito specifico interagendo
con il mondo esterno tramite dispositivi di input e output. L'insieme di tutte le
applicazioni del computer e di tutti i programmi prende il nome di software.
Data la natura rigidamente sequenziale nel modello di von neumann non era
possibile sovrapporre i tempi delle operazioni di input e output, per ovviare a tali
limitazioni sono stati realizzati dei sistemi dedicati di input e output il cui compito
era scaricare la CPU della gestione di attività specifiche. I sistemi dedicati detti
anche processori di input e output possono lavorare anche contemporaneamente
alla CPU. Da soli però i processi non possono garantire la piena autonomia. Per
rendere indipendenti i processori sono stati architettati dei segnali detti di
interruzione. Con la presenza del segnale di interruzione la CPU può attivare un
processore periferico e disinteressarsi delle sue attività. Quando un processore
dedicato termina il suo compito avanza una richiesta di interruzione al processore
centrale e aspetta che gli venga rivolta attenzione. Le richieste di interruzione sono
diverse, tante quanti sono i processori dedicati e si verificano in momenti diversi in
modo non sincrono con il lavoro della CPU. Per consentire alla CU di accorgersi del
verificarsi di una interruzione il registro di condizione CC è stato dotato di un bit che
diventa uguale a uno quando arriva una interruzione. La CU controlla il bit al
termine dell'esecuzione di ogni istruzione. Se è uguale a zero procede normalmente
con il prelievo dell'istruzione successiva, in caso contrario comincia l'esecuzione di
un programma nel sistema operativo detto ISR che ha come compito primario di
capire la causa dell'interruzione ossia quale dispositivo ha avanzato la richiesta e
servirla. Per capire chi ha generato l'interruzione e lanciare la corretta ISR nei primi
dispositivi veniva effettuato un polling ovvero una richiesta diretta ai vari dispositivi
negli attuali calcolatori indirizzo di partenza dell’ISR può essere fornito dalla
periferica stessa sfruttando l’address bus.
Per ridurre i tempi di trasferimento della memoria centrale ai registri interni della
CPU viene replicata una porzione di memoria e posta tra la memoria e la CPU
stessa. Tale memoria viene chiamata cache e fa da buffer per il prelievo di
informazioni dalla memoria centrale. La CU procede nelle tre fasi del suo ciclo al
prelievo di istruzioni e operandi dalla cache. Quando la CU si accorge che il prelievo
non può avvenire, scatta un nuovo travaso dalla memoria centrale. Poiché la cache
è molto più veloce della memoria centrale il sistema ne guadagna
complessivamente in efficienza. Per il principio di località si osserva che se la CPU
sta eseguendo una data istruzione presente in memoria, vuol dire che con molta
probabilità le istruzioni da eseguire saranno ubicate nelle vicinanze di quella in
corso, ciò significa che se nella cache, oltre all’istruzione corrente, sono
memorizzate anche le istruzioni "vicine" in memoria insieme ai dati su cui operare
allora la probabilità che le informazioni non siano presenti in cache è bassa e la CPU
può lavorare più velocemente. Se la cache è interna alla CPU viene detta di primo
livello (L1);le cache di secondo livello (L2) sono invece esterne ed è un po' più lenta
di quelle di primo livello, ma sempre più veloci della memoria centrale.
In generale un programma è un insieme di istruzioni la cui descrizione dipende dalle
capacità di comprensione di un linguaggio da parte del componente che svolge le
funzioni di CPU.La CPU, come automa capace di interpretare un prefissato
linguaggio, esemplifica il comportamento di un qualsiasi esecutivo di programmi,
sia esso umano o macchina. Tra tutti i linguaggi di programmazione il linguaggio
macchina è quello direttamente interpretabile da una CPU reale. Dato il suo basso
potere espressivo è anche detto linguaggio di basso livello. L'insieme di istruzioni
che si possono descrivere operazioni che:
 spostano stringhe di bit da un registro all'altro di memoria;
 attivano l'ALU per effettuare la somma aritmetica, l'AND, l'OR tra coppie di
stringhe di bit, o la negazione (NOT) del contenuto dell'accumulatore;
 eseguono lo scorrimento o la rotazione a destra o a sinistra dei bit contenuti
nell'accumulatore;
 provvedono a interrogare i bit del registro di condizione (CC) per determinare
come procedere nell'esecuzione del programma;
 consentono di saltare a un qualsiasi punto del programma.
Tutte le istruzioni del programma devono essere allocate nei registri di memoria
prima che la CPU possa procedere alla loro interpretazione cd esecuzione. Lo
schema di allocazione deve essere definito dal programmatore rispettando un
principio fondamentale secondo cui deve sempre esistere una separazione netta tra
le porzioni di memoria occupate dai dati e quelle occupate dalle istruzioni.
L'allocazione in memoria di dati e programmi può essere statica o dinamica. Nel
primo caso l'allocazione avviene prima dell'inizio dell'esecuzione del programma;
nel secondo durante la sua esecuzione. Nel caso di allocazione dinamica di dati può
avvenire che alcuni dati vadano a essere allocati nell’area riservata alle istruzioni
cambiando il contenuto dei registri di memoria e cambiando di fatto la struttura del
programma. L'allocazione in memoria comporta un'associazione precisa tra
istruzioni e dati e registri. In un modello di memoria a voce a ogni istruzione o dato
corrisponde uno e un solo registro di memoria. Nelle memorie a byte istruzioni o
dati possono occupare più registri di memoria. Il riferimento a una istruzione o un
dato avviene specificando l'indirizzo di memoria occupato. L'indicazione di un
indirizzo di memoria contenente un dato si dirà puntatore a dato, il puntatore a
istruzione è invece un indirizzo di un registro di memoria nel quale è collocata una
istruzione. Si può allora definire una istruzione in linguaggio macchina come una
quadrupla: i= (Cop, Pdi,Pdor, Pis), in cui:
 Cop è il codice operativo indica alla CU della CPU l'operazione da compiere,
l'insieme dei Cop, prendere il nome di repertorio di istruzioni e dipende dalla
specifica CPU;
 Pdi sono i puntatori ai dati che servono per svolgere l'operazione Cop, detti
anche di input;
 Pdo sono i puntatori ai dati prodotti dall'operazione Cop detti anche di
output;
 Pis è il puntatore all'istruzione da svolgere al termine dell'esecuzione di quella
corrente.
Un programma è una sequenza di istruzioni da svolgere una dopo l'altra. Ogni
istruzione occupa un registro di memoria. Il puntatore Pis serve a legare tra loro i
registri di memoria.
La definizione della struttura dell'istruzione e dello schema di allocazione dei
programmi in memoria permette di dettagliare le fasi del ciclo del processore. La
fase fetch inizia con il prelievo dell'istruzione dalla memoria. Per farlo la CU
comunica alla memoria iI valore del puntatore a istruzione presente nel registro PI.
La risposta della memoria viene depositata nel registro IR così da consentire alla CU
di:
-interpretare il codice operativo dell'istruzione da eseguire;
-conoscere i puntatori ai dati di input e output;
-ricevere il puntatore all'istruzione da eseguire successivamente.
La fase fetch si conclude con l'aggiornamento del registro Pl. La fase operand
assembly serve alla CU per predisporre gli operandi che servono al codice operativo.
La fase execute consiste nel mettere in essere le azioni richieste con il codice
operativo presente nel registro di IR. Al termine dell'esecuzione di una istruzione la
CU riprende il suo cammino partendo dal contenuto del registro PI. Le istruzioni del
programma vengono una dopo l'altra in esecuzione dalla loro disposizione in
memoria.
Esistono appositi codici operativi di salto (jump o branch) i quali, di norma a
seconda del valore assunto dai bit del registro CC, hanno proprio il compito di
modificare il contenuto del registro Pl nella fase di esecuzione, consentendo così di
avere una sequenza di esecuzione delle istruzioni non necessariamente coincidente
con la sequenza statica. Affinché il ciclo del processore possa avere inizio si deve
predisporre in modo che il registro Pl contenga l'indirizzo del registro di memoria
contenente la prima istruzione da eseguire. La fase iniziale di boot ha solo il
compito di inizializzare il PI con tale valore. Una volta avviato, il ciclo del processore
non termina mai e quindi a ogni istruzione deve sempre seguirne un'altra da
eseguire successivamente. Dai programmi del sistema operativo si passa a un'altra
applicazione in un'alternanza che fa si che la CU possa procedere con il suo ciclo.
Ma perché tutto ciò proceda nel rispetto del modello di Von Neumann, deve
avvenire che in memoria siano sempre presenti i programmi e i dati del sistema
operativo mentre quelli delle applicazioni vengono caricati in memoria dal sistema
operativo su richiesta dell'utente prima che ne venga attivata la esecuzione. Nella
memoria di un elaboratore moderno si possono pertanto individuare in ogni istante
cinque aree distinte:
-l'insieme dei registri nei quali si trovano i programmi del sistema operativo
-quelli occupati dai dati del sistema operativo
-quelli nei quali si trovano le applicazioni di utente
-quelli con i dati dei programmi di utente
-l'insieme dei registri che servono come buffer per il trasferimento dati da e verso i
dispositivi di input e output.
L'architettura di Von Neumann viene detta di tipo SISD (Single Istruction
stream/Single Data stream) in quanto le istruzioni di un programma vengono
eseguite una dopo l'altra serialmente con l'unità di controllo che interpreta le
singole istruzioni generando comandi per tutti gli altri dispositivi, e con l'unità di
elaborazione che esegue le operazioni di tipo aritmetico o logico.
La disponibilità di registri come interni propri organi di memoria per compiti speciali
e/o per contenere per informazioni temporanee consente di ridurre i tempi di
esecuzione delle istruzioni. Il programma e i dati sono contenuti in memoria e una
singola istruzione viene eseguita mediante le seguenti fasi:
-lettura dalla memoria dell'istruzione da eseguire;
-determinazione dell'indirizzo della successiva istruzione da eseguire;
-determinazione del significato del codice operativo per individuare l'azione da
eseguire;
-eventuale determinazione degli indirizzi degli operandi;
-esecuzione delle sequenze di operazioni elementari richieste dalla istruzione.
Il processore è una macchina sequenziale capace di svolgere un'azione alla volta:
pertanto un'istruzione viene eseguita in passi successivi con azioni elementari
abilitate dal clock e il suo tempo di esecuzione dipende dalla frequenza del clock. I
microprocessori sono dispositivi elettronici in grado di contenere all'interno di un
unico circuito integrato le funzioni di un’intera CPU. Il microprocessore interagisce
con tutti gli altri dispositivi attraverso i collegamenti dei bus di dati (data bus), di
indirizzo (address bus) e di controlo (control bus). La dimensione del bus dati
esprime la capacità di elaborazione (parallelismo esterno) del processore, ossia la
quantità di bit che possono essere elaborati in parallelo. Il bus indirizzi esprime di
contro, la capacità di comunicare o di indirizzamento del processore, ossia il
numero di celle diverse a cui si può accedere.
In cosa si differenziano i microprocessori:
-parallelismo esterno numero di bit trasferiti o prelevati in un singolo accesso in
memoria
-capacità di indirizzamento legata alla dimensione in bit dell’address bus
-numero, tipo e parallelismo dei registri interni
-tecniche di indirizzamento, intese come le modalità con le quali calcolare il valore
effettivo di un operando, ovvero costruire l'indirizzo logico con il quale prelevare o
salvare il valore dell’operando di una istruzione
-gestione delle periferiche di input e output
-repertorio delle istruzioni, inteso come numero e tipo di istruzioni costituenti il suo
linguaggio macchina
-tempi necessari all'esecuzione di alcune istruzioni fondamentali come l'addizione
da utilizzare per la valutazione del MIPS con il quale effettuare confronti sulle
prestazioni.
L'insieme minimo di registri interni che sicuramente é presente in qualsiasi
microprocessore moderno è formato da:
-Prossima Istruzione (PI) che nella fase fetch cambia il proprio contenuto passando
da puntatore in memoria all'istruzione da prelevare all'inizio della fase, a puntatore
all'istruzione successiva da eseguire al termine della stessa;
-Accumulatore (ACC): utile a conservare dati temporanei o necessario per le
operazioni logiche e aritmetiche dell'ALU;
-Conditin Code (CO: che riporta lo stato dell'elaborazione indicato dai diversi bit di
cui si compone:
bit segno indica con 1 la presenza in ACC di un valore negativo, 0 il caso opposto
bit zero indica con 1 la presenza in ACC di un valore uguale a 0, con 0 il caso
contrario
bit overflow indica con 1 la presenza in ACC di un valore non corretto
bit riporto indica con 1 la presenza in ACC di un risultato che ha generato un
ulteriore bit con 0 il caso opposto
bit interruzione indica con 1 che il sistema delle interruzioni ha generato una
richiesta di attenzione con 0 il caso opposto
-Registro Indice (X): con il quale poter calcolare l'indirizzo dell'operando con quella
che è nota come tecnica di indirizzamento relativa
-Stack Pointer (SP): utile alla gestione del salti a sottoprogramma per il suo modo di
gestire gli indirizzi di memoria
L'accumulatore si interfaccia direttamente con il data bus presentando la stessa
dimensione in numero di bit. A tali registri fondamentali si è soliti aggiungere tre
ulteriori registri:
-Instruction Register (R): contenente al termine della fase fetch l'istruzione
prelevata dalla memoria centrale completa di tutte le sue parti
-Data buffer (DB): interfaccia con il data bus del quale rappresenta lo stato
-Address buffer (AB):interfaccia con 'address bus del quale rappresenta lo stato.
Questi tre registri vengono introdotti per schematizzare il comportamento della
CPU nella sua interazione con la memoria centrale.
Nella costruzione dell'indirizzo di un operando di una istruzione le tecniche di
indirizzamento più diffuse sono:
-indirizzamento immediato che indica che il valore è già contenuto nell'istruzione;
-indirizzamento diretto con il quale viene riportato nell'istruzione l'indirizzo del
registro di memoria che contiene il valore o nel quale depositare il valore;
-indirizzamento indiretto che riporta nell'istruzione l'indirizzo del registro di
memoria al cui interno è specificato l'indirizzo del registro dal quale prelevare un
valore o nel quale depositare un valore;
-indirizzamento relativo con il quale l'indirizzo del registro di memoria che contiene
il valore o nel quale depositare il valore è specificato nel registro interno del
processore detto indice.
Le diverse tecniche di indirizzamento vengono indicate nell'istruzione. Nella
gestione delle modalità di input e output (IO) i microprocessori si dividono in quelli
che utilizzano la tecnica memory-mapped e in quelli che invece adottano l’I/O-
mapped.
Con la tecnica memory mapped la CU usa le stesse istruzioni, utilizzate per leggere
e scrivere in memoria, anche per accedere ai dispositivi di I/O. I dispositivi di I/O
controllano il bus indirizzi e rispondono solo quando riconoscono un indirizzo a loro
assegnato. Con l'I/O-mapped vengono invece usate istruzioni specifiche per
l'esecuzione dell'input/output. I dispositivi di I/O hanno uno spazio indirizzi
separato da quello della memoria, e un segnale del bus di controllo serve alla CU per
specificare se si tratta di un accesso alla memoria o un dispositivo periferico. ll
vantaggio dell'uso del memory-mapped è che, non richiedendo da una parte
hardware aggiuntivo per la gestione della periferia e dall'altra un insieme di
istruzioni specifiche, consentire la realizzazione di CPU con una complessità
inferiore. Il repertorio delle istruzioni ha indirizzato i costruttori di microprocessori
verso due distinte tecnologie CISC (Complex Instruction Set Computer) e RISC
(Reduced Instruction Set Computer). I processori CISC sono quelli nei quali il
crescere delle potenzialità è stato accompagnato da un aumento delle operazioni
che sono capaci di svolgere, inserendo nel linguaggio macchina istruzioni con
potenza espressiva prossima a quella dei linguaggi di programmazione di alto
livello. La caratteristica di un microprocessore RISC è quella di possedere invece un
repertorio costituito da un ridotto ed essenziale insieme a istruzioni al fine di
ottenere processori più veloci.
SISTEMI OPERATIVI
Il sistema operativo è l’insieme dei programmi che implementano le funzioni
essenziali per la gestione di un sistema di elaborazione e si pone tra utente e
macchina in modo che l’utente possa usarlo. Attualmente il sistema operativo
consente di semplificare molteplici operazioni all’essere umano. Come funziona il
sistema operativo? Mediante una macchina estesa che si pone tra hardware e gli
utilizzatori finali fornendo a questi un’interfaccia gradevole ed amichevole e
quest’ultima è una sua componente. La prima cosa che fa il sistema operativo è la
gestione delle risorse della macchina ovvero hardware e software. Il sistema
operativo deve far virtualizzare la macchina. La “virtualizzazione” delle risorse
presenta ai suoi utenti una macchina astratta caratterizzata dalle sue capacità e non
dalla sua struttura. Il sistema operativo serve ad offrire un ambiente di lavoro
amichevole, assegna a programmi e utenti le risorse hardware e software disponibili
ottimizzandone l’utilizzo, controlla l’esecuzione dei programmi e fa si che qualsiasi
utente riesca ad avere le risorse necessarie. Esso si occupa anche della gestione
delle applicazioni:
-Le applicazioni utente possono “prendere vita” soltanto all’interno dell’ambiente
generato dal sistema operativo
-Il sistema operativo ha il compito di controllare e coordinare l’utilizzo dell’hardware
per conto di utenti ed applicazioni
-Tali funzioni devono essere svolte dai programmi del sistema operativo con la
massima efficienza possibile. L’efficienza è la capacità del sistema nel soddisfare al
meglio le esigenze degli utilizzatori.
Efficienza
Caratteristiche di un sistema operativo efficiente:
-Rendere massimo il lavoro compiuto dal calcolatore (throughput)
-Limitare il tempo che intercorre tra l’introduzione dei dati di ingresso e la
presentazione dei risultati dell’elaborazione (turnaround time)
Tali caratteristiche sono in contrasto tra loro
-Bassi tempi di turnaround prevedono un uso esclusivo delle risorse di un sistema da
parte dei singoli programmi
-Un alto throughput può essere raggiunto eseguendo altri programmi mentre il
primo è fermo in attesa di operazioni di I/O
La velocità dei processi elaborativi
In un sistema di calcolo basato sul modello di Von Neumann, i processi elaborativi
vengono eseguiti con velocità diverse.
Esempio applicativo
input(dato1);
input(dato2);
somma = dato1 + dato2;
output(somma);
prodotto = dato1 * dato2;
output(prodotto);
possono essere individuati tre processi: input, calcolo e stampa. La cpu deve
eseguire le istruzioni di calcolo quelle di I/O dei dati con processi diversi che devono
essere sincronizzati. È possibile effettuare le operazioni solo quando i dati di
ingresso sono pronti. Ed è possibile effettuare una stampa solo quando i risultati
sono stati prodotti.
Sincronizzazione dei sistemi periferici: può essere effettuata attribuendo ad ogni
sistema di gestione della periferica un registro di stato. Un particolare bit indica se
la periferica ha completato l’ultima operazione.
Strategia di sincronizzazione: Questa strategia di sincronizzazione porta ad un uso
non intelligente della CPU. Nel caso di programmi con molte operazioni di I/O (I/O
bound), la CPU passa la gran parte del proprio tempo ad interrogare lo stato delle
periferiche.
I tempi complessivi di elaborazione sono dati dalla somma dei tempi necessari alla
terminazione dei singoli processi:
-Comprendono tempi che non dipendono dalle capacità della CPU
-Ad es., nel caso delle operazioni di input, tali tempi dipendono dalla tempestività
con la quale l’operatore inserisce i valori
Processori dedicati alle periferiche
Il lavoro del calcolatore viene bloccato nell’attesa che l’essere umano confermi e
inserisca l’informazione. Nella macchina di von neumann se non viene inserito il
dato non va avanti. Il modello di Von Neumann è stato nel tempo modificato
fornendo alle periferiche: un’autonomia di funzionamento e la capacità di segnalare
la terminazione delle proprie attività. Ogni periferica viene dotata di un processore
dedicato
-gestisce le operazioni di I/O liberando la CPU da tale compito
-opera in parallelo con la CPU e segnala che ha terminato il proprio compito
inviando una richiesta di interruzione

La CPU, dopo aver attivato il processore dedicato, può occuparsi di altro fino a che
non viene interrotta.
L’utilizzo di processori dedicati permette un miglioramento complessivo del
sistema (Questo perché vengono utilizzati i tempi morti dei canali, anche se il
turnaround time dei singoli programmi peggiora)
Overhead (o sovraccarico gestionale):
-Tempo di esecuzione e risorse concessi ai programmi del sistema operativo,
sottraendoli ad altri programmi in esecuzione
-È di norma tanto più grande quanto più complesso e sofisticato è il sistema
operativo
Confronto tra tempi di elaborazione
Chi gestisce tali tempi è il sistema operativo che adesso per ottimizzare
sovrappone i tempi.
Evoluzione storica dei sistemi operativi
Generazione 0
Assenza di sistemi operativi
Gli utilizzatori
-scrivono programmi direttamente in linguaggio macchina
-si fanno carico del caricamento in memoria e dell’avvio dei programmi
-eseguono la stampa dei risultati; in caso di terminazione anomala, eseguono il
dump (stampa) dei registi della memoria per esaminare la causa dell’errore
Il programma
-viene caricato singolarmente, usando schede perforate
-viene fatto eseguire fino al suo completamento, oppure fino a che, per qualche
motivo, non si ferma
La CPU
-rimane inattiva durante tutti i periodi relativi alla gestione delle operazioni di I/O e
tra l’esecuzione di un programma ed un altro
Generazione 1
Monitor e sistemi operativi batch
La General Motors produce il primo sistema operativo per il proprio calcolatore,
l’IBM 701
Il sistema operativo è una sorta di monitor che si occupa di
-caricare i programmi in memoria
-controllare l’esecuzione del programma
-azzerare (reset) la macchina tra un’esecuzione e l’altra di programmi
-limitare i tempi morti della CPU riducendo l’azione dell’uomo nell’esecuzione dei
programmi
I programmi sono fatti in modo da restituire il controllo, alla fine della propria
esecuzione, al sistema operativo
Un’ulteriore ottimizzazione è quella di raggruppare più programmi in un singolo
gruppo o lotto (batch)
-I programmi sono caricati tutti, prima dell’esecuzione, su una periferica più veloce
del lettore di schede
-Il caricamento viene fatto fuori linea da un apposito dispositivo
-Il controllo della esecuzione ed il passaggio da un programma all’altro avviene
utilizzando un apposito linguaggio di controllo Job Control Language (JCL)
Sono messi a disposizione dei programmatori delle primitive di I/O sui dispositivi
standard
-I programmatori sono svincolati dalla natura delle periferiche di I/O
Generazione 2
Sistemi operativi multiprogrammati
Introduzione della multiprogrammazione (o multitasking)
-Caricamento in memoria centrale di più programmi che condividono la CPU
Questa caratteristica è resa possibile grazie all’introduzione di due importanti
innovazioni:
Processori di I/O
-Processori più semplici della CPU, dotati di un insieme proprio di istruzioni e
registri, in grado di gestire la comunicazione con i dispositivi di I/O
Interruzioni
-Segnali generati dai controllori dei dispositivi di I/O in grado di interrompere il
normale ciclo di esecuzione della CPU
Le operazioni di I/O sono sovrapposte con quelle di calcolo
-Vengono eliminati i tempi morti della CPU dovuti all’attesa del completamento
delle operazioni di I/O
-Se la CPU sta eseguendo un programma che richiede un’operazione di I/O
il programma corrente viene sospeso
l’operazione di I/O è delegata al processore di I/O del dispositivo
-La CPU può eseguire un altro programma
un’interruzione segnala il termine dell’operazione di I/O e la ripresa del programma
precedentemente sospeso
Il sistema operativo è l’amministratore delle risorse del calcolatore
-I vari programmi che coesistono nella memoria centrale devono dividersi l’uso di
periferiche, memoria e CPU
Generazione 3
Sistemi operativi general purpose
Ottimizzazione della tecnica della multiprogrammazione:
-Caricamento in memoria dei programmi idonei all’esecuzione, mediante la tecnica
dello swapping. Ogni programma viene spostato dalla memoria di massa alla
memoria centrale solo quando serve
-Caricamento in memoria di specifiche parti di un programma. Quelle che con più
probabilità serviranno in un dato istante secondo il principio di località dei dati e
delle istruzioni
Il numero di programmi che è possibile caricare nella memoria centrale
contemporaneamente aumenta
-Grado di multiprogrammazione
Introduzione della memoria virtuale
-Viene estesa la capacità della memoria centrale con quella delle memorie di massa
-Con la divisione del programma in parti vengono portate in memoria solo quelle
che devono essere eseguite. Le restanti restano a disposizione sulla memoria di
massa
Swap out
-Le porzioni di programma sono trasferite in memoria di massa quando non
servono
Swap in
-Le porzioni di programma che devono essere eseguite sono prelevate dalla
memoria di massa
Generazione 4
Sistemi operativi time sharing
Sistemi multiutente o conversazionali/interattivi
-Più utilizzatori possono avere accesso diretto e contemporaneo a programmi e dati
durante l’esecuzione
Problema
-Programmi con molto calcolo interno (CPU bound) possono monopolizzare l’uso
della CPU, causando lunghi tempi di attesa per gli altri programmi
Soluzione
-Assegnazione di intervalli di tempo (time slice) della CPU ad ogni programma
-Terminato tale tempo il programma in esecuzione deve abbandonare la CPU
-Viene eseguito il programma successivo secondo prestabilite politiche di
schedulazione
Un programma potrebbe richiedere molte time slice prima di terminare
-Rispetto ai sistemi multiprogrammati non time sharing, il turnaround time
peggiora ma migliora il throughput complessivo
Generazione 5
Sistemi operativi per PC e transazionali
Architettura interna dei sistemi operativi pressoché invariata
-L’attenzione viene posta sulla progettazione di interfacce d’utilizzo user-friendly.
Facilitano l’uso dei primi Personal Computer agli utenti inesperti
-Le funzionalità sono rivolte alla tipologia di applicazioni per cui i sistemi operativi
sono progettati
Sistemi operativi transazionali
-Sistemi interattivi destinati ad eseguire transazioni. Sequenze di operazioni
elementari logicamente legate, dove l’utente interroga ed aggiorna archivi di dati
Generazione 6
Sistemi operativi real-time, per multiprocessori, distribuiti
Sistemi operativi real-time
-Gestiscono programmi che interagiscono con l’ambiente esterno attraverso
periferiche garantendo tempi di risposta utili per le applicazioni e l’ambiente
esterno stesso. Ad es., sistemi per il controllo di un reattore nucleare o dei radar
Sistemi operativi con supporto multiprocessore e distribuiti
-Gestiscono più processori e risorse multiple che non sono più localizzati su una
macchina, ma si trovano distribuiti sia fisicamente che logicamente. Supportano
l’evoluzione dell’hardware e la diffusione di internet
Generazione 7
Sistemi operativi per dispositivi mobili
Adeguamento delle caratteristiche dei sistemi operativi ai dispositivi mobili. Ad es.,
palmari e cellulari
In tali sistemi si prediligono caratteristiche come interfacce grafiche evolute e
risparmio energetico
Esempi sistemi operativi
In commercio esistono numerosi sistemi operativi differenti. Fino a qualche anno fa,
l’attitudine delle società di sistemi di elaborazione era quella di realizzare sistemi
operativi proprietari per i loro sistemi. La propensione attuale è quella di sviluppare
sistemi operativi portabili su piattaforme diverse.
UNIX
Sviluppato nel 1969 nei Bell Laboratories della AT&T:
-Ulteriori sviluppi da parte del mondo universitario
-Esistono differenti versioni di UNIX, ognuna con diverse caratteristiche a seconda
del produttore: BSD, System V, SunOS,…
Caratteristiche:
-Multiutente
-Multitasking con time sharing
-Portabile: Grazie all’impiego del linguaggio C
-Aperto
-A linea di comando
DOS (Disk Operating System)
Versione più famosa è MS-DOS, sviluppata dalla Microsoft nel 1981 per il PC IBM.
Progettato e sviluppato per lavorare con i microprocessori Intel 8086-8088.
Adottato da altri per PC IBM-compatibili
Caratteristiche:
-Monoutente
-Monotasking
-A linea di comando
OS/2
Sviluppato nel 1987 da Microsoft e IBM per le piattaforme basate sui processori Intel
e compatibili. Versione 3.1 del 1989 ultima ad essere sviluppata da IBM e Microsoft.
L’ultima versione prodotta da IBM nel 2002 è la 4.52

Caratteristiche:
-Multiutente
-Multitasking
-Supporta la modalità protetta
-Interfaccia grafica
Linux
Sviluppato nel 1991 dallo studente finlandese Linus Torvalds. Il suo nucleo è
utilizzato come base in diverse distribuzioni: Red Hat, Debian, Fedora, Mandrake,
Ubuntu,…
Caratteristiche
-Multiutente
-Multitasking
-Aperto
-Unix-like
-Interfaccia grafica
Windows
Famiglia di sistemi operativi prodotti dalla Microsoft
Nasce negli anni ’80 come ambiente operativo dei sistemi DOS. Si impone sul
mercato dalla versione 3.1
Caratteristiche:
-Multiutente
-Multitasking
-Multimedialità
-Grafica curata ed interazione intuitiva
-Versioni per PC, workstation, server, dispositivi mobili
Mac OS (Macintosh Operating System)
Sviluppato nel 1984 da Apple per computer Macintosh. Prima versione ideata per
processori CISC Motorola 68000. Adattato dopo il lancio nel 1994 di Power
Macintosh basati sui processori RISC PowerPC sviluppati da Apple, IBM e Motorola.
Completamente riscritto e basato su UNIX a partire dalla versione Mac OS X. Dal
2005 disponibili versioni per sistemi Apple basati su CPU Intel
Caratteristiche:
-Multiutente
-Multitasking
-Multimedialità
-Basato completamente su interfacce grafiche (GUI)
ARCHITETTURA SISTEMI OPERATIVI
Ogni livello del sistema operativo è una macchina virtuale, ovvero una macchina definita da ciò che è
capace di fare e non da com’è fatta. Solo l’hardware costituisce una macchina reale. Il sistema operativo ha
il principale obiettivo di virtualizzare le caratteristiche dell’hardware, offrendo all’utente la visione di una
macchina astratta più potente e più semplice da utilizzare di quella fisicamente disponibile.
Esistono dei livelli del sistema operativo:

 Nucleo o Kernel: gestione dei processi e della sincronizzazione tra i processi;


allocazione CPU ai processi tramite scheduler; gestione interruzioni
 Gestione della memoria: corrispondenza tra indirizzi fisici e logici dei
programmi; allocazione memoria ai programmi; swapping memoria di
massa; protezione delle aree di memoria
 Gestione delle periferiche: primitive delle operazioni di I/O sui dispositivi;
gestione parziale dei malfunzionamenti
 File system: gestione dell’organizzazione logica e fisica delle informazioni
nella memoria di massa ossia i file
 Interprete dei comandi: guscio “shell” attraverso cui l’utente e le applicazioni
interagiscono con il sistema operativo
 Programmi di utilità: programmi di sistema per il supporto allo sviluppo dei
programmi, ovvero editor di testi, database ecc.
Ogni macchina virtuale si avvale delle macchine sottostanti per poter funzionare.
Ogni processo dispone di:
 Macchina kernel: un proprio processore
 Macchina gestore della memoria: una propria CPU e una propria memoria
 Macchina gestore delle periferiche: una propria CPU una propria memoria e
un insieme di periferiche
 Macchina del quarto livello: file system
 Livelli successivi: la macchina rimane la stessa ma sono disponibili nuovi
servizi
I sistemi operativi sono costituiti da un insieme di moduli ciascuno dedicato a
svolgere una determinata funzione e interagiscono tra loro secondo regole precise.

Interfaccia utente

Gestione dell’I/O Gestore del file system

Gestore dei processi Gestore della memoria


LA STRUTTURA DEL SISTEMA OPERATIVO centrale

Gestione dei processi


Processo: un programma, o una sua parte, eseguita dalla CPU
In un sistema multiprogrammato: più processi risiedono in memoria e precedono
nella esecuzione. I processi vengono detti concorrenti:
-si contendono il possesso delle stesse risorse
-il sistema operativo deve risolvere le problematiche di cooperazione( forma di
interazione prevista e desiderata fra processi che hanno obiettivi comuni),
competizione ( forma di interazione tra i processi, prevedibile ma non desiderata
poiché ne rallenta l’esecuzione) e interferenza ( interazioni tra processi che la natura
del problema non mostra in modo esplicito)
Descrittore del processo:
-area dati associata al processo ma non accessibile al processo, è un insieme di
campi contenente: nome del processo, stato del processo, insieme dei valori dei
registri del processore nel momento in cui quest’ultimo perde temporaneamente
l’usufrutto della CPU, campi per memorizzare informazioni.
-tipicamente i descrittori sono disposti in code costituite da liste a puntatori
+ un processo non può esistere se non esiste il suo descrittore e nasce nel momento
in cui viene allocato il suo descrittore.
Nucleo o Kernel:
-componente del sistema operativo dedicata a svolgere la gestione dei processi
esso:
-> crea i processi ovvero genera nuovi processi all’interno di un sistema operativo
-> li sincronizza ovvero consente di risolvere i problemi di cooperazione,
competizione e interferenza
modelli a memoria comune: più processi che accedono a risorse comuni le quali si
trovano in un’unica memoria condivisa
modelli a scambio di messaggi: più processi dotati di risorse locali e vi è un’unica
forma di comunicazione consentita ovvero lo scambio di messaggi
-> scheduling dei processi ovvero scegliere quali processi devono essere assegnati
alla CPU ed ha lo scopo di ottimizzare uno o più dei parametri. E vengono utilizzati
gli algoritmi di scheduling basati su una strategia di accesso a code di tipo FIFO (il
primo processo ad arrivare in coda è il primo ad essere servito) , basati su code a
priorità (esistono più code di processi che vengono servite sulla base della priorità o
importanza dei processi contenuti), algoritmi di tipo SJF (ad essere serviti per primi
sono i processi che durano di meno).
Stato dei processi
 Running: sono in esecuzione avendo ottenuto il possesso della CPU. Un
processo nello stato running passa in un altro stato se si verifica una delle
seguenti condizioni: è arrivato alla sua naturale terminazione, un errore che
determina una terminazione prematura, ha avviato un’operazione di I/O e
deve aspettare il suo completamento e in tal caso passa in waiting, oppure ha
terminato il tempo a lui assegnato e in tal caso passa in ready.
 Ready: sono pronti per l’esecuzione ed attendono solo che gli venga concessa
la CPU. Un processo in tale stato può solo passare in running quando è in
scheduling.
 Waiting: sono in attesa di qualche evento come la fine di un’operazione di I/O
che li farà diventare prima ready e poi running. Esso può solo passare nello
stato di ready quando l’operazione di I/O richiesta è terminata.
I sistemi si dividono in:
-mono-tasking sono dei sistemi operativi che gestiscono l’esecuzione di un solo
programma alla volta, non è possibile sospendere un processo per assegnare la CPU
ad un altro e sono storicamente i primi sistemi operativi
-multi-tasking sono dei sistemi operativi che permettono l’esecuzione di più
programmi e un programma può essere interrotto e la CPU passa ad un altro
programma
-time-sharing rappresenta un’evoluzione di quelli multi-tasking qui ogni processo
viene eseguito ciclicamente per piccolo quanti di tempo, se la velocità del
processore è sufficientemente elevata di ha l’impressione di un’evoluzione parallela
dei processi. Un processo viene eseguito solo per un certo time-slice ed evita che la
CPU possa essere monopolizzata da un solo processo. Con i quanti di tempo tutti i
processi vengono eseguiti poco alla volta ma procedono tutti insieme. Tutte le
risorse del sistema vengono equamente distribuite tra tutti i processi.
-real-time le risposte devono essere fornite in tempo utile all’ambiente circostante e
i processi devono mantenere le risorse fino a quando non producono i risultati
desiderati e quindi terminano.
+Nei sistemi moderni time-sharing e real-time convivono e ai processi di tipo real-
time vengono assegnate priorità alte.

Gestione della memoria


Gestione della memoria:
-componente che si occupa dell’allocazione dei processi in memoria centrale (si
trova ad un livello superiore del kernel, in più un processo che non è allocato in
memoria non può essere eseguito)
-sistema monoprogrammato (un processo alla volta viene allocato in memoria)
-sistema mutiprogrammato (più processi vengono disposti in memoria anche se
solo uno di essi viene eseguito)
Swapping consente di avere un numero di processi attivi maggiore di quello
consentito dalle dimensioni effettive della memoria. Swap-out: trasferimento dei
processi dalla memoria centrale a quella di massa (quando sono in uno stato di
waiting). Swap-in: trasferimento di processi da memoria di massa a memoria
centrale (quelli che sono tornati in ready)
Tecniche di gestione della memoria:
-paginazione codice e i dati di un processo devono essere integralmente contenuti
nella memoria centrale. La memoria è suddivisa in blocchi: la memoria logica in
pagine, la memoria fisica in frame e quando un processo deve essere eseguito
vengono caricate nei frame le pagine. Memory management unit: hardware
dedicato tramite una tabella converte gli indirizzi logici di pagina del processo in
indirizzi fisici di frame.
-segmentazione codice e i dati di un processo devono essere integralmente
contenuti nella memoria centrale. La memoria fisica è suddivisa in partizioni di
lunghezza fissa o variabile dette segmenti. Anche lo spazio logico dei processi viene
suddiviso in segmenti. La corrispondenza tra indirizzi logici e fisici avviene
attraverso una MMU. Rispetto alla paginazione la segmentazione ha il vantaggio di
suddividere il programma in moduli logicamente coesi. Tuttavia questa tecnica
causa una maggiore frammentazione tra i segmenti.
-memoria virtuale codice e i dati di un processo sono contenuti solo in parte in
memoria centrale. I dati e le parti di codice relativi a programmi non in esecuzione
possono essere tolti dalla memoria centrale e lasciati su un disco nella area di swap.
Può essere applicata sia nell’ambito di una memoria paginata che segmentata. La
memoria necessaria all’esecuzione di tutti i processi non coincide più con la sola
memoria centrale: fisicamente allocata sulla memoria di massa e solo una parte
resta in memoria centrale. Page fault è un processo che richiede l’accesso ad una
particolare sua pagina non residente nella memoria centrale ma sul disco; il sistema
operativo deve arrestare il processo, inserire la pagina mancante in memoria e
riprendere l’esecuzione del processo. Se nella memoria centrale vi è una pagina
libera la nuova pagina potrà occuparla, altrimenti bisognerà effettuare uno swap-
out di pagine preesistenti.
Gestione delle periferiche
Gestore delle periferiche: coordina e gestisce le richieste per le periferiche di I/O.
Driver di periferica è un processo di sistema per ogni periferica che funge da
interfaccia tra il dispositivo fisico e l’utente e consente di svolgere simultaneamente
la fase di esecuzione e la fase di I/O di un processo.
File system
Gestisce: la collocazione dei file sulla memoria di massa e tutte le informazioni
necessarie per consentire l’esecuzione delle operazioni sui file; permette di ottenere
un’astrazione della memoria di massa organizzandola in insiemi di directory
(contengono informazioni riguardanti i file, queste contengono un array di record
ogni record è il descrittore di un file esso contiene tipicamente un: nome, tipo di file,
locazione, ora e data, protezione, posizione corrente, contatore di utilizzo e
identificatore di processo) e file (contengono i dati veri e propri).
Le operazioni sui file sono: la creazione o aggiornamento ossia aggiungere un
descrittore di file all’interno di un file directory, cancellazione ovvero eliminare un
descrittore di file e visualizzare ovvero accedere o ricercare dei dati.
Le operazioni sui file presuppongono una visita dei descrittori di file: la creazione
deve fare un’operazione di visita totale, la visualizzazione e la cancellazione invece
una parziale.
La modalità di allocazione dei file su disco può essere:
-contigua un file è memorizzato in blocchi contigui del disco e nel descrittore del file
si trova l’indirizzo del blocco iniziale e i numeri di blocchi occupati
-linkata un file è memorizzato in blocchi non contigui di memoria e nel descrittore
del file si ha il blocco di inizio del file e i vari blocchi sono linkati mediante puntatori
che sono contenuti nei blocchi stessi.
-indicizzata un file è memorizzato in blocchi non contigui di memoria e nel
descrittore del file si ha l’indirizzo di un blocco particolare detto indice che contiene
la posizione sul disco di tutti i blocchi costituenti i file
Interprete dei comandi
La shell è la componente che permette agli utenti di comunicare con il sistema è un
interprete di linguaggio. Shell testuali: programma con una interfaccia a linea di
comando che viene eseguita da un terminale testuale, una delle più note è quella di
DOS. Shell grafiche fanno uso di icone e finestre per svolgere operazioni con il
mouse.

Potrebbero piacerti anche