Beltramo
PROGETTAZIONE
tecnologie
in movimento
SECONDO BIENNIO
Tecnologie e progettazione
di sistemi informatici e di telecomunicazioni
C. Iacobelli M. Ajme V. Marrone F. Beltramo
PROGETTAZIONE
tecnologie
in movimento
SECONDO BIENNIO
Tecnologie e progettazione
di sistemi informatici e di telecomunicazioni
© 2012 by Mondadori Education S.p.A., Milano
Tutti i diritti riservati
www.mondadorieducation.it
Questo ebook contiene materiale protetto da copyright e non può essere copiato, riprodotto, trasferito, distribuito, noleggiato, licenziato o
trasmesso in pubblico, o utilizzato in alcun altro modo ad eccezione di quanto è stato specificamente autorizzato dall’editore, ai termini e alle
condizioni alle quali è stato acquistato o da quanto esplicitamente previsto dalla legge applicabile.
Qualsiasi distribuzione o fruizione non autorizzata di questo testo così come l’alterazione delle informazioni elettroniche sul regime dei diritti
costituisce una violazione dei diritti dell’editore e dell’autore e sarà sanzionata civilmente e penalmente secondo quanto previsto dalla Legge
633/1941 e successive modifiche.
Questo ebook non potrà in alcun modo essere oggetto di scambio, commercio, prestito, rivendita, acquisto rateale o altrimenti diffuso senza il
preventivo consenso scritto dell’editore. In caso di consenso, tale ebook non potrà avere alcuna forma diversa da quella in cui l’opera è stata
pubblicata e le condizioni incluse alla presente dovranno essere imposte anche al fruitore successivo.
Per eventuali e comunque non volute omissioni e per gli aventi diritto tutelati dalla legge, l’editore dichiara la piena disponibilità.
Lo studio di questa materia concorre al raggiungimento, al termine del corso di studio, delle
seguenti competenze, relativi all’indirizzo:
UÊ ÃÛÕ««>ÀiÊ>««V>âÊvÀ>ÌV
iÊ«iÀÊÀiÌÊV>ÊÊÃiÀÛâÊ>Ê`ÃÌ>â>Æ
UÊ ÃVi}iÀiÊ`ëÃÌÛÊiÊÃÌÀÕiÌÊÊL>ÃiÊ>iÊÀÊV>À>ÌÌiÀÃÌV
iÊvÕâ>Æ
UÊ }iÃÌÀiÊ«À}iÌÌÊÃiV`ÊiÊ«ÀVi`ÕÀiÊiÊ}ÊÃÌ>`>À`Ê«ÀiÛÃÌÊ`>ÊÃÃÌiÊ>âi`>Ê`Ê}iÃÌiÊ
della qualità e della sicurezza.
UÊ }iÃÌÀiÊ«ÀViÃÃÊ«À`ÕÌÌÛÊVÀÀi>ÌÊ>ÊvÕâÊ>âi`>Æ
UÊ Vv}ÕÀ>Ài]ÊÃÌ>>ÀiÊiÊ}iÃÌÀiÊÃÃÌiÊ`Êi>LÀ>âiÊ`>ÌÊiÊÀiÌÆ
UÊ Ài`}iÀiÊÀi>âÊÌiVV
iÊiÊ`VÕiÌ>ÀiÊiÊ>ÌÌÛÌDÊ`Û`Õ>ÊiÊ`Ê}ÀÕ««ÊÀi>ÌÛiÊ>ÊÃÌÕ>
zioni professionali.
C. Iacobelli
M. Ajme
V. Marrone
F. Beltramo
Test
Test di autovalutazione per ogni Unità. Si tratta di strumenti che facilitano lo studio,
in quanto lo studente può verificare progressivamente le conoscenze raggiunte e il
proprio livello di apprendimento.
Test
Ripasso MP3
Interrogazioni simulate per prepararsi alla verifica orale. Lo studente può ascoltare do-
mande e risposte corrette e leggerle in formato pdf:, così può rendersi conto in ogni
momento del proprio livello di comprensione degli argomenti trattati in ciascuna Unità.
Anche i quesiti a risposta aperta in lingua inglese nella sezione CLIL sono tradotti e
Ripasso MP3 disponibili in formato MP3, per cominciare a studiare l’informatica in un’altra lingua
comunitaria.
Verifica
Compiti in classe svolti passo passo e risolti.
Verifica
Glossario
Un glossario di termini tecnici in italiano e in inglese, valido supporto allo studio.
Glossario
Referenze iconografiche
UNITÀ 1 lezione 6
Codifica delle informazioni 1 Complemento a 2 18
●
Operazioni con i numeri negativi
lezione 1 rappresentati in complemento 18
Sistemi di elaborazioni 2
verifica le tue conoscenze
●
Definizione di hardware 2
●
L’elaboratore 2 lezione 7
●
Le componenti hardware 3 Codifica dei dati alfanumerici e numerici 22
●
verifica le tue conoscenze Alfanumerici 23
●
I prefissi 25
lezione 2
verifica le tue conoscenze
Il software 4
●
I programmi 4
lezione 8
●
Software di base 4 Codifica delle immagini 26
●
Software applicativo 4 ●
Rappresentazione delle immagini 26
verifica le tue conoscenze ●
Formati raster 27
verifica le tue conoscenze
lezione 3
Sistemi di numerazione 6
●
lezione 9
Numerazione binaria 6
Codifica delle altre immagini 30
●
Conversioni 6 ●
Codifica vettoriale 30
●
Operazioni binarie 7 ●
Immagini in movimento 30
verifica le tue conoscenze
verifica le tue conoscenze
lezione 4
Altri sistemi di numerazione 10 lezione 10
●
Codifica dei suoni 32
Numerazione esadecimale 10
●
●
Il suono 32
Numerazione ottale 11
●
●
Formati digitali 32
Considerazioni sui sistemi posizionali 11
●
Modalità di gestione dell’audio 33
verifica le tue conoscenze
●
File multimediali 34
lezione 5 verifica le tue conoscenze
Rappresentazione dei numeri 14
Sintesi
●
Numeri interi 14 Domande per l’orale
●
Numeri reali 14 Preparati al compito in classe
In English, please
verifica le tue conoscenze
Indice
UNITÀ 2 UNITÀ 3
Introduzione ai Sistemi Operativi 43 Il Sistema Operativo come gestore
di risorse 73
lezione 1
I Sistemi Operativi e la loro organizzazione 44 lezione 1
●
Introduzione 44 Gestione della memoria centrale 74
●
●
L’interfaccia o shell 46 La rilocazione 75
lezione 2 lezione 2
Struttura, funzionamento Allocazione a partizioni statiche 76
●
e prestazioni di un SO 48 Le tecniche di allocazione 76
● ●
Macchine virtuali 48 Allocazione a singola partizione:
●
Struttura e modalità di funzionamento 48 sistemi monoprogrammati 76
●
●
Prestazioni di un Sistema Operativo 50 Allocazione per partizioni:
sistemi multiprogrammati 77
●
Funzioni dei moduli del SO 51
●
Partizioni statiche 77
verifica le tue conoscenze
verifica le tue conoscenze
lezione 3
Tipi di Sistemi Operativi 52 lezione 3
Allocazione a partizioni dinamiche 80
●
Le varie tipologie 52
●
Partizioni dinamiche 80
verifica le tue conoscenze
verifica le tue conoscenze
lezione 4
Gestione della CPU 58 lezione 4
Allocazione non contigua 84
●
Nucleo del Sistema Operativo 58
●
La paginazione 84
●
Stati di un processo 59
verifica le tue conoscenze
verifica le tue conoscenze
lezione 5
lezione 5 Memoria virtuale a richiesta di pagine 86
Algoritmi di scheduling 62
●
La memoria virtuale 86
●
Lo schedulatore dei lavori 62
●
Gestione a richiesta di pagine 87
●
Lo schedulatore dei processi 63
●
Tecniche di rimpiazzamento 88
verifica le tue conoscenze ●
Svantaggi 89
lezione 7 lezione 2
Gestione delle periferiche 94 La concorrenza nella realtà 118
● ●
Collegamento fra CPU e periferiche 94 I processi concorrenti nella realtà 118
● ●
Interfacce 94 Analogia con il mondo reale 119
●
Elaboratori di canale 95 verifica le tue conoscenze
verifica le tue conoscenze
lezione 3
lezione 8 Sincronizzazione tra processi
Tecniche per la gestione delle periferiche 98 concorrenti 120
● ●
Dispositivi dedicati 98 Competizione e cooperazione
●
Dispositivi condivisi 98 fra processi 120
●
●
Dispositivi virtuali 98 Mutua esclusione 121
●
Deadlock e Starvation 122
verifica le tue conoscenze
verifica le tue conoscenze
lezione 9
Gestione delle informazioni 100
lezione 4
●
Directory 101 Realizzazione della mutua esclusione 124
● ●
Meccanismi di protezione 102 Semafori e primitive
di sincronizzazione 124
verifica le tue conoscenze
●
Operazioni lock(x) e unlock(x) 125
lezione 10 ●
Attesa attiva 126
Allocazione dello spazio su disco 104
●
●
TestAndSet 126
La FAT 104
●
●
Soluzione al problema della mutua
Tipi di allocazione 105
esclusione 127
●
Politiche per la gestione delle operazioni
verifica le tue conoscenze
di I/O su disco 106
verifica le tue conoscenze lezione 5
Sintesi Il problema dello stallo 128
Domande per l’orale ●
Lo stallo 128
In English, please
●
Gestione del problema dello stallo 129
●
Algoritmo del Banchiere 130
lezione 8 ●
Operazioni comuni sui file 157
Sincronizzazione attraverso
verifica le tue conoscenze
scambio di messaggi 136
●
Tipi di comunicazione 136 lezione 5
verifica le tue conoscenze Gestione dell’I/O: ridirezione, filtri e pipe 160
●
Sintesi Lo standard input e lo standard output 160
Domande per l’orale ●
Gli operatori di ridirezione 160
In English, please ●
I filtri 161
●
La pipe 162
verifica le tue conoscenze
UNITÀ 5
Interazione con il Sistema Operativo 143
lezione 6
Uso delle variabili 164
lezione 1 ●
Il Sistema Operativo come Variabili semplici di shell 164
●
interfaccia 144 Le variabili ambientali 164
● ●
Introduzione 144 Le espansioni con il simbolo $ 165
●
Attivazione del SO 144 verifica le tue conoscenze
●
Interazione con SO 145
●
lezione 7
Confronto tra GUI e CLI 146
Script di shell 166
verifica le tue conoscenze ●
Introduzione 166
●
Costruzione di uno script 166
lezione 2
●
Linux 148 Manutenzione degli script 167
●
Introduzione 148 verifica le tue conoscenze
●
Caratteristiche di Linux 149
lezione 8
●
Il file system di Linux 150 Elementi degli script di shell 168
●
Sistema di protezione dei file 151 ●
Uso delle variabili 168
●
Il partizionamento 151 ●
Uso dei parametri posizionali 169
verifica le tue conoscenze ●
Alcuni caratteri speciali 169
verifica le tue conoscenze
lezione 3
La shell 152
lezione 9
●
La shell di Linux 152 Le istruzioni di controllo e funzioni 170
●
I comandi base della shell 153 ●
L’istruzione se 170
●
Gli script di shell 154 ●
L’istruzione mentre 171
verifica le tue conoscenze ●
L’istruzione per 171
●
Le funzioni 172
lezione 4
Sintesi
La gestione di directory e file in Linux 156
Domande per l’orale
●
Introduzione 156 Preparati al compito in classe
●
Operazioni comuni sulle directory 157 In English, please
Indice
UNITÀ 6 ●
Prototipi “usa e getta” 194
Il ciclo di sviluppo 181 ●
Modello incrementale 194
●
Modello a spirale 195
lezione 1
Ingegneria del software 182 verifica le tue conoscenze
●
Software Engineering 182
●
Utilità dell’ingegneria del software 182
lezione 6
Diagrammi di flusso 196
●
Attori del progetto 184 ●
I dataflow 196
●
Processo 184 ●
Videate di input/output 196
●
Linguaggi e strumenti di modellazione 185 ●
Metodologia DFD 197
●
Gestione del progetto 185
verifica le tue conoscenze
●
Il problema dell’ingegneria del software 185
verifica le tue conoscenze lezione 7
Reti di Petri 198
lezione 2 ●
Espressioni 199
Il ciclo di vita del software 186
● verifica le tue conoscenze
Le fasi 186
●
Analisi del problema 186
lezione 8
●
Progetto 186 Modello Entità-Relazione 200
●
Realizzazione 187 ●
Entità e attributi 200
verifica le tue conoscenze ●
Associazioni 200
●
Modellare la realtà con E-R 201
lezione 3
Manutenzione e gestione del progetto 188 verifica le tue conoscenze
●
Manutenzione 188
●
lezione 9
Software di qualità 188
Metodologia SADT 202
●
Gestione progetto 189 ●
Componenti IDEF 202
verifica le tue conoscenze
verifica le tue conoscenze
lezione 4
Approccio metodologico ai progetti 190 lezione 10
●
Il diagramma IDEF 204
Cos’è una metodologia 190
●
●
Componenti 204
Confronto tra metodologie 191
●
●
Connessioni 204
Approccio strutturato e approccio
●
Object-Oriented 191 Diramazioni 205
●
verifica le tue conoscenze Diagramma 206
●
Scomposizione dei diagrammi 207
lezione 5 ●
Consistenza dei diagrammi 207
Modelli di approccio strutturato 192
●
verifica le tue conoscenze
Differenti modelli 192
● Sintesi
Modello a cascata 192
Domande per l’orale
●
Prototipizzazione rapida 193 In English, please
Indice
UNITÀ 7 ●
Generalizzazione, specializzazione
La progettazione con UML 213 ed ereditarietà 231
verifica le tue conoscenze
lezione 1
UML 214 lezione 6
●
Aggregazioni 232
La storia dell’UML 214
● verifica le tue conoscenze
Diagrammi UML 215
●
Paradigma Object-Oriented 215 lezione 7
verifica le tue conoscenze La modellazione funzionale 234
●
Gli aspetti dinamici 234
lezione 2 ●
Diagramma dei casi d’uso (Use Cases) 234
La modellazione degli oggetti 216 ●
Gli aspetti dinamici 235
●
Modello degli oggetti 216 ●
Altri tipi di casi d’uso 236
●
Classi e oggetti 216
verifica le tue conoscenze
●
Attributi 217
●
Operazioni e metodi 217 lezione 8
●
La modellazione dinamica 238
StarUML 217
●
Diagrammi di sequenza 238
verifica le tue conoscenze
verifica le tue conoscenze
lezione 3 lezione 9
Associazioni e link 220 Diagrammi di stato e di attività 240
●
Grado di un’associazione 220 ●
Diagramma di stato 240
●
Ruoli 221 ●
Sequenza di eventi 241
●
Molteplicità 222 ●
Condizioni 241
●
Classe Associazione 222 ●
Diagramma di attività 242
verifica le tue conoscenze verifica le tue conoscenze
Sintesi
lezione 4
Domande per l’orale
Il diagramma delle classi 224
Preparati al compito in classe
●
Identificare le classi 224 In English, please
●
Identificare gli attributi 225
●
Dizionario dei dati 226
●
UNITÀ 8
Identificare le associazioni tra le classi 226
Analisi dei requisiti 251
verifica le tue conoscenze
lezione 1
Raccolta dei requisiti 252
lezione 5
●
Generalizzazione ed ereditarietà 228 I requisiti 252
●
●
Ereditarietà (Inheritance) 228 Analista di business 252
●
●
Polimorfismo 229 Metodi tradizionali 252
●
●
Overriding 229 Metodi moderni 254
●
Overloading 230 verifica le tue conoscenze
Indice
lezione 2 ●
Stabilire necessità e requisiti 284
Gestione dei requisiti 256 ●
Criteri decisionali 284
●
Validazione dei requisiti 256 ●
Definire i “goal” 285
●
Identificazione e classificazione ●
Requisiti specifici 285
dei requisiti 256
●
●
Definire i criteri di successo 285
Gestione del cambiamento
e tracciabilità dei requisiti 257 verifica le tue conoscenze
●
Analisi dei rischi 257
●
lezione 2
Documento dei requisiti 257
Processo di ricerca 286
verifica le tue conoscenze ●
Il capitolato 286
●
lezione 3 I fornitori 286
Definizione dei requisiti 260 verifica le tue conoscenze
●
Il processo di gestione dei requisiti 260
●
La definizione dei requisiti 260 lezione 3
Il software gestionale 290
verifica le tue conoscenze
●
Contabilità 290
●
lezione 4 Vendite 290
Target Setting 272 ●
Produzione 290
verifica le tue conoscenze ●
Magazzino 291
●
Generale 291
lezione 5
Identificazione della soluzione 274 verifica le tue conoscenze
lezione 6 lezione 4
Lo sviluppo delle applicazioni 276 La valutazione dei prodotti
●
Architettura applicazione 276 e dei fornitori 292
●
●
Architettura software distribuita 276 Valutare le risposte 292
●
●
Architettura a tre livelli 277 La griglia di valutazione 292
●
●
Programmazione del database 278 Criterio di valutazione 294
●
La programmazione 278 verifica le tue conoscenze
●
Strategie di riuso del software 279
lezione 5
verifica le tue conoscenze
Valutazione comparata 296
Sintesi ●
Comparazione sistemi 296
Domande per l’orale
●
In English, please Selezionare “short list” 296
●
Benchmark o dimostrazioni 297
●
Progetti pilota 297
UNITÀ 9 ●
Selezionare un sistema software 283 Fattori di successo 297
verifica le tue conoscenze
lezione 1
Sintesi
Processo di selezione 284
Domande per l’orale
●
Scegliere un prodotto software 284 In English, please
Indice
UNITÀ 10 lezione 4
Normative sulla sicurezza 301 Rapporto con le pubbliche
amministrazioni 312
lezione 1 ●
Autonomia amministrativa 312
Sicurezza dei sistemi di elaborazione 302 ●
Uso di strumenti informatici 312
●
I rischi 302
verifica le tue conoscenze
●
I sistemi di backup/restore 302
●
Virus e antivirus 303 lezione 5
Smaltimento rifiuti 318
verifica le tue conoscenze
●
Sicurezza per l’ambiente 318
lezione 2 ●
Sostanze pericolose 318
Privacy 304 ●
Articoli più significativi della direttiva 318
●
La problematica 304
verifica le tue conoscenze
●
La normativa 304
verifica le tue conoscenze lezione 6
Reati informatici 320
lezione 3 ●
Il reato informatico 320
Sicurezza sul luogo di lavoro 308 ●
Convenzione di Budapest 321
●
Computer, ergonomia e salute 308 ●
Legislazione precedente 322
●
Informazione ai lavoratori addetti
verifica le tue conoscenze
ai videoterminali 308
●
Sintesi
I rischi per la salute 308
Domande per l’orale
●
Prevenzione 310 Preparati al compito in classe
●
Patologie 311 In English, please
Conoscenze
I sistemi di numerazione.
La codifica delle informazioni all’interno di un elaboratore.
Abilità
Trasformare i numeri nelle differenti basi.
Calcolare l’occupazione di memoria di un’immagine o di un suono.
Prerequisiti
Saper fare le quattro operazioni.
Saper utilizzare le proposizioni logiche.
1 Sistemi di elaborazione
! Per sistema si intende un insieme organico di elementi che concorrono alla composizione di
un'unica entità e/o al perseguimento di un unico fine, nel nostro caso quello di elaborare dati e
informazioni.
Per raggiungere il loro scopo i sistemi hanno bisogno di ricevere dati in ingresso (input) e
nello svolgimento dei loro compiti forniscono dati e informazioni in uscita (output). Spesso
il loro compito è proprio quello di trasformare degli input in output.
Un sistema di elaborazione può quindi essere visto come una scatola a cui si possono
fornire degli input, tramite determinati strumenti, e che è in grado di fornire degli output
tramite altri strumenti (figura 1). L’insieme delle azioni che concorrono al
raggiungimento di un certo risultato o effetto prende il nome di processo.
INPUT OUTPUT Tra i dati da fornire in input vi sono anche le istruzioni di cui l’elaboratore ha
SISTEMA
bisogno per lavorare, cioè quell’insieme di comandi che gli permettono di essere
figura 1 Esempio di “addestrato” e di svolgere automaticamente il processo di elaborazione. Questa
sistema di elaborazione fase di addestramento avviene tramite l’immissione nel sistema di un programma.
Per programma si intende un insieme di istruzioni codificate, cioè comandi
comprensibili all’elaboratore, che lo guidano a realizzare una particolare serie di
operazioni e che gli permettono di trasformare gli input in output.
Lo stereo è un esempio di sistema (figura 2). Riceve in input i segnali radio
(onde) tramite l’antenna o legge i dati da memorie esterne (dischi). Questi segna-
li e questi dati vengono rielaborati e trasformati in suoni che vengono forniti
figura 2 Impianto stereo in output tramite altoparlanti. Tra i dati di ingresso possono essere considerati
come esempio di sistema anche i comandi, cioè le indicazioni da fornire al sistema per fargli svolgere deter-
minate operazioni (cambio brano, variazione volume ecc.)
● Definizione di hardware
In un sistema di elaborazione vi sono due componenti principali: la parte fisica, in grado di
svolgere le funzioni di elaborazione, e la parte logica, in grado di governare la parte fisica
e di fare comunicare la macchina con l’uomo.
La parte fisica prende il nome di hardware, dall’inglese “ferramenta”.
● L’elaboratore
Il sistema di elaborazione, che noi utilizziamo viene comunemente chiamato calcolatore,
traduzione dall’inglese computer. Il termine deriva dal fatto che i primi calcolatori nacquero
appunto per “calcolare” e per elaborare dati “numerici” (vedi la scheda di approfondimen-
to). Nei paesi anglosassoni si parla ancora di “Computer Science” come ambito in cui si
studia l’uso del calcolatore. Attualmente l’accento si è spostato sull’elaborazione dei dati,
così che attualmente si usa indifferentemente il termine “elaboratore”, “calcolatore” o
“computer”.
Il bit è definito come l’unità elementare di informazione che può assumere solo due stati, corri-
spondenti appunto a “0” e “1”. !
Per comodità i bit vengono raggruppati in gruppi di 8 e questo insieme prende il nome di
byte. Nei moderni calcolatori la quantità di informazioni gestite è notevole, dell’ordine di
milioni di byte, per cui risulta inadeguato esprimere tale capacità in semplici byte. Si usano
per questo i multipli del byte.
Per semplicità si utilizzano gli stessi prefissi utilizzati per altre grandezze fisiche quali la
distanza o il peso, facendo però una piccola semplificazione. Poiché i multipli dei byte sono
potenze di 2, non arriveremo mai ad avere delle cifre uguali a quelle del sistema decimale.
Queste vengono quindi approssimate. Per indicare 1024 byte (cioè 210) si utilizza il Kilo
poiché si tratta di circa un migliaio di byte.
In tabella 1 vengono mostrati i multipli del byte e la loro rappresentazione.
Tramite il computer, oltre a elaborare i dati è possibile conservarli per un certo tempo e
riutilizzarli nel seguito.
! Il software si contrappone all’hardware come parte “morbida” del sistema, comprendendo tut-
te quelle parti che non hanno una consistenza fisica, in particolare i programmi che permettono
agli strumenti di operare.
● Software di base
! Per software di base si intende l’insieme di programmi in grado di fare funzionare la macchina,
semplificando il lavoro dell’uomo e ottimizzando l’uso delle risorse del sistema.
● Software applicativo
! Altra categoria di programmi è quella dei software applicativi. Si tratta di programmi utilizzabili
dall’utente finale del sistema per espletare un lavoro.
Sono programmi scritti da e per gli utenti, per far eseguire un particolare compito al
computer, come per esempio elaborazione testi, calcolo paghe, desktop publishing (DTP),
elaborazione grafica ecc.
Possono essere realizzati ad hoc per una particolare funzione di un’azienda o di un gruppo
di utenti, oppure per un uso più generale. Nel primo caso vi sono per esempio i program-
Lezione 2 Il software 5
1
UNITÀ lezione
3 Sistemi di numerazione
● Numerazione binaria
! Si definiscono sistemi di numerazione l’insieme degli oggetti e delle regole atte a rappresentare
le grandezze numeriche.
Si dicono posizionali i sistemi in cui il valore della cifra dipende dalla posizione che occu-
pa all’interno del numero stesso.
Il sistema decimale è un sistema di numerazione posizionale in base 10. Questo vuol dire
che per rappresentare un numero in decimale si fa uso di 10 simboli diversi (0, 1, 2, 3, 4,
5, 6, 7, 8, 9) ognuno dei quali assume valore diverso a seconda della posizione che occupa
>½ÌiÀÊ`iÊÕiÀÆÊÌ>ÊÃLÊÃÊV
>>ÌÊcifre.
Nel seguito si farà uso del punto de-
I numeri vengono rappresentati facendo uso della combinazione delle 10 cifre disponibili.
cimale al posto della virgola, secon- ÊÛ>ÀiÊ`iÊÕiÀÊmÊ`>ÌÊ`>>ÊÃ>Ê`iÊÛ>ÀÊV
iÊ>ÃÃÕÊiÊÃ}iÊVvÀiÆÊÊÛ>ÀiÊ
do la notazione anglosassone diffusa di una cifra è dato quindi dalla cifra stessa moltiplicata per un’opportuna potenza della base
nel campo informatico; inoltre verrà (legata alla sua posizione).
utilizzato il simbolo * anziché il sim-
bolo ¥ per la moltiplicazione, poiché 723 = 3 *100 + 2 *101 + 7 *102 = 3 + 20 + 700
quest’ultimo potrebbe essere confuso 137 = 7 *100 + 3 *101 + 1 *102 = 7 + 30 + 100
con il carattere alfabetico “x”. Nei sistemi di numerazione posizionali, spostare le cifre (shift) che compongono un nume-
ro di una posizione verso destra (sinistra) equivale a dividere (moltiplicare) il numero
stesso per la base.
! Il numero decimale 124 spostato di una posizione verso sinistra diventa 1240, spostato di una
posizione verso destra diventa 12.4.
Le stesse considerazioni valgono anche per i numeri reali tenendo conto del fatto che le cifre
dopo la virgola (o punto decimale) vengono moltiplicate per potenze negative della base.
7.23 = 7 *100 + 2 *10–1 + 3 *10–2 = 7 + 0.2 + 0.03
Oltre al sistema decimale, che è quello attualmente più diffuso, esistono altri sistemi di
numerazione posizionali in base diversa. Quello su cui ci si soffermerà maggiormente è il
sistema binario, poiché il calcolatore fa uso di tale sistema per la rappresentazione interna
dei numeri avendo a disposizione solo due stati (0/1 oppure acceso/spento oppure passag-
gio/non passaggio di corrente).
● Conversioni
Dato un numero X in base B è sempre possibile trovare il suo equivalente Y in un’altra base
D. Per indicare che X e Y rappresentano la stessa quantità espressa in basi diverse, si usa la
seguente simbologia: (X)B = (Y)D
esempio 1
Vogliamo convertire il numero 7.75 da base 10 a base 2, procediamo nel seguente modo:
convertiamo la parte intera del numero
(7)10 = (111)2
procediamo ora con la parte frazionaria
0.75 * 2 = 1.50 parte intera 1 0.50 * 2 = 1.00 parte intera 1
la parte frazionaria è uguale a 0, interrompiamo il procedimento:
(7.75)10 = (111.11)2
esempio 2
Vogliamo convertire il numero 9.38 da base 10 a base 2, procediamo nel seguente modo:
convertiamo la parte intera del numero
(9)10 = (1001)2
procediamo ora con la parte frazionaria
0.38 * 2 = 0.76 parte intera 0 0.08 * 2 = 0.16 parte intera 0 0.28 * 2 = 0.56 parte intera 0
0.76 * 2 = 1.52 parte intera 1 0.16 * 2 = 0.32 parte intera 0 0.56 * 2 = 1.12 parte intera 1
0.52 * 2 = 1.04 parte intera 1 0.32 * 2 = 0.64 parte intera 0
0.04 * 2 = 0.08 parte intera 0 0.64 * 2 = 1.28 parte intera 1
interrompiamo il procedimento anche se la parte frazionaria non è 0 perché riteniamo che 10 cifre
siano sufficienti a rappresentare con buona approssimazione il nostro numero. Otteniamo così:
(9.38)10 = (1001.0110000101)2
● Operazioni binarie
Le operazioni in binario rispettano le stesse regole di quelle della numerazione decimale. tabella 1 Somma
Bisogna considerare che il gioco dei riporti, dei resti o dei prestiti, è basato su due sole cifre. di 2 cifre binarie
0+0=0
Somma 1+0=1
Per effettuare la somma fra due numeri binari si fa riferi-
0+1=1
mento alla tabella 1 che mostra il risultato ottenuto
1 + 1 = 0 con il riporto di 1
sommando due cifre binarie per ogni caso possibile.
1011 + 11011001+
10 = 101101=
1101 1 00000110
Sottrazione
Per la sottrazione si opererà come con il sistema decimale, lavorando sui prestiti in caso
di necessità (tabella 2).
esempio
0 10 0 1 10
a. 1 0 1 1 – b. 1 0 1 1 – c. 1 0 0 1 1 –
10 = 110= 110=
1001 0101 01101
Nel caso a. non ci sono prestiti. Nel caso b. lo zero del primo numero prende un prestito dalla
cifra precedente che così diventa 0 a sua volta. Quello che prima era 0 è così diventato un 10
(equivalente a 2 in decimale) e quindi la sottrazione dà risultato 1 (vedi tabella 2).
Anche in questo caso si può verificare la correttezza dell’operazione trasformando minuen-
tabella 3 Moltipli- do, sottraendo e risultato in decimale.
cazione tra 2 cifre binarie
0*0=0 Moltiplicazione
0*1=0 Per la moltiplicazione si opererà come nel sistema decimale moltiplicando ogni cifra del
secondo fattore per tutte le cifre del primo e incolonnando in modo opportuno i risultati
1*0=0
parziali. Questi andranno infine sommati secondo le regole già viste. Ricorda che ogni
1*1=1
numero moltiplicato per zero dà come risultato zero, come mostrato nella tabella 3.
Divisione esempio
Nella divisione di numeri binari si procede come nel 1011 1 1 1
sistema decimale, “abbassando” un numero di cifre del 11 1001
`Û`i`ÊÊ}À>`Ê`ÊVÌiiÀiÊÊ`ÛÃÀiÆÊÃÊÃVÀÛiÊ>Ê ––0
prima cifra del quoziente, si effettua la moltiplicazione 00
della cifra del quoziente per il divisore, si incolonna ––1
sotto le cifre del dividendo e si effettua la sottrazione. Il 00 11011: 11 = 1001 con resto 0
procedimento va ripetuto finché non si esauriscono le –11
cifre del dividendo. 11
––
esercizio guidato
Testo Converti i numeri decimali 219 e 105 in binario, quindi fai la somma binaria.
Converti il risultato in decimale per verificare la correttezza dell’operazione.
Risoluzione Per prima cosa dovrai convertire entrambi i numeri secondo il metodo
descritto precedentemente.
219 : 2 109 resto 1 105 : 2 52 resto 1
109 : 2 54 resto 1 52 : 2 26 resto 0
54 : 2 27 resto 0 26 : 2 13 resto 0
27 : 2 13 resto 1 13 : 2 6 resto 1
13 : 2 6 resto 1 6 : 23 resto 0 Ricordati che per trovare il nu-
mero binario devi prendere
6 : 2 3 resto 0 3 : 21 resto 1 il resto delle divisioni partendo dal
3 : 2 1 resto 1 1 : 20 resto 1 basso.
1 : 2 0 resto 1 preso dal basso in alto 1101001
preso dal basso in alto 11011011
A questo punto puoi fare l’operazione di somma.
Operazione
1 1 1 1 1
11011011 +
1101001 =
10 1 0 0 0 1 0 0
Effettua la prova riconvertendo i due addendi e il risultato in decimale, ricordando che
quest’ultimo dovrà corrispondere a 234 in decimale.
Prova
0*20 + 0*21 + 1*22 + 0*23 + 0*24 + 0*25 + 1*26 + 0*27 + 1*28 =
0*1 + 0*2 + 1*4 + 0*8 + 0*16 + 0*32 + 1*64 + 0*128 + 0*256 =
0 + 0 + 4 + 0 + 0 + 0 + 64 + 0 + 256 = 324
724 : 16 = 45 resto 4 4
45 : 16 = 2 resto 13 D
2 : 16 = 0 resto 2 2
Il numero esadecimale corrispondente a 724 è 2D4 (724)10 = (2D4)16
Operazioni in esadecimale
Le operazioni in esadecimale seguono le stesse regole delle operazioni decimali ma, a dif-
ferenza di queste, i riporti e i prestiti sono basati sul valore 16 anziché 10.
esempio
somma
29+
18= Si tenga conto del fatto che (9 + 8)16 = (11)16 (= 17 in decimale)
41
1B7+
C4= 7 + 4 = B (= 11 in decimale)
B + C = 17 (= 23 in decimale)
27B
sottrazione
B8– poiché (B)16 = (11)10
27= quindi (11 – 2)16 = (9)10
91
A 13
B3– In questo caso il 3 chiede in prestito una cifra a B (che rimane A) e diventa 13
9 C= (13)1 6 – (C)1 6 = (19)1 0 – (12)1 0 = 7
17 (A)1 6 – (9)1 6 = (10)1 0 – (9)1 0 = 1
● Numerazione ottale
Nel sistema di numerazione in base 8 (ottale) si fa uso di 8 simboli diversi:
01234567
Operazioni in ottale
Le operazioni nel sistema ottale seguono le stesse regole delle operazioni decimali ma, a
differenza di queste, i riporti e i prestiti sono basati sul valore 8 anziché sul valore 10.
esempio
1 6 +
2 5 = (6 + 5)8 = (13)8 (= 11 in decimale)
4 3
Per trasformare un numero ottale in binario, si trasforma ogni singola cifra del numero
ottale nel corrispondente numero binario di 3 cifre (8 = 23):
5 1 3 3
101 001 011 011
Per passare dalla base 2 alla base 16 si raggruppano le cifre per 4 (16 = 24) partendo da
destra, se il numero non è divisibile per 4 si aggiungono zeri non significativi, in seguito si
converte in esadecimale ogni singolo gruppo così formato:
1010110010
0010 1011 0010
2 B 2
Per passare dalla base 2 alla base 8 si raggruppano le cifre per 3 (8 = 23) partendo da destra
e aggiungendo eventualmente zeri non significativi e si converte gruppo per gruppo:
1010110010
001 010 110 010
1 2 6 2
Visto che è molto semplice trasformare un numero binario in un numero ottale o esadeci-
male e viceversa, la trasformazione di un numero da esadecimale a ottale si può ottenere
passando attraverso la base 2, cioè trasformando da esadecimale a binario e da binario a
ottale (si può seguire la stessa regola per passare da ottale a esadecimale):
A 5 B
1010 0101 1011
101 001 011 011
5 1 3 3
esercizio guidato 2
Testo Converti il numero (724)10 in base 16.
Risoluzione Per passare da base 10 a qualunque altra base (in questo caso 16) devi
dividere il numero per la base desiderata e prendere i resti della divisione in ordine inverso.
724 : 16 45 resto 4 4
45 : 16 2 resto 13 D
2 : 16 0 resto 2 2
Il risultato è (724)10 = (2D4)16
esercizio guidato 3
Testo Converti il numero A5B da base 16 a base 8.
Risoluzione È particolarmente agevole eseguire il passaggio da base 16 a base 8
passando attraverso la base 2. Per convertire un numero da base 16 a base 2 prendi ogni
singola cifra del numero in base 16 e convertila in base 2 facendo uso di 4 cifre (in quanto
16 = 24). Una volta ottenuto il numero binario converti in ottale raggruppando le cifre
binarie in gruppi di tre cifre a partire da destra e poi in base 8 ogni terna separatamente.
A 5 B
1010 0101 10 1 1
101 001 011 011
5 1 3 3
A 5 B
1010 0101 1011
101 001 011 011
5 1 3 3
Il risultato è (A5B)16 = (5133)8
● Numeri reali
I numeri reali possono essere rappresentati con due differenti modalità:
UÊ ÊÛÀ}>ÊvÃÃ>Êfixed point®Æ
UÊ ÊÛÀ}>ÊLiÊfloating point).
Con il primo metodo (fixed point) i numeri vengono rappresentati come siamo abituati a
utilizzarli:
0.3 34.5678976766663308 0.0000004 2675534654.0
Come si può notare quando i numeri sono molto grandi, molto piccoli o hanno molte cifre
decimali risulta difficoltosa la loro rappresentazione.
Per ovviare a questo problema negli elaboratori attuali viene usata la “notazione scientifica”
o “esponenziale”. Tale rappresentazione viene anche detta “floating point” perché il punto
decimale si sposta in base alla tipologia del dato.
Nella notazione floating point, il numero viene scritto attraverso il prodotto di due numeri,
il primo dei quali rappresenta le cifre significative del numero considerato (mantissa), il
secondo è una potenza della base (10) il cui esponente è tale da dare l’opportuno valore
al primo fattore.
esempio 1
5.67 E + 2 equivale a 5.67 *102 = 567
5.67 è la mantissa e + 2 l’esponente; il simbolo E separa la mantissa dall’esponente.
78.98 E – 4 equivale a 78.98 *10–4 = 0.007898
esempio 2
5.23 si scrive 0.523 * E+1
0.004 si scrive 0.4 * E–2
In questo modo la mantissa risulta un numero sempre minore di 1 e privo di zeri non
significativi.
La rappresentazione dei numeri reali all’interno del computer può avvenire in diverse
modalità, quella riportata in seguito è lo standard IEEE 754.
Secondo tale formato un numero reale viene rappresentato in binario utilizzando la virgola
mobile.
Un numero binario (secondo lo standard IEEE 754) si dice normalizzato se è rappresentato
con il segno, il numero 1 seguito dal punto decimale e dalle cifre binarie successive molti-
plicato per un’opportuna potenza del 2:
dove:
xxxxxxx indicano le cifre binarie del numero (mantissa)
n rappresenta l’esponente del 2
segno indica il + o il –
In tabella 1 viene mostrato come qualunque numero binario può essere scritto in vir-
gola mobile normalizzata.
111001 1.11001 * 25
-100.0101 -1.000101 * 22
0.01011 1.011*2-2
0.000111 1.11 * 2-4
UÊ singola precisione;
vengono utilizzati 4 byte (32 bit) suddivisi nel modo seguente: il bit più a sinistra per il
segno, i successivi 8 bit per l’esponente e i rimanenti 23 bit per la mantissa.
1 8 bit 23 bit
S esponente mantissa
1 11 bit 52 bit
S esponente mantissa
UÊ precisione estesa;
vengono utilizzati 10 byte (80 bit) suddivisi nel modo seguente: il bit più a sinistra per
il segno, i successivi 15 bit per l’esponente e i rimanenti 64 bit per la mantissa.
1 15 bit 64 bit
S esponente mantissa
L’esponente della base (2) può essere sia positivo che negativo, questo complica la rap-
presentazione. Per evitare che ci siano esponenti negativi e rendere più semplici le ope-
razioni, al momento della rappresentazione dell’esponente, viene sommato al suo valore
una costante (detta bias). In particolare per la singola precisione la costante da sommare è
127 (27–1), mentre in doppia precisione la costante è 1023 (210–1) e in precisione estesa
è 16383 (214–1).
esempio 3
Se lavoriamo in singola precisione l’esponente +4 viene rappresentato con 131 (127+4), mentre
–6 viene scritto come 121 (127–6).
esercizio guidato
Testo Dato il numero decimale –12.25 rappresentarlo in singola precisione secondo lo
standard IEEE 754.
12: 2 =6 resto 0
6: 2 =3 resto 0
3: 2 =1 resto 1
1: 2 =0 resto 1
(12)10 = (1100)2
–1100.01 = –1.10001 * 23
1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1
10 0 0 0 0 0 0 0 –
10011001
01100111 complemento di 10011001
Sfruttando le proprietà della numerazione binaria è stato definito un altro metodo più
empirico per calcolare rapidamente il complemento in base 2 di un numero. Si tratta di
trasformare le cifre 1 in 0 e viceversa e, al valore ottenuto, sommare 1.
esempio
10 0 1 1 0 0 1 numero da complementare
10 0 1 1 0 0 1 si trasformano le cifre 1 in 0 e viceversa
01 1 0 0 1 1 0 + si somma 1 al valore ottenuto
1 =
01 1 0 0 1 1 1 complemento di 10011001
Passiamo ora ad analizzare i possibili casi di somma algebrica tra due numeri in modo da
renderci conto dell’importanza di utilizzare il complemento a 2 nella rappresentazione
Caso 1
R=+A+B (1)
I due numeri sono entrambi positivi per cui si tratta di una semplice somma.
+ 23 + 00010111+
+ 12 = 00001100=
+ 35 00100011
o
Caso 2
R=+A–B (2)
In questo caso il primo termine è positivo e il secondo è negativo e poiché abbiamo suppo-
sto A > B il risultato sarà un numero positivo. Utilizziamo la formula del complemento
Be = 2n – B per ricavare – B = Be – 2n sostituendo nella formula (2) otteniamo:
R = + A + Be – 2n
Possiamo affermare che la somma algebrica A – B è equivalente alla somma tra il comple-
mento di B (Be) a meno di 2n.
A = 23 +23 +
B = 12 –12 =
+11
+ 23 00010111+
+ 8 8 o complemento in base 11110100= complemento di 0001100 (12)
10 di + 12
111 1 00001011
o
Caso 3
R=–A+B (3)
In questo caso il primo termine è negativo e il secondo è positivo, ricordando l’ipotesi che
A > B il risultato sarà un numero negativo che verrà scritto in complemento a 2. Come nel
caso 2 utilizziamo la formula del complemento per ricavare – A = Ae – 2n e sostituiamo nella
(3) ottenendo:
Lezione 6 Complemento a 2 19
R = Ae – 2n + B
– 23 +
+ 12 =
– 11
+ 7 7 o complemento in base 10 di +23 1 1 1 0 1 0 0 1 + complemento di 0010111
+ 12 00001100=
+ 8 9 o complemento in base 10 di +11 11110101 complemento di 0001011
Caso 4
R=–A–B (4)
Entrambi i termini sono negativi quindi li rappresenteremo utilizzando la formula del comple-
mento a 2 (– A = Ae – 2n e – B = Be – 2n) sostituendo nella (4) si avrà:
R = Ae – 2n + Be – 2n = Ae + Be – 2n – 2n
– 23 +
– 12 =
– 35
+ 7 7 o complemento in base 10 di +23 1 1 1 0 1 0 0 1 + complemento di 00101111
+ 8 8 o complemento in base 10 di +12 1 1 1 1 0 1 0 0 = complemento di 00001100
165 o complemento in base 10 di +35 1 1 1 0 1 1 1 0 1 complemento di 00100011
o
riporto da trascurare riporto da trascurare
Il risultato è un numero negativo scritto quindi in complemento a 2 (come nel caso 3) e
inoltre ci sarà un riporto da non considerare (come nel caso 2).
Caso 1
R=+A+B (1)
I due numeri sono entrambi positivi per cui si tratta di una semplice somma.
+ 15 + 00001111+
+ 34 = 00100010=
+ 49 00110001
o
+ 15 + 0 0 0 0 1 1 1 1+
+ 66 = o complemento di 34 1 1 0 1 1 1 1 0 = o complemento di 00100010
+ 81 o complemento di 19 1110110 1 o complemento di 00010011
o
Caso 4
R = –A –B (4)
Entrambi i termini sono negativi quindi li rappresenterai utilizzando la formula del com-
plemento a 2 (–A = Ae– 2n e –B = Be–2n) sostituendo nella (4) avrai:
R = Ae – 2n +B’ – 2n = Ae + Be–2n–2n
Il risultato è un numero negativo scritto, quindi in complemento a 2 (come nel caso 3) e
inoltre ci sarà un riporto da non considerare (come nel caso 2).
– 15 +
– 34 =
– 49
riporto da trascurare
Lezione 6 Complemento a 2 21
1 lezione
UNITÀ
Codifica dei dati alfanumerici
7 e numerici
Nella realtà esistono diversi tipi di informazioni che quotidianamente vengono scambiate
tra le varie persone. Possiamo classificare le informazioni in due principali categorie:
UÊ ÕiÀV
iÆ
UÊ >v>LiÌV
i°
esempio
Dovendo rappresentare 1000 informazioni diverse sono necessari n = 10 bit per la codifica.
Infatti 29 = 512 e 210 = 1024. Per cui 210 ≥ 1000. Vi saranno delle configurazioni non utilizzate,
ma con solo 9 bit non si sarebbe riusciti a configurarle tutte.
Nella codifica, il byte viene suddiviso in due parti (figura 1) dove i 4 bit più a sinistra,
detti zonatura, identificano il gruppo di appartenenza (le lettere maiuscole, le lettere minu-
scole, le cifre, ...), i 4 bit più a destra (digit) identificano il simbolo all’interno del gruppo
di appartenenza. Per esempio sia la ‘A’ sia la ‘G’ hanno la stessa zonatura (1010), ma diffe-
riscono nella parte digit (0001 per la ‘A’ e 0111 per la ‘G’).
In realtà lo standard ASCII copre solo i primi 128 simboli (da 00000000 a 01111111),
i successivi simboli fino al 256° costituiscono la tabella ASCII estesa che presenta varie
versioni a carattere nazionale. Le varianti sono talmente numerose che i 128 simboli della
tabella estesa non sono purtroppo sufficienti a rappresentarle tutte, per questo motivo esi-
stono diverse estensioni della tabella ASCII.
Con 2 byte il numero di combinazioni possibili diventa 216 = 65536, perciò Unicode
supporta 65536 diversi simboli, al posto dei 256 del set ASCII. Si riescono così a rap-
presentare non solo tutte le varianti dell’alfabeto latino, ma anche tutti gli altri alfabeti.
esercizio guidato 1
Testo i½>v>LiÌÊ`Ê>ÀÌiÊÃÊ«ÀiÛÃÌÊ{ääÊÃLÆÊµÕ>ÌÊLÌÊÃÊ`iÛÊÕÌââ>ÀiÊ«iÀÊ
rappresentarli tutti?
Risoluzione L’esercizio richiede di trovare il numero di bit che sono necessari per
codificare 400 informazioni diverse.
Devi quindi applicare la formula 2n ≥ M e ricavare n.
2n ≥ 400 se n = 9
esercizio guidato 2
Testo Dati 12 bit per la codifica, quante informazioni distinte puoi rappresentare?
Risoluzione In questo caso conosci la lunghezza delle sequenze di bit che sono usate
per la codifica dell’informazione e ti basterà applicare la formula 2n per trovare il numero
di informazioni distinte che si possono rappresentare.
212 = 4096
tabella 3 Prefissi
moltiplicatore prefisso simbolo
1
= 10–1 deci d
10
1 centi c
= 10–2
100
1 milli m
= 10–3
1000
1
= 10–6 micro m
1000000
1 nano n
= 10–9
1000000000
1 pico p
= 10–12
1000000000000
a
Per rappresentare immagini all’interno di un sistema informa-
tico è necessario digitalizzarle, ossia codificarle come sequenze
di bit (0 o 1). A tale scopo l’immagine viene suddivisa uni-
formemente in piccole parti dette pixel (picture element) e a
ciascuna di esse viene assegnato un numero che corrisponde
al colore (o sfumatura di grigio) che predomina al suo interno.
In base alla risoluzione della tavolozza cromatica (palette) o
della scala di grigi adottata, si distinguono diversi tipi di imma-
gini digitalizzate, di cui le più comuni sono (figura 1):
UÊÊimmagini binarie: ogni pixel viene visto come bianco o
nero, e vengono quindi trascurate le mezze tinte che vengo-
b
no trasformate in base a un valore di soglia in punti bianchi
o neri. Ogni elemento (pixel) occuperà un solo bit. Questa
modalità è utile per ridurre l’occupazione di memoria e
viene usata soprattutto per i disegni tecnici. È la stessa tecni-
ca utilizzata per inviare immagini tramite il sistema telefaxÆ
UÊÊimmagini in scala di grigio: ciascuna tonalità di grigio viene
codificata con un certo numero di bit (da 2 a 8 generalmente)
permettendo così la realizzazione di differenti sfumature di
grigio (da 4 a 256). È utile soprattutto per disegni pittorici e
>ÀV
ÌiÌÌVÆ
UÊÊimmagini a pseudocolori: simile alle scale di grigio, in que-
c sto caso vengono codificati da 4 a 256 differenti colori, ma
ÊÛi}Ê«iÀiÃÃiÊiÊÃvÕ>ÌÕÀiÆ
UÊÊimmagini a colori: si usano generalmente 3 byte (uno per
ogni colore fondamentale) per ogni pixel, ossia 24 bit/pixel,
così è possibile codificare oltre 16 milioni di colori, e si rie-
sce a rappresentare con una buona fedeltà qualunque tipo
di fotografia o di disegno.
esercizio guidato 1
Testo Quanti byte occupa un’immagine di 200 100 pixel in bianco e nero?
esercizio guidato 2
Testo Quanti byte occupa un’immagine di 200 100 pixel a 256 colori?
esercizio guidato 3
Testo Se un’immagine a 16,7 milioni di colori occupa 3600 byte, da quanti pixel sarà
composta?
● Formati raster
Vi sono molti formati che sono stati definiti per rappresentare le immagini. In particolare
molti di questi sono nati per poter memorizzare le immagini occupando meno spazio.
Dagli esempi mostrati negli esercizi si vede infatti come per avere immagini di buona qua-
lità, bisogna occupare molto spazio.
È possibile avere una compressione di tipo lossless, cioè senza perdita di qualità. Vuol dire
che è sempre possibile ricostruire esattamente l’immagine con i dati originali.
Il formato JPEG
Algoritmo di compressione con perdita di qualità e fattore di compressione definibile dall’uten-
te. Più alto è il fattore di compressione più bassa è la qualità (figura 2). Fornisce ottimi
risultati per le immagini fotografiche, ma risulta meno adatto per il trattamento di immagini
al tratto, schemi, immagini con testo (introduce infatti delle scalettature). Molto utilizzato per
creare delle icone di immagini di dimensioni maggiori.
Il formato PDF
Formato generato da Adobe Acrobat e leggibile tramite la componente Acrobat Reader
nelle principali piattaforme (PC, MAC, UNIX). È diventato lo standard per la distribuzione
di documenti e manuali in formato elettronico.
esercizio guidato 4
Testo Un utente decide di rappresentare delle fotografie con una risoluzione di
2400 1600 pixel, con 16 milioni di colori.
Determinare il numero di immagini in formato raster che risultano memorizzabili in una
scheda di memoria della capacità di 2 GB.
Risoluzione
UÊ numero di pixel: 2400 £ÈääÊrÊÎÊn{äÊäääÆ
UÊ ÕiÀÊ`ÊLÌÊ«iÀÊ«ÝiÊrÊÓ{ÊLÌÉ«ÝiÊrÊÎÊLÞÌiÉ«ÝiÆ
UÊ dimensione in byte non compressa = 3 840 000 pixel 3 byte/pixel =
££ÊxÓäÊäääÊLÞÌiÆ
UÊ numero di immagini = capacità della scheda / dimensione dell’immagine =
2 GB / 11 520 000 B = 186,41 = 186 immagini.
● Immagini in movimento
Un filmato è una sequenza di immagini statiche (dette fotogrammi o frame). Per codificare
un filmato basta quindi digitalizzare i suoi fotogrammi riconducendoci alle problematiche
precedenti. Sono stati sviluppati specifici standard per il video come per esempio AVI
(Audio Video Interleave, Microsoft) e MOV (noto come QuickTime, Apple).
Un particolare formato, che permette un elevato livello di compressione è il MPEG (Moving
Picture Expert Group), basato su algoritmi che gestiscono la differenza tra fotogrammi.
Si tratta di uno Standard a livello mondiale utilizzato in molti campi, molto efficiente, ma
anche molto complesso.
Nei filmati è necessario avere un minimo di 16 frame al secondo (FPS) affinché l’occhio umano
non percepisca i singoli fotogrammi. Per esempio nella pellicola cinematografica vi sono 24
FPS. È però inefficace codificare completamente tutti i frame e, quindi, se ne codificano com-
pletamente solo alcuni, mentre dei successivi vengono codificate solo le parti che differiscono.
Il QuickTime è uno standard proposto da Apple, meno efficiente, ma più semplice.
Risoluzione
UÊ dimensione di un fotogramma (in pixel) = 640 Ê{näÊrÊÎäÇÊÓääÊ«ÝiÆ
UÊ ÕiÀÊ`ÊLÌÊ«iÀÊ«ÝiÊrÊ}Ó®ÊÓ{Ê®ÊrÊÓxÊLÌÉ«ÝiÆ
UÊ dimensione di un fotogramma (in bit) = 307 200 pixel 25 bit/pixel = 7 680 000
LÌÉvÀ>iÊrÊÈäÊäääÊLÞÌiÉvÀ>iÊrÊÎǰxÊ ÉvÀ>iÆ
UÊ dimensione di un secondo di video = bit/fotogramma fotogrammi/secondo
rÊÎǰxÊ ÉvÀ>iÊIÊÓxÊvÀ>iÉÃÊrÊÓÎÊ{ÎǰxÊ ÉÃÆ
UÊ dimensione totale (3 minuti) = bit/secondo n.secondi = 23 437.5 kB/s * 120 s =
4 218 750 kB = 4119.8 MB = 4.02 GB.
esercizio guidato 2
Risoluzione
L’occupazione del filmato è di 4119.8 MB = 4.02 GB.
Se il filmato deve essere compresso fino a una dimensione finale di 10 MB, il fattore di
compressione dovrà essere pari a 4119.8 MB / 10 MB = 411:1.
Per codificare i suoni si effettuano dei campionamenti sull’onda (cioè si misura il valore
dell’onda a intervalli di tempo costanti) e si codificano in forma digitale le informazioni
estratte da tali campionamenti (figura 2).
La sequenza dei valori numerici così ottenuta può essere facilmente codificata. Quanto più
frequentemente il valore dell’onda viene campionato, tanto più precisa sarà la sua rappre-
sentazione digitale (figura 3).
t t
figura 2 Campionamento dell'onda figura 3 Rappresentazione digitale dell'onda sonora
● Formati digitali
Esistono varie modalità di campionamento e di rappresentazione del suono. Nel seguito i
formati più diffusi.
WAV
È un formato utilizzato prevalentemente da Microsoft per la registrazione dei CD Audio
(PCM). È possibile utilizzare diversi livelli di qualità (8-16 bit, da 11 a 44 kHz). Più alta è la
qualità, maggiore è l’occupazione di memoria. Ha perso popolarità proprio per la notevole
dimensione che ne pregiudica l’uso su Internet.
AIFF
Acronimo di Audio Interchange File Format, sviluppato dalla Apple Computer basandosi
sull’Interchange File Format della Electronic Arts, è comunemente utilizzato sui sistemi
Apple Macintosh. Anche in questo formato i dati audio non sono compressi, poiché lo
standard nasce per poter effettuare lo scambio di dati tra applicazioni diverse. Di conse-
guenza il file è in genere molto grande: un minuto di audio occupa circa 10 MB.
Esistono tuttavia delle versioni compresse, dette AIFFC (AIFF Compressed), che possono
ridurre le dimensioni del file di un terzo (AIFF3) o di un sesto (AIFF6), facendo però
perdere la qualità.
MP3
MPEG-1/2 Audio Layer, nato da studi della percezione umana del suono, è un formato
audio che si basa su un algoritmo di compressione. È in grado di ridurre drasticamente la
quantità di dati richiesti per riprodurre un suono. Nel suono esistono delle frequenze non
percettibili dall’uomo che però occupano dello spazio. Eliminando queste, la dimensione
del file viene drasticamente ridotta, senza per questo perdere in qualità del suono.
Mantiene un’alta qualità di riproduzione, paragonabile a quella di un CD Audio. In con-
fronto a un file WAV occupa poco spazio (fino a 600 brani in un CD contro i 10-12 del
formato WAV).
MIDI
Acronimo di Musical Instrument Digital Interface, protocollo standard per l’interazione
degli strumenti musicali elettronici (anche tramite un computer), contiene una sequenza
di comandi in grado di pilotare un circuito di sintesi audio (tastiera o scheda audio). Sono
file di dimensione limitata, ma per essere ascoltati con una buona fedeltà di riproduzio-
ne richiedono schede wave-table. Molto usati con sintetizzatori musicali e videogiochi.
Permette la gestione solo di musica e non di voce umana.
CELP
Acronimo di Code Extend Linear Prediction, protocollo standard per l’interazione degli
strumenti musicali elettronici (anche tramite un computer), contiene una sequenza di
comandi in grado di pilotare un circuito di sintesi audio (tastiera o scheda audio). Sono
file di dimensione limitata, ma per essere ascoltati con una buona fedeltà di riproduzione
richiedono schede wave-table.
Streaming
Lo streaming è un metodo che permette di utilizzare (ascoltare) un file tramite un pro-
gramma presente sul nostro computer, prima che venga completamente trasferito. Per fare
questo il file viene suddiviso in pacchetti, che vengono trasferiti sequenzialmente, e ogni
pacchetto completo, una volta trasferito, può già essere utilizzato. Un brano musicale può
quindi essere ascoltato anche se non è stato ancora completamente trasferito sul sistema
riproduttore. In alcuni casi il file viene anche memorizzato sul computer di chi lo ascolta,
mentre in altri casi il file può solo essere utilizzato. È questo il modo con cui molte case
discografiche si tutelano dalla pirateria.
● File multimediali
L’approccio multimediale dei media attuali porta ad avere la necessità di gestire in con-
temporanea audio e video. Ecco quindi alcuni formati multimediali tra quelli più utilizzati,
soprattutto nel mondo Internet.
Formato AVI
Introdotto da Microsoft per la visualizzazione di filmati video sul PC. Esistono diversi
algoritmi di compressione (Indeo, Cinepac, …) con fattori di compressione e prestazioni
diverse. Sono file di grandi dimensioni ed è poco diffuso in ambienti non Windows.
Formato MOV
File generato da Apple QuickTime. Contiene estensioni per la realtà virtuale e consente un
buon livello di interazione con l’utente. I file sono di grandi dimensioni e possono essere
visualizzati sia su ambiente Windows che su MAC.
esercizio guidato 1
Testo Quanto spazio occupa un suono della duranta di 8 secondi campionato a 200 Hz,
in cui ogni campione occupa 4 byte?
esercizio guidato 2
Testo Un secondo di suono campionato a 512 Hz occupa 1 KB. Quanti valori distinti si
possono avere per i campioni.
esercizio guidato 3
Testo Un utente registra un brano musicale in formato MP3 stereo, con un campiona-
mento a 48 kHz e 16 bit per campione. Sapendo che la durata del brano è di 74e e ipotiz-
zando un fattore di compressione 10 , si calcoli la dimensione del file in MB.
1 sintesi
lezione 2 Il software
L’insieme delle parti “intangibili” (i programmi) rappresenta il software. I programmi si
dividono in software di base e software applicativi. Il software di base è l’insieme dei pro-
grammi che permette di far funzionare la macchina (per esempio il Sistema Operativo).
Nel software applicativo vi sono i programmi destinati agli utenti finali che li usano per
espletare un’attività (contabilità, prenotazioni, giochi, ...).
lezione 6 Complemento a 2
Per ridurre la complessità dell’hardware dell’elaboratore si utilizza un unico circuito
sommatore. La sottrazione viene vista come una somma tra numeri rappresentati in
complemento a 2.
➞ L1
➞ L2
➞ L3
➞ L3,L4
➞ L5
➞ L6
➞ L7
➞ L8
➞ L8,L9
➞ L10
Risoluzione
1 Completa la seguente tabella di comparazione tra tipi di numerazione.
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
e 724(10) = ..................(16)
724 : 16 45 resto 4 4
45 : 16 2 resto 13D
2 : 16 0 resto 2 2
3 Svolgi le seguenti operazioni binarie con prova.
a 11011011 + 1101001 =
1111 1
b 11110011 – 1010110 =
0 10
0 1 10
c 111010 * 1101 =
111010 * 0 + 2 + 0 + 8 + 16 + 32 = 58 *
1101 = 1 + 0 + 4 + 8 = 13 =
11
11011 101
101 101 27 5
00111 25 5
101 02
010
4 Il logo della tua scuola è un’immagine di 450 120 pixel a 128 colori. Quanti byte
occupa?
Poiché l’immagine è a 128 colori, basteranno 4 bit per ogni pixel. Quindi puoi fare
la moltiplicazione:
450 120 4 = 216 000
Per avere il numero di byte potrai dividere il risultato per 8.
216000 : 8 = 27 000.
Il logo occuperà 27 000 byte.
5 Se un’immagine a 16,7 milioni di colori occupa 2400 byte, da quanti pixel sarà
composta?
In questo caso le informazioni fornite dall’esercizio sono il numero dei colori e lo
spazio occupato dall’immagine.
Dal numero di colori ricavi lo spazio occupato da ciascun pixel, calcolando il valore
n nell’espressione:
2n v 16,7 milioni
Il risultato è 24 bit, ovvero 3 byte.
Poiché l’immagine occupa 2400 byte, se ogni pixel richiede 3 byte ti basterà effet-
tuare la divisione:
2400 : 3 = 800.
L’immagine è composta da 800 pixel.
1 Completa la seguente tabella di comparazione tra tipi di 2 Effettua le seguenti conversioni di base.
numerazione. a 10111110(2) = ..................(10)
decimale binario ottale esadecimale b 192(10) = ..................(2)
c A3F(16) = ..................(8)
0 0 0 0 d 172(8) = ..................(10)
1 1 1 1 e 723(10) = ..................(16)
2 ............ 2 2
3 ............ 3 ............ 3 Svolgi le seguenti operazioni binarie con prova.
4 ............ 4 ............ a 10111101 + 1010110 =
5 ............ ............ ............ b 11001111 – 1001010 =
6 110 ............ ............ c 101001 * 1011 =
7 111 ............ 7 d 11101 : 110 =
8 1000 ............ ............
9 1001 11 ............ 4 Se hai un’immagine di 360 150 pixel a 256
10 ............ 12 ............ colori, quanti byte occupa?
11 ............ 13 ............
12 ............ ............ ............ 5 Se un’immagine a 16,7 milioni di colori occupa
13 ............ ............ D 32 Kbyte, da quanti pixel sarà composta?
14 1110 ............ E
15 1111 ............ F
16 ............ 20 ............
1 in English, please
Abstract
CODING INFORMATION
Computational systems receive input of data and represent 0 or 1. Hence the computer uses logic and
information, process them by means of a programme binary arithmetic to carry out its operations.
and provide the results in the form of data. The Alphanumeric information is represented by means of
“tangible” parts of a processing system are called the ASCII code (or Unicode). Numerical information
the “hardware” while the programmes are called is represented in different ways depending on whether
“software”. it deals with integers or Real numbers. Images, videos
Information is represented by a sequence of 0s and 1s and sounds are also represented by series of bits with
because the basic unit of memory (bit) is only able to different standards.
3 How many bits per pixel are used in black and white, 8 An image composed of 250 by 100 pixels
grey-scaled and colour images? in 16-bit colour takes up 12,500 bytes. T F
4 What is the minimum number of bits needed to repre- 9 A 256 colour image which takes up
sent 133 different pieces of information? 2,800 bytes is made up of 400 pixels. T F
a 5 b 6 c 7 d 8
Glossary Glossario
Application software: group of programmes created it constitutes the elementary storage cell which can
to solve specific user problems. be individually addressed.
ASCII (American Standard Code for Information Digital: used in contraposition to analogue to indicate
Interchange): represents a 7 bit code for the a discrete state piece of equipment which operates in
transmission or storage of characters. The eighth bit steps, not a continuous scale.
can be used as a parity bit or to extend the number of Processor: system which is able to perform automatic
allowed values from 128 to 256. processing.
Basic software: the part of software created with the Floating point: (exponential) scientific notation of
purpose of resolving not specific processing tasks but real numbers.
problems common to, or connected to, the execution of Output: outward transfer of data, for example, to a
all types of processing, such as, decoding programmes, printer.
file access systems and the like.
Overflow: situation in which the result of an
Binary: system of positional numbering with a base operation is greater than the maximum number
of two with only two possible symbols. which can be represented in the memory cell or in
Bit: abbreviation of Binary-digiT. It represents the the register.
smallest possible quantity of information which can Pixel: dot forming part of an image. It is the smallest
be processed or transmitted. point whose colour and intensity can be controlled.
Byte: a group of 8 consecutive bits. In 8 bit machines Raster: an image seen as a series of points or pixels.
Conoscenze
Conoscere l’importanza e il ruolo dei Sistemi Operativi.
Conoscere la struttura e le componenti di un Sistema Operativo.
Conoscere la classificazione e il funzionamento generale dei Sistemi Operativi.
Conoscere la classificazione e i moduli di gestione delle risorse del Sistema
Operativo.
Conoscere le tecniche di gestione della CPU.
Abilità
Identificare e analizzare gli aspetti funzionali dei principali componenti di un
Sistema Operativo.
Scegliere il tipo di Sistema Operativo adeguato a un determinato ambiente di
sviluppo.
Applicare politiche di gestione delle varie risorse.
Confrontare gli algoritmi di scheduling preemptive e non preemptive.
Prerequisiti
Conoscere la logica di funzionamento di un computer.
Riconoscere le risorse hardware e software di un sistema di elaborazione.
Conoscere la terminologia di base relativa a hardware e software.
Conoscere i principi di funzionamento delle principali unità hardware.
● Introduzione
Il concetto di Sistema Operativo è sicuramente molto ampio e complesso quindi non è
così facile dare un’unica definizione della sua veste funzionale soprattutto perché si tratta di
una classe di applicazioni software per elaboratori elettronici che ha seguito via via il rapido
sviluppo tecnologico dell’informatica e delle telecomunicazioni; avvenuto anche a causa delle
notevoli influenze di mercato. Oltre a questo si deve tener conto anche dello sviluppo com-
merciale dei prodotti che ha portato ogni azienda produttrice, sia di hardware che di program-
mi applicativi a creare un Sistema Operativo proprio non trasportabile su altre macchine. Tale
situazione ha impedito sia la standardizzazione sia la diffusione di modelli operativi condivisi.
I Sistemi Operativi nati sotto queste ipotesi progettuali sono detti sistemi proprietari e
hanno rappresentato un evidente problema alla diffusione di standard operativi, come nel
caso di Unix.
In contrapposizione ai Sistemi Operativi proprietari abbiamo i sistemi aperti, cioè quei Sistemi
Operativi che possono essere usati su hardware di produttori diversi e in qualche caso rendono
disponibili alcune primitive API (Application Program Interface) che possono essere richiamate
dalle applicazioni, favorendo così uno sviluppo orizzontale del mercato del software.
I Sistemi Operativi moderni sono distribuiti su CD-ROM o, in qualche caso, addirittura
preinstallati sulla macchina.
Il Sistema Operativo (SO) può essere visto come un insieme di programmi che governa
e controlla l’uso delle componenti del sistema di elaborazione permettendo all’utente di
utilizzarlo in modo trasparente ed efficace.
Quindi un SO deve poter permettere a ogni utilizzatore:
UÊ `ÊÕÃ>ÀiÊÊ`ÊÃi«ViÊiÊi`>ÌÊÌÕÌÌiÊiÊÀÃÀÃiÊ>Ê`ëÃâiÆÊ
UÊ `ÊÌÌââ>ÀiʽÕÃÊ`iiÊÀÃÀÃiÊ`>ÊÕÌââ>Ài]Êi`>ÌiÊ>`i}Õ>ÌiÊ«ÌV
iÊ`Ê}iÃÌi°
! Genericamente con il termine risorsa si intende un qualsiasi elemento che può essere sia
hardware (CPU, memoria centrale) che software (dati, programmi).
Molti studenti avranno già usufruito dei servizi messi a disposizione dal Sistema Operativo
del loro computer. Tramite questo Sistema Operativo essi hanno potuto utilizzare le varie
componenti hardware del sistema senza averne una conoscenza approfondita. Infatti è
stato possibile caricare in memoria centrale il programma da eseguire, attivare la CPU,
richiedere la lettura di un dato memorizzato su memoria di massa, effettuare delle stampe
ecc. È il Sistema Operativo che si preoccupa di effettuare queste operazioni, frapponendosi
tra la richiesta dell’utente e l’hardware della macchina (figura 1).
Programmi applicativi
Sistema Operativo
Hardware
user Compilatori
mode Editor
Interprete dei comandi
programmi
di sistema
Sistema Operativo
kernel kernel
mode
Non sempre l’utente conosce l’hardware della stampante, ma conosce i comandi specifici
per farla lavorare: può non sapere se si tratta di una stampante a getto d’inchiostro oppure
una laser, se lavora in rete o in locale, ma sa che per stampare il contenuto di un file basta
dare, per esempio da DOS, il comando PRINT.
Un’altra funzione del Sistema Operativo è quella di ripartire una risorsa che è fisicamente
limitata (una sola CPU, una memoria centrale che ha una dimensione ben definita) fra le
tante richieste possibili. Queste funzioni sono espletate tramite le Politiche di gestione che
definiscono le norme scelte per una gestione razionale delle risorse.
esempio
Questo facile esempio aiuterà a comprendere meglio il problema.
Possiedo un libro che voglio regalare a uno studente della classe. Devo decidere quale sarà la
regola da seguire avendo una risorsa limitata (un solo libro) ma tante richieste (gli studenti della
classe). Una regola per ripartire la risorsa potrebbe essere:
s REGALO IL LIBRO ALLO STUDENTE PIá BRAVO OPPURE
s REGALO IL LIBRO ALLO STUDENTE PIá BRAVO IN INFORMATICA OPPURE
s REGALO IL LIBRO ALLO STUDENTE PIá BISOGNOSO
Scelgo, fra quelle possibili, la regola che secondo me risolve meglio il problema. Una volta de-
finita la regola (politica di gestione), tutte le volte che mi troverò in quella situazione, seguendo
la regola risolverò il mio problema.
SISTEMA OPERATIVO
Gestione
Gestione Gestione Gestione
memoria
CPU periferiche informazioni
centrale
Hardware
figura 3 Funzionalità di un SO
● L’interfaccia o shell
Un moderno Sistema Operativo è quindi in grado di gestire migliaia di tipi diversi di
hardware, presentando sempre la stessa interfaccia agli applicativi, ultimamente in modo
sempre più semplice ed efficiente.
L’interfaccia è quella parte del SO che permette all’utente di utilizzare il computer, cioè
di richiederne i servizi.
Le interfacce dei Sistemi Operativi possono avere caratteristiche molto diverse, anche se il
loro compito rimane sempre quello di identificare la richiesta effettuata dall’utente nonché
gli eventuali parametri a essa associati. Si possono distinguere tre approcci possibili basati,
rispettivamente, sull’uso di menu, comandi e icone.
Le interfacce inizialmente più utilizzate sono state quelle a linea di comando, che pre-
sentano una linea evidenziata da un prompt, in cui si dovevano digitare i comandi del
linguaggio di controllo dello specifico linguaggio, come nel caso del DOS.
I comandi hanno una loro sintassi ben definita che viene usata da un modulo del Sistema
Operativo chiamato interprete dei comandi; tale modulo analizza ogni comando ed esegue
le azioni richieste (figura 4).
● Macchine virtuali
Come abbiamo visto nella Lezione precedente la presenza
del Sistema Operativo rende più semplice lavorare con il
calcolatore in quanto fornisce un’immagine astratta di tutte
SISTEMA OPERATIVO le risorse disponibili, indipendentemente da come queste
funzionino. L’utente lavora con una macchina “virtuale”
molto più semplice da gestire, formata da hardware più
HARDWARE
Sistema Operativo (figura 1).
I programmi che compongono il Sistema Operativo sono
suddivisi in livelli di tipo gerarchico. I moduli del livello
più basso si appoggiano direttamente sull’hardware dell’ela-
boratore e costituiscono la più semplice macchina virtuale.
figura 1 Macchina virtuale
I moduli di livello più alto possono richiamare solo moduli
definiti nei livelli inferiori: così i moduli dei livelli superiori
non colloquiano con l’hardware bensì con la macchina vir-
tuale definita nel livello più basso.
HARDWARE
Questo significa che macchine costruite su unità centrali
diverse non possono avere gli stessi moduli del livello più
basso.
M1 M2
Con riferimento a una situazione come quella illustrata in
figura 2 si può notare come la sostituzione dei moduli
M1 e M2 sia sufficiente per far sì che il sistema possa essere
M3 M4 M5 portato su altre macchine. Infatti M3, M4 e M5 non vedono
direttamente l’hardware e non risentono quindi del fatto
figura 2 Moduli del SO che è cambiato. Essi faranno riferimento ai nuovi moduli
M1 e M2 e non devono perciò essere modificati.
Il grado di portabilità di un Sistema Operativo indica quindi la possibilità di utilizzare il
Sistema Operativo su macchine con hardware diverso. Esso è tanto maggiore quanto mino-
re è il costo delle modifiche necessarie.
Se il Sistema Operativo è modulare i costi che si devono sostenere per spostarlo da una
macchina all’altra sono contenuti perché è sufficiente modificare solo i moduli che interagi-
scono con l’hardware, in questo caso il grado di portabilità è tanto maggiore quanto minore
è il costo delle modifiche da apportare.
Il Sistema Operativo può quindi essere suddiviso in livelli in modo che ogni livello possa
solo utilizzare per la sua esecuzione tutte le risorse disponibili nei livelli più interni.
ge nucleo
s ti o n ale
e memoria centr
g e s ti
one periferiche
g e s ti
one informazioni
Questo modello, detto modello a buccia di cipolla (figura 3), rappresenta il SO come
una serie di strati costruiti sopra l’hardware, costituenti ciascuno un modulo.
Partendo dall’interno e andando verso l’esterno possiamo individuare, per il Sistema
Operativo i seguenti livelli:
1. il nucleo;
2. il gestore della memoria;
3. il gestore delle periferiche;
4. il gestore delle informazioni.
Il nucleo contiene le procedure di gestione della CPU e i programmi di risposta alle interru-
zioni. Esso è quello più strettamente vicino alla macchina e dipende quindi dall’hardware.
Il gestore della memoria contiene tutte le routine per gestire l’organizzazione della memo-
ria centrale e operare sui singoli indirizzi delle celle di memoria.
Il gestore delle periferiche contiene tutti i programmi per gestire le singole periferiche
e assegnare i vari dispositivi ai singoli processi che li richiedono in base a una specifica
politica di schedulazione.
Il gestore delle informazioni contiene i programmi di gestione dei file, il file system, che
permettono all’utente di non preoccuparsi delle problematiche della reale allocazione dei
file su supporto magnetico.
Quindi le funzioni svolte da un SO, pur diverse a seconda delle modalità di funzionamento
del sistema sono riconducibili ad alcune categorie ben definite:
1. gestione delle risorse sia hardware (tempo di CPU, spazio di memoria, dispositivi di I/O
ecc.) sia software (file, strutture dati ecc.);
2. definizione di una macchina virtuale di più semplice uso da parte degli utenti, in grado di
nascondere la parte relativa al funzionamento del sistema legata alla struttura dell’hardware
(es. gestione interruzioni, utilizzo dei dispositivi di I/O ecc.). La macchina virtuale mette
a disposizione dell’utente apposite operazioni, dette system call, che gli consentono di
operare a un livello di astrazione maggiore.
Esistono molti tipi di Sistemi Operativi che hanno differenti caratteristiche e funzioni: in
ogni caso le routine che li costituiscono sono programmi eseguibili dalla CPU e come tali
devono essere allocati in memoria centrale (zona dati e zona istruzioni).
Non tutti i programmi che costituiscono il Sistema Operativo possono risiedere contempo-
raneamente in memoria centrale perché ne occuperebbero troppa a danno dei programmi
applicativi: solo il nucleo o kernel del Sistema Operativo (e cioè quei programmi che sono
indispensabili per il funzionamento della macchina) è sempre residente in memoria centra-
le; gli altri moduli risiedono normalmente in memoria di massa e sono portati in memoria
centrale al momento del loro utilizzo. Ogni volta che si accende il computer il nucleo del
SO viene caricato, mediante il bootstrap, in memoria RAM.
Analizziamo ora alcuni parametri che possono dare una valutazione sull’efficienza di un
Sistema Operativo:
UÊ Attività della CPU (%CPU): indica, in percentuale, il tempo di utilizzo della CPU in rap-
porto al tempo di lavoro di tutto il sistema:
Tcpu
%CPU "
Ttotale
dove Tcpu è il tempo di lavoro della CPU e Ttotale = tempo I/O + Tcpu.
UÊ Throughput: indica la produttività del sistema, in quanto misura il lavoro che il sistema
svolge:
N
Throughput "
Ttotale
dove N è il numero di lavori utente e Ttotale = tempo I/O + Tcpu
UÊ Tournaround time: indica il tempo che trascorre tra l’istante rilevato al momento del
lancio del lavoro e l’istante rilevato al momento della sua terminazione:
TT = F – A
dove F coincide con l’istante finale di terminazione e A con l’istante iniziale di elabora-
zione del lavoro.
∑ TT I
ATT = i =1
n
dove TTi sono i tempi di esecuzione degli n lavori considerati.
Nucleo: appartengono a questo livello i moduli per la gestione del processore (traffic con-
troller, job scheduler, process scheduler) e i moduli per la gestione delle interruzioni. Deve:
UÊ VÀi>ÀiÊiÊV>Vi>ÀiÊ«ÀViÃÃÆ
UÊ >ÌiiÀiÊ>}}À>ÌÊÊÃÌ>ÌÊ`iÊ«ÀViÃÃÊiÊ`iÊ«ÀViÃÃÀiÆ
UÊ >V>ÀiÊ>ÊÀÃÀÃ>Ê«ÀViÃÃÀi®ÊÊL>ÃiÊ>ÊÕ>ÊëiVvV>Ê«ÌV>Ê`Ê}iÃÌiÆ
UÊ À>ÃV>ÀiÊÊ«ÀViÃÃÀiÆ
UÊ }iÃÌÀiÊ>ÊÃVÀââ>âiÊÌÀ>ÊÊÛ>ÀÊ«ÀViÃð
Gestore della memoria: appartengono a questo livello i moduli per la gestione della
memoria centrale (Memory Management) e per la determinazione dell’indirizzo fisico di
un’informazione a partire dal suo indirizzo logico. Deve:
UÊ VÃViÀiÊiÊ>ÌiiÀiÊ>}}À>ÌÊÊÃÌ>ÌÊ`i>ÊiÀ>]ʵÕ>Ê«>ÀÌÊÃÊÊÕÃÊiʵÕ>Ê
sono libere;
UÊ `iV`iÀiÊ µÕ>Ì>Ê iÀ>Ê >V>ÀiÊ >Ê }Ê «ÀViÃÃÊ Ê L>ÃiÊ >Ê Õ>Ê Ã«iVvV>Ê «ÌV>Ê `Ê
gestione;
UÊ >V>ÀiÊ>ÊiÀ>Ê>ÊÃ}Ê«ÀViÃÃÊiÊiÀââ>ÀiÊiÊvÀ>âÆ
UÊ À>ÃV>ÀiÊ>ÊiÀ>ʵÕ>`ÊÊ«ÀViÃÃÊ
>ÊÌiÀ>̰
Gestore dell’ I/O: appartengono a questo livello i moduli che controllano il flusso dei
segnali e delle informazioni da e verso le periferiche (Device Management). Deve:
UÊ VÃViÀiÊiÊ>ÌiiÀiÊ>}}À>ÌÊÊÃÌ>ÌÊ`iiÊ«iÀviÀV
iÆ
UÊ `iV`iÀiÊiÊ`>ÌDÊ`Ê>ÃÃi}>âiÊ`iiÊ«iÀviÀV
iÊÊL>ÃiÊ>ÊÕ>ÊëiVvV>Ê«ÌV>Ê`Ê
gestione;
UÊ >V>ÀiÊ>ÊÀÃÀÃ>ÊiÊâ>Àiʽ«iÀ>âiÊ`ÊÉ"Æ
UÊ À>ÃV>ÀiÊ>ÊÀÃÀÃ>°
Gestore della memoria di massa: appartengono a questo livello i moduli che controllano
l’accesso alle informazioni memorizzate su memoria di massa (Data Management). Deve:
UÊ VÃViÀiÊÊÃÌ>ÌÊ`iÊ`ëÃÌÛÊ`ÊiÀ>Ê`Ê>ÃÃ>]ÊÊÀÊÕÃ]ÊÊ`Ê`Ê>VViÃÃÆÊ
UÊ `iV`iÀiÊV
ʫբÊÕÌââ>ÀiÊiÊvÀ>âÊÊL>ÃiÊ>ÊÕ>ÊëiVvV>Ê«ÌV>Ê`Ê}iÃÌiÆ
UÊ >ÃÃi}>ÀiÊ>ÊÀÃÀÃ>Ê>Ê«ÀViÃÃÆ
UÊ À>ÃV>ÀiÊ>ÊÀÃÀÃ>Æ
UÊ VÀi>ÀiÊiÊV>Vi>ÀiÊviÊiÊV>ÀÌiiÆ
UÊ «iÀiÌÌiÀiʽ«iÀ>âiÊ`ÊL>VÕ«°
● Le varie tipologie
Esistono vari modi per classificare i Sistemi Operativi basandosi su varie caratteristiche.
Se consideriamo il modo in cui il Sistema Operativo si presenta all’utente, cioè come il
Sistema Operativo utilizza i dati di ingresso per produrre i risultati, possiamo distinguere
sistemi che effettuano:
UÊ elaborazione a lotti (o batch);
UÊ elaborazione interattiva.
anche se poi, nel dettaglio, ogni SO adotta soluzioni e assume caratteristiche peculiari e
non sempre catalogabili.
Per esempio la procedura che fornisce la stampa del cedolino paga di un dipendente
prevede un’elaborazione di questo tipo: i dati di input (ore di straordinario, giorni di
ferie, permessi ecc.) sono raccolti durante il periodo e sono poi elaborati tutti insieme
alla fine del mese.
I dati devono essere disponibili fin dall’inizio dell’elaborazione perché non si ha la possibi-
lità di interagire con il programma durante la sua esecuzione. Proprio per questo non tutte
le applicazioni sono adatte a questo tipo di elaborazione.
Elaborazione interattiva
L’elaborazione interattiva permette di colloquiare con il programma in esecuzione, influen-
zando quindi l’elaborazione stessa: i dati in ingresso vengono elaborati non appena si ren-
dono disponibili, fornendo subito i risultati.
L’utente vede una propria macchina virtuale con la quale interagire mediante una serie di
comandi.
CPU
Procedure contabili, programmi per il calcolo degli stipendi e tutte le procedure a carattere
periodico vengono realizzate con metodologie a lotti, mentre per procedure in cui è impor-
tante la tempestività dell’aggiornamento come la gestione di un conto corrente bancario o
la prenotazione dei voli, è preferibile la metodologia interattiva.
Attualmente tutti i Sistemi Operativi prevedono entrambi i tipi di elaborazione, in passato
era possibile solamente l’elaborazione di tipo batch.
Sistema
Operativo
Programma
utente
In questo caso la CPU è una risorsa poco utilizzata perché rimane inattiva ogni volta che
vengono eseguite delle operazioni di I/O e nel tempo che intercorre tra il termine di un
lavoro e l’inizio del lavoro successivo (figura 4).
CPU
MC
Sistemi in multiprogrammazione
Sono quei Sistemi Operativi che permettono di allocare più programmi utente in memoria
centrale e di ripartire fra questi l’uso delle risorse (figura 5).
Programma 1
Programma 2
Programma 3
Impiego Impiego
periferica periferica
Lancio P1
Fine 1/0
1/0
1/0
Tempo
1/0 P1
1/0 P1
Lancio P1
Lancio P2
Fine 1/0 P1
Fine 1/0 P2
Fine 1/0 P1
1/0 P2
1/0 P2
Tempo
Per rendere indipendente la CPU dall’attività di ingresso e uscita dei dati e quindi di fatto
per poter realizzare la multiprogrammazione, sono stati introdotti gli elaboratori di canale
che sono dei piccoli elaboratori in grado di eseguire le operazioni di trasferimento dei dati
fra memoria centrale e periferiche e viceversa.
Nel momento in cui il programma in esecuzione richiede un’operazione di I/O, la CPU
avverte l’elaboratore di canale che è necessaria la sua collaborazione e, mentre il canale
esegue l’operazione richiesta, la CPU è libera di essere assegnata a un altro programma che
già si trova in memoria centrale.
Un particolare caso di multiprogrammazione è il multitasking. Particolarmente diffuso nei
sistemi dedicati attuali, permette al sistema di elaborare più applicazioni (chiamate appun-
ÌÊÌ>îÊVÌi«À>i>iÌi°
Sistemi in time-sharing
La soluzione di un Sistema Operativo in multiprogrammazione presenta ancora un incon-
veniente: infatti se un programma non ha richieste di I/O monopolizza la CPU a danno
degli altri che restano in attesa. Per ovviare a questo e per migliorare l’efficienza del siste-
ma è stato introdotto il concetto di quanto temporale (o time slice), cioè un periodo di
tempo durante il quale la CPU lavora per un programma. Scaduto tale periodo, anche se
l’esecuzione del programma non è terminata o se il programma non ha richiesto opera-
zioni di I/O, la sua esecuzione viene sospesa a vantaggio di un altro programma in attesa
di esecuzione.
Ogni utente ha l’impressione di avere a disposizione tutto il sistema.
Quindi se la CPU è gestita in time-sharing essa rimane assegnata a un programma finché:
UÊ Ê«À}À>>ÊÌiÀ>Æ
UÊ Ê«À}À>>ÊÀV
i`iÊÕ½«iÀ>âiÊ`ÊÉ"Æ
UÊ ÃV>`iÊÊÌiÊÃVi°
Appena accade uno di questi eventi il controllo passa al Sistema Operativo che decide a
quale, tra i programmi che si trovano in memoria centrale, spetta il prossimo time slice.
Sistemi distribuiti
Sono quei sistemi in cui più CPU sono connesse tra loro (nodi del sistema) e cooperano
nel raggiungimento di obiettivi comuni; ogni nodo aumenta le capacità di calcolo globale
del sistema e ciò li contraddistingue dai SO multiprogrammati. Il SO non deve soltanto
coordinare l’azione delle CPU ma deve anche integrarne le capacità di calcolo, per esempio
un processo potrebbe essere in esecuzione su più CPU.
Un SO di questo tipo deve fare in modo che ogni utente possa connettersi a una parte
qualsiasi del sistema nello stesso modo, come se tutto fosse immediatamente disponibile.
I SO distribuiti presentano alcuni vantaggi, quali:
UÊ condivisione delle risorse: come per esempio la stampante di un laboratorio;
UÊ velocità di calcolo: può essere distribuita tra le varie postazioni di un sistema;
UÊ affidabilità: se una postazione si guasta le altre postazioni possono farsi carico del suo
lavoro;
UÊ comunicazione: più postazioni collegate tra di loro possono facilmente scambiarsi
informazioni.
Sistemi realtime
Sono sistemi caratteristici delle applicazioni industriali in cui l’avanzamento dei processi è
determinato dagli eventi esterni che determinano l’uso e l’utilizzo della CPU. In essi deve
essere ben gestita tutta la parte riguardante le interruzioni e l’I/O, mentre meno importanza
è data alla gestione della memoria, infatti i programmi devono essere sempre presenti in
memoria centrale.
Sono molto importanti i brevi tempi di risposta. In particolare si parla di tempo reale
stretto per i processi industriali e di tempo reale debole per le prenotazione di voli aerei.
Processore
È un dispositivo che consente
l’evoluzione e il completamento canale 1
di un processo, la CPU. In multi-
programmazione ogni utente ha MC
l’impressione di lavorare con un
SO
suo processore virtuale.
P1 CPU canale 2
P2
canale 3
Un lavoro che deve essere eseguito può trovarsi, in ogni istante in uno “stato”, cioè in una
condizione particolare determinata dalle esigenze del lavoro stesso e dallo stato globale del
sistema (cioè le altre componenti hardware e software).
Descriviamo il ciclo di avanzamento di un programma seguendone tutta la sua storia,
dal momento in cui il lavoro è proposto al sistema a quello in cui termina la sua ese-
cuzione.
Consideriamo come lavoro che deve essere svolto quello di effettuare un viaggio in aereo.
Lo stato indica la situazione in cui si trova il passeggero ed è determinato non solo dalle
esigenze del passeggero ma anche dalle condizioni esterne: per esempio si trova all’aero-
porto in attesa dell’imbarco e l’aereo può essere pronto oppure deve ancora arrivare ed è in
ritardo, oppure è in volo, oppure ancora si trova in un aeroporto di transito per uno scalo
o, finalmente, è arrivato a destinazione.
Ogni stato corrisponde a una situazione in cui si trova il programma da eseguire (è in esecu-
zione, è in attesa della stampante ecc.). Il passaggio da uno stato all’altro è deciso dal Sistema
Operativo sulla base delle politiche di schedulazione. A ogni passaggio corrisponde una transa-
!
zione che è effettuata tramite l’esecuzione di uno specifico programma del Sistema Operativo
(controllore del traffico).
● Stati di un processo
Un processo, dopo la sua creazione e attivazione, può trovarsi in uno dei seguenti stati di
avanzamento:
UÊ hold: il lavoro è stato proposto al sistema. Esso è in attesa di esecuzione e si trova in
memoria di massa (n lavori su disco);
UÊ ready: il programma è diventato processo e si trova in memoria centrale, pronto per
essere eseguito (n processi in memoria centrale);
UÊ run: il processo è in esecuzione (ricordiamo che in ogni istante un solo processo si trova
in questo stato, cioè nella CPU);
UÊ wait: il processo è in attesa (per esempio deve attendere la fine di un’operazione di I/O).
UÊ end: il processo è terminato.
A ogni stato è associata un lista che contiene l’elenco di tutti i processi che si trovano in
quel particolare stato in quel momento.
1 4 END
HOLD READY 3
WAIT
Una volta individuato il programma da caricare in memoria centrale, un altro modulo del
Sistema Operativo (il controllore del traffico) elimina il suo JCB dalla lista di hold e inse-
risce un nuovo *
Ê*ÀViÃÃÊ
ÌÀÊ V®Êi>ÊÃÌ>Ê`ÊÀi>`Þ°
Per esempio nella figura 3 abbiamo la lista di hold e di ready con alcuni processi. Se
lo schedulatore sceglie il processo A dalla coda di hold per farlo passare in quella di ready,
il controllore del traffico provvederà a creare una situazione come quella di figura 4.
1° elemento 1° elemento
A B C B C
H L M M A
H L
Infatti ogni processo ha associato un descrittore di processo PCB che viene creato all’atto
della creazione del processo e memorizzato in memoria centrale per tutta la vita del processo.
Quando la CPU è libera, lo schedulatore dei processi sceglie quale, fra i processi che si
trovano nello stato di ready, mandare in esecuzione assegnandogli la CPU (transizione 2:
di figura 2 ready - run).
Questa volta il controllore del traffico deve modificare lo stato contenuto nel PCB del pro-
cesso portandolo in run.
Quando il processo è in esecuzione si possono verificare degli eventi che portano a liberare
il processore. Questi eventi sono:
UÊ ÌiÀ>âiÊ`iÊ«ÀViÃÃÊÊiÃiVÕâiÆÊ
UÊ ÃV>`iâ>ÊÌiÊÃViÆ
UÊ ÀV
iÃÌ>Ê`Ê«iÀ>âiÊ`ÊÉ"°
Quando viene eseguita l’istruzione di fine, il processo passa nello stato di end (transizione
6: run - end). Per il SO questo processo non esiste più e quindi deve provvedere a eliminare
il suo PCB e a dichiarare libera la memoria centrale che occupava.
Se, durante l’esecuzione viene esaurito il quanto di tempo a lui destinato, il processo che
era in esecuzione deve liberare il processore. Lo stato contenuto nel PCB viene portato in
ready (transizione 4: run - ready).
Se durante l’esecuzione il processo richiede un’operazione di I/O, esso viene portato nello
stato di wait perché per proseguire deve aspettare la fine dell’operazione (transizione 3:
run - wait). Solo quando quest’operazione è terminata il processo potrebbe tornare nello
stato di run, ma poiché la CPU potrebbe essere occupata con un altro processo, esso dovrà
prima ritornare nello stato di ready (transizione 5: wait - ready).
5 Algoritmi di scheduling
Abbiamo visto che uno dei compiti principali del SO è quello di assegnare una risorsa
a un processo e sappiamo che questo avviene seguendo l’opportuna politica di schedu-
lazione.
In generale si può suddividere l’intera attività del gestore dei processi di Sistema Operativo
in alcune sezioni: il Long Term Scheduler (LTS o Job Scheduler), il Short Term
Scheduler (STS o Process Scheduler) e il Medium Term Scheduler (MTS); l’insieme dei
vari livelli di gestione può essere visto come il globale processo di Sistema Operativo chia-
mato schedulatore (Scheduler).
A questo punto il SO, dopo aver attivato il processo deve decidere il criterio con cui asse-
gnargli il tempo di CPU necessario per il suo espletamento, soprattutto in relazione ad
altri processi che potrebbero anche essere concorrenti; in altre parole deve decidere come
gestire gli stati ready e run.
UÊ FIFO: i lavori sono ordinati nella lista in ordine di arrivo. Il primo lavoro inserito nella
lista sarà il primo a passare dallo stato di hold allo stato di ready. È una politica molto
semplice da gestire ma non permette una reale ottimizzazione delle risorse.
UÊ Priorità statica: a ogni lavoro è assegnato un valore (priorità) che indica il livello di
importanza del lavoro. La priorità è memorizzata nel JCB di ciascun lavoro e può essere
assegnata dal responsabile del centro che conosce le esigenze delle varie applicazioni.
Lo schedulatore dei lavori sceglierà allora il lavoro che ha la priorità maggiore: tra quelli
con pari priorità potrà essere usata la politica FIFO.
UÊ Priorità dinamica: affinché non ci siano lavori che permangono troppo tempo in coda
perché ce ne sono altri con priorità maggiore, il Sistema Operativo aumenta il valore
della priorità in funzione del tempo di permanenza del lavoro in coda. Per poter attuare
questa politica è necessario inserire nel JCB un’informazione che indichi il momento di
inserimento del descrittore nella lista cioè il tempo in cui è stata richiesta l’esecuzione
del programma.
>ÊV`>Ê`iÊ«ÀViÃÃÊ«ÀÌÊVÌiiÊÊ`iÃVÀÌÌÀÊ*
]Ê*ÀViÃÃÊ
ÌÀÊ V®Ê`iÊ«ÀViÃÃÊ
pronti (figura 1).
ultimo
C
arrivi dallo stato di hold P end
U
lista dei processi wait
arrivi dallo stato di wait
C
P end
arrivi dallo stato di hold
U
10%
wait
80% operazione
I/O
UÊ Round Robin limitato: è ancora una variante del Round Robin. È prefissato il numero
di time slice che un processo può utilizzare: terminati questi time slice che sono gestiti
con la tecnica del Round Robin tradizionale, il processo è inserito in una nuova coda
che sarà presa in considerazione solo quando la coda del Round Robin verrà esaurita
(figura 4).
coda 1
C
arrivi dallo stato di hold P end
U
wait
arrivi dallo stato di wait
coda 2
UÊ Priorità statica: a ogni processo viene assegnata una priorità in fase di generazione ad
esempio in base al tempo presunto di esecuzione. Lo schedulatore dei processi terrà
conto di questo valore per inserire il processo nella coda.
Esistono inoltre numerose varianti a queste politiche, nonché possibilità di associarne alcu-
ne (per esempio Round Robin e priorità dinamica).
L’assegnazione della CPU a un nuovo processo, qualunque sia l’algoritmo di schedulazio-
ne, comporta il salvataggio dello stato (PCB) del vecchio processo, la scelta del processo da
far avanzare e il caricamento del suo PCB. Il tempo impiegato per il cambio di contesto è
detto overhead di sistema.
L’obiettivo è quindi minimizzare sia il tempo di occupazione della CPU da parte degli
algoritmi di scheduling che l’overhead di sistema.
6 Gli interrupt
Un’interruzione è un segnale hardware, che viene inviato dai vari dispositivi alla CPU.
Quando, invece un processo richiede al Sistema Operativo un’operazione di I/O genera un
interruzione di tipo software detta SVC (Supervisor Call).
La parte del Sistema Operativo che si occupa della gestione delle interruzioni si chiama
interrupt handler, cioè una serie di sotto-procedure che servono a processare i dati inviati
da chi ha interrotto e predisporre lo stesso dispositivo a riceverne di nuovi. Infine, dopo
che il dispositivo è stato servito, riprende a eseguire il programma originale. Tutto questo
avviene in modo trasparente agli occhi dell’utente.
In genere nel Sistema Operativo c’è un solo interrupt handler che riconosce la causa dell’in-
terruzione ed esegue una procedura specifica per gestirla.
Ma è anche possibile trovare Sistemi Operativi in cui ogni tipologia di interrupt è associata
a un tipo di periferica e ognuna ha un proprio interrupt handler eseguito a seconda della
tipologia di interrupt avvenuta. In questo caso è il processore che riconosce l’interrupt e
decide quale procedura di gestione eseguire.
Ricordiamo che la CPU è in grado di eseguire il ciclo di esecuzione delle istruzioni:
begin
repeat
fetch;
decode;
execute;
until fine;
end
begin
repeat
if not interrupt then
begin
fetch;
decode;
execute;
end
else
routine di interrupt;
until fine;
end
La routine di gestione dell’interrupt può essere attivata solo quando la CPU ha completato
il ciclo di esecuzione di un’istruzione. L’interrupt permette quindi di modificare l’esecu-
zione sequenziale delle istruzioni di un programma. A ogni programma in esecuzione è
associato un registro di stato che è un particolare registro che contiene l’insieme delle infor-
mazioni relative all’esecuzione del programma stesso e serve alla CPU per poter operare
sul programma stesso.
Registro di stato
1 3 2
Memoria
centrale
UÊ Program interrupt: istruzione errata di CPU, overflow, violazione delle aree di memoria
protette.
UÊ External interrupt: causata dalla fine del time slice o dal tasto di interruzione (CTRL-
CANC) usato dall’operatore.
UÊ I/O interrupt: comando di I/O errato, canale o dispositivo non correttamente connesso.
● Interrupt multipli
Può succedere che, mentre è in esecuzione la routine di gestione di un interrupt, arrivi alla
CPU un altro segnale di interruzione. In questo caso si può usare il metodo delle interru-
zioni vettorizzate o il ciclo di polling.
Interruzioni vettorizzate
A ogni tipo di interrupt è assegnato un livello di priorità: è possibile interrompere la routine
di gestione dell’interrupt solo se il nuovo interrupt ha un livello di priorità maggiore; in caso
contrario la richiesta non può essere accolta ma rimane ”pendente”: essa sarà accolta solo
quando termina la routine con priorità più alta.
Per questo, in ogni istante, deve essere memorizzata la priorità degli interrupt che possono
essere accolti.
Nel registro di stato viene quindi memorizzata una sequenza di 0 e 1 per cui se l’i-esimo bit
è 0 l’i-esimo interrupt è disabilitato, mentre se è a 1 l’i-esimo interrupt è abilitato. Questo
Ciclo di polling
Se due o più periferiche richiedono contemporaneamente un’interruzione si devono memo-
rizzare le varie richieste. Le periferiche dispongono di un flag che sarà abilitato se è stata effet-
tuata una richiesta di interrupt. Il processore, quando riceve un segnale di interrupt scandisce
i flag di tutte le periferiche ricorrendo a un “ciclo di polling”. Questa operazione, semplice da
realizzare, si chiama di “attesa attiva” ed è molto più costosa, in termini di tempo, di quella
di “attesa passiva” adottata con il meccanismo delle interruzioni vettorizzate.
2 sintesi
➞ L1
➞ L2
➞ L3
➞ L4
5 Elenca le principali transizioni tra i vari stati che può assumere un processo, spe-
cificando quando si verificano.
➞ L4
6 Elenca quali sono le regole che devono soddisfare un buon algoritmo di schedula-
zione.
➞ L5
➞ L5
➞ L6
2 in English, please
Abstract
INTRODUCTION TO OPERATING SYSTEMS
/
iÊ«iÀ>Ì}ÊÃÞÃÌiÊÃÊÌ
iÊL>VLiÊvÊ>Ê«ÀViÃÃ}Ê and needs to be shared among the programmes which
system: without it the hardware could not be used. require its use. Various methods exist to choose which
The most used terms used of an OS are resource, «À}À>iÊ V>Ê «>ÃÃÊ ÌÊ Ì
iÊ ViÌÀ>Ê iÀÞÊ ÜÀÊ
process and scheduling policy. The various ways in scheduler) and to choose which process the CPU (process
which the data is processed allow us to divide operating scheduler) can use. In multiprogramming the processes
systems into Batch and Interactive. The most common compete among themselves which raises the problem of
types of operating systems are: monoprogramming, how to manage the resources they share. Moreover, the
multiprogramming and time sharing. ways in which the CPU is alerted to the occurrence of
The processor is the computer’s most important resource an event are managed by the use of interrupts.
Questions
1 What is an Operating System? 4 What is the main difference between pre-emptive and
2 What is the main type of Operating System? non-pre-emptive scheduling?
3 What does PCB stand for? 5 Which are the main interrupts?
Glossary Glossario
First Come First Served (FCFS):Ê>Ê`ÃÊÃV
i`Õ}Ê software, partial hardware implementations, usually
ÃÌÀ>Ìi}ÞÊÜ
V
ÊÃ>ÌÃviÃÊ`ÃÊÀiµÕiÃÌÃÊÊÌ
iÊÃ>iÊÀ`iÀÊ ÜÊ>ÃÊvÀÜ>Ài]Ê>ÀiÊ«ÃÃLi°
in which they are received Page fault: an interrupt generated when a programme
Interrupt: an asynchronous service request from references a page that is not currently resident in
hardware or software to the CPU. memory.
Interrupt handler: a software routine which processes Polling: technique which examines external device
interrupts. interfaces to determine if the device needs attention.
Linker: a programme which combines two or more Process: the operating system concept of a (dynamic)
object modules into a single object module or into an instance of a programme in execution.
executable file. Process Control Block (PCB): an operating system
Loader: a programme which loads a programme into data structure that characterizes a process.
main memory in executable form. Process state: the status of a process as running,
Multiprocessing: the simultaneous execution of Ài>`Þ]ÊLVi`]ÊiÌV°
two or more computer programmes or sequences of Programme: a static set of instructions which can be
instructions. used as the basis for a process.
Multitasking: mode of operation that provides for the Real time system: a system which must respond in
concurrent, or interleaved, execution of two or more real time to changing conditions.
Ì>ÃÃ]ÊÀÊÌ
Ài>`ðÊ-ÞÞÕÃÊÜÌ
ÊÕÌÌ
Ài>`}° Scheduler: the part of an operating system which
Non pre-emptive: not having the capability of pre- >ÃÃ}ÃÊÀiÃÕÀViÃÊÌÊ«ÀViÃÃiÃ]ÊÌ>ÃÃÊÀÊÌ
Ài>`ð
i«Ì}ÊÀÕ}ÊÌ>Ãð Task: in a multiprogramming or multiprocessing
Operating System: software that controls the environment, one or more sequences of instructions
running of programmes; in addition, an operating ÌÀi>Ìi`ÊLÞÊ>ÊVÌÀÊ«À}À>iÊ>ÃÊ>ÊiiiÌÊvÊÜÀÊ
system may provide services such as resource allocation, to be accomplished by a computer.
scheduling, I/O control and data management. Thread: an independently executable stream of
Although operating systems are predominantly programme instructions.
Competenze
Scegliere dispositivi e strumenti in base alle loro caratteristiche funzionali.
Gestire processi produttivi correlati a funzioni aziendali.
Configurare, installare e gestire sistemi di elaborazione dati.
Conoscenze
Conoscere la classificazione e i moduli di gestione delle risorse del Sistema
Operativo.
Conoscere le tecniche di gestione della memoria centrale.
Conoscere le tecniche per realizzare la memoria virtuale.
Conoscere le funzioni del file system.
Abilità
Analizzare i diversi tipi di rilocazione.
Applicare politiche di gestione delle varie risorse.
Analizzare le tecniche di allocazione dei file su hard disk.
Prerequisiti
Conoscere la logica di funzionamento di un computer.
Riconoscere le risorse hardware e software di un sistema di elaborazione.
Conoscere la terminologia di base relativa a hardware e software.
Conoscere i principi di funzionamento delle principali unità hardware.
Conoscere la struttura e le componenti di un SO.
La memoria è un ampio vettore di word (gruppo di byte), ciascuna con il suo indirizzo;
la CPU preleva le istruzioni dalla memoria, utilizzando il program counter, inoltre una
istruzione può a sua volta generare nuovi accessi alla memoria.
Un programma, prima di essere eseguito, deve essere caricato in memoria centrale: cioè gli
deve essere assegnata una certa quantità di byte di memoria centrale in grado di contenere
la sua zona dati (le variabili) e la sua zona istruzioni (scritte in linguaggio macchina).
Per zona dati si intende quella parte del programma dove sono state definite le variabili e
che dovrà contenere i valori che queste assumeranno durante l’esecuzione. Per zona istru-
zioni si intende la parte del programma che contiene le istruzioni operative.
! Definiamo spazio degli indirizzi di un programma la zona di memoria centrale formata da zona
dati più zona istruzioni (figura 1).
Arrivare allo spazio degli indirizzi fisici è un procedimento abbastanza complesso, quindi
ZONA DATI è meglio chiarire come i programmi eseguibili posseggano i riferimenti agli indirizzi delle
SPAZIO
DEGLI proprie istruzioni e dati, e come il SO li possa gestire sia in fase di caricamento sia in fase
ZONA INDIRIZZI
ISTRUZIONI di esecuzione. Solitamente un programma risiede su disco in formato binario eseguibile e
per essere eseguito deve essere in RAM e divenire processo.
figura 1 Spazio degli Durante la sua esecuzione, può ripetutamente essere trasferito dalla memoria di massa alla
indirizzi di un programma RAM e viceversa.
Il programma può essere trasferito in qualsiasi punto della RAM. Prima di essere eseguito, passa
attraverso vari stadi in cui gli indirizzi vengono rappresentati in modi diversi.
BUS
● La rilocazione
La rilocazione quindi si può definire come la tecnica della traduzione degli indirizzi vir-
tuali in indirizzi fisici.
Tali metodi di rilocazione consistono nella modifica degli indirizzi virtuali relativi, al
momento del caricamento o durante l’esecuzione stessa del programma, effettuando il
ricalcalo degli indirizzi virtuali in indirizzi effettivi, molto spesso operando traslazioni di
indirizzo, per esempio modificando di un valore fisso, ma differente per ogni programma,
ogni indirizzo virtuale.
La rilocazione può essere statica o dinamica. La rilocazione statica è quel meccanismo per
cui il caricatore del SO, dopo aver letto l’intero programma e prima di porlo in esecuzione,
rialloca in memoria tutto il codice adattando gli indirizzi virtuali alle posizioni attualmente
disponibili nella memoria fisica. Richiede un elevato tempo di setup iniziale ed è utilizzato
nei sistemi mono tasking.
La rilocazione dinamica invece è l’insieme dei meccanismi con i quali un SO rialloca il
codice durante l’esecuzione del programma.
In questo caso solo durante l’esecuzione, ogni indirizzo generato dal programma, indirizzo
virtuale, viene tradotto nel corrispondente indirizzo fisico prima di accedere alla memo-
ria. Il codice viene caricato in memoria dal loader in formato rilocabile in una delle zone
disponibili e viene usato un registro base che memorizza l’indirizzo effettivo della prima
locazione di memoria. Durante l’esecuzione, a ogni accesso, si calcola l’indirizzo assoluto.
Ricordiamo che il gestore della memoria (Memory Management) è formato dai moduli del
Sistema Operativo che si occupano di:
UÊ }iÃÌÀiÊ «ÕÌÕ>iÌiÊ Ê ÃÌ>ÌÊ V«iÃÃÛÊ `i>Ê iÀ>Ê vÃV>Ê iÊ ÌiiÀiÊ >}}À>ÌÊ Ê
stato di ogni locazione di memoria (libera o occupata);
UÊ >ÃÃi}>ÀiÊ>ÊiÀ>ÊViÌÀ>iÊ>Ê«ÀViÃÃÊV
iÊiÊv>ÊÀV
iÃÌ>Æ
UÊ }iÃÌÀiÊiÊ«iÀ>âÊ`ÊÃÜ>««}]Ê`Û`Õ>`iÊiÊ«ÌV
iÆ
UÊ Ài>ââ>ÀiʵÕ`ÊiÊ«iÀ>âÊ`ÊÃÜ>«ÊÊiÊÃÜ>«ÊÕÌ]ÊVmÊ>V>ÀiÊiÊ`i>V>ÀiÊiÀ>Ê
ai processi, applicando opportuni meccanismi operativi;
UÊ }iÃÌÀiÊÊÀiVÕ«iÀÊ`i>ÊiÀ>ÊViÌÀ>iʵÕ>`ÊÕÊ«ÀViÃÃÊÌiÀ>°
Con la tecnica dell’allocazione per partizioni, la memoria centrale viene suddivisa in sezio-
ni, dette appunto “partizioni” (figura 1). Ogni processo occupa una partizione e quindi
in memoria centrale potranno esserci tanti processi quante sono le partizioni.
Il gestore della memoria dovrà conoscere in ogni istante lo stato di ogni partizione (libera
o occupata) per poter allocare un programma in una delle partizioni. Inoltre, quando il
processo termina l’esecuzione, il gestore della memoria dovrà rendere disponibile la par-
tizione (figura 2).
SISTEMA
OPERATIVO
PARTIZIONE 1
SISTEMA
OPERATIVO
PARTIZIONE 2
PROGRAMMA
IN ESECUZIONE PARTIZIONE 3
AREA
INUTILIZZATA PARTIZIONE 4
PARTIZIONE 5
Sorge ora il problema circa l’ampiezza delle partizioni: partizioni troppo piccole rendereb-
bero impossibile il caricamento di programmi ampi (a meno di ricorrere alle tecniche di
overlay), partizioni troppo grosse provocherebbero spreco di memoria centrale perché i
programmi occupano, mediamente, solo una parte della partizione.
Inoltre il SO deve controllare che ogni programma faccia riferimento soltanto agli indirizzi
facenti parte dell’area di memoria a esso dedicata.
L’allocazione per partizioni prevede due modalità fondamentali: partizioni statiche e par-
tizioni dinamiche.
● Partizioni statiche
La dimensione delle partizioni può essere determinata dal sistemista responsabile del
centro di calcolo conoscendo l’ampiezza media dei programmi che devono essere eseguiti.
Queste partizioni, una volta fissate non possono essere variate, a meno di riconfigurare il
sistema. Se però la dimensione dei programmi è piuttosto variabile si può avere notevole
spreco di memoria centrale quando vengono caricati programmi molto più piccoli della
dimensione prefissata.
dove:
ID = identificatore della partizione
dimensione (DIM) = dimensione in kbyte della partizione
indirizzo (IND) = indirizzo di memoria centrale da cui inizia la partizione
stato = stato della partizione (libera/occupata)
In figura 3 viene illustrata la situazione della memoria centrale con una partizione pic-
cola, due medie e due grandi e come queste possono essere occupate da diversi programmi,
in figura 4 viene mostrata la corrispondente tabella per gestire le partizioni.
Con la tecnica a partizioni statiche si può vedere come vi possa essere uno spreco di memo-
ria. Inoltre se si vuole caricare in memoria un programma di dimensione superiore a quella
massima prevista, questo non potrebbe essere mai caricato.
Un altro caso limite è quello relativo al caricamento di un programma che non può essere
caricato perché tutte le partizioni sono occupate anche se in ciascuna esiste dello spazio
disponibile, la cui somma è maggiore delle dimensioni del programma. In generale la tecni-
ca a partizioni fisse possiede un grande inconveniente che determina un’ampia frammenta-
zione della memoria. Essendo fissate le dimensioni delle partizioni, naturalmente per ogni
SO
100k
PG1 g 50
150k
m 30
180k
PG2 m 30
210k PG3
220k p 10
g 50
partizione esisterà una parte di memoria inutilizzata creando una notevole frammentazione
interna (alla partizione) calcolata su tutte le partizioni.
Per esempio nella figura 5 si vede il caso di un programma di 20k di spazio che non
può essere caricato anche se lo spazio totale disponibile in memoria centrale è di 35k.
SO
100k
PG1 PARTIZ. 1
140k
150k
PG2 PARTIZ. 2
175k
180k
PG3 PARTIZ. 3
210k
220k PG4 PARTIZ. 4
PG5 PARTIZ. 5
260k
270k area libera
● Partizioni dinamiche
Con la tecnica delle partizioni dinamiche le partizioni non sono fissate a priori ma ne viene
creata una ogni volta che il gestore della memoria deve allocare un programma in memoria
centrale. Sia il numero di partizioni che la loro dimensione sono quindi variabili nel tempo.
All’avvio del sistema ci sarà un’unica grossa partizione che ha dimensione uguale all’area di
memoria centrale che i programmi applicativi possono utilizzare. Quando un programma
deve essere caricato in memoria centrale, il Sistema Operativo crea una nuova partizione
che ha la dimensione uguale a quella del programma; l’area non utilizzata viene considerata
come un’unica partizione che potrà essere occupata (interamente o in parte) da un altro
programma.
Quando un programma termina l’area lasciata libera crea una nuova partizione libera che
potrà essere utilizzata da un altro programma.
Il gestore della memoria dispone di opportune tabelle per tenere memorizzati indirizzi e
dimensioni delle partizioni (tabella delle partizioni) e delle aree lasciate libere (tabella delle
aree libere).
dove:
ID = identificatore della partizione
dimensione (DIM) = dimensione in kbyte della partizione
indirizzo (IND) = indirizzo di memoria centrale da cui inizia la partizione
ID-PGM = identificativo del programma che occupa la partizione
dove:
ID = identificatore dell’area libera
dimensione (DIM) = dimensione in kbyte dell’area libera
indirizzo (IND) = indirizzo di memoria centrale da cui inizia l’area libera
In figura 1 viene illustrata una tipica situazione in cui vi sono quattro programmi che
occupano alcune partizioni e le tabelle corrispondenti a questa situazione.
180k
PG2
210k
PG3 area libera
260k
Tabella delle aree libere
300k ID DIM IND
PG4 1 30 150
2 40 260
350k
3 20 350
370k
In figura 2 viene illustrata la nuova situazione quando viene allocato il programma PG5
che richiede 20k di memoria.
Quando termina il programma PG1 la nuova situazione della memoria centrale e delle
tabelle è illustrata in figura 3.
La tecnica delle partizioni dinamiche può favorire la creazione di aree piccole e distribuite
che non possono essere utilizzate perché la loro dimensione non è idonea al caricamento
di programmi. Infatti programmi di una certa dimensione potrebbero non essere caricati
perché non esiste uno spazio contiguo sufficiente, anche se globalmente lo spazio libero
ci sarebbe come mostrato nell’esempio di figura 4 in cui un programma di 20k non
può essere caricato. In questo caso non si può più parlare di frammentazione interna, ma
PG1
160k
area libera
Per ridurre questo problema il gestore della memoria, quando deve assegnare una partizio-
ne, utilizza una delle seguenti politiche di assegnazione:
UÊ First fit: il gestore della memoria scandisce la tabella delle aree libere assegnando al
lavoro la prima partizione libera che abbia dimensione maggiore o uguale a quella neces-
saria. Con questa tecnica, se la tabella è ordinata in base agli indirizzi di partenza delle
singole partizioni, saranno più frequentemente assegnati indirizzi più bassi di memo-
ria centrale: si favorisce così la creazione di una grossa area libera verso il fondo della
memoria centrale che può essere utilizzata per caricare programmi di grosse dimensioni.
UÊ ÊBest fit: il gestore della memoria scandisce tutta la tabella delle aree libere assegnando al
lavoro la più piccola partizione che lo possa contenere, cioè quella che meglio si adatta
alle dimensioni del programma. Le aree più grandi non vengono frammentate.
Entrambe le strategie proposte non eliminano il problema della frammentazione: può capi-
tare che un programma non possa essere caricato perché non c’è un’area libera abbastanza
grande. Periodicamente dovrà essere fatta un’operazione di compattazione per recuperare
gli spazi liberi in un’unica ampia partizione. Con questa operazione tutti i programmi
presenti in memoria centrale devono essere spostati per poter formare un’unica area libera.
L’operazione di compattamento è piuttosto onerosa perché il sistema deve riorganizzare sia
la tabella delle partizioni sia la tabella delle aree libere.
Per poter effettuare la compattazione è necessario che i programmi siano rilocabili, cioè
che tutti gli indirizzi definiti in essi siano calcolati in forma relativa alla prima istruzione
del programma (come se il programma dovesse essere caricato a partire dall’indirizzo 0 di
memoria centrale).
Al momento del caricamento, che può essere eseguito in qualsiasi zona libera della memo-
ria, gli indirizzi relativi verranno sommati al primo indirizzo di effettivo caricamento,
diventando così assoluti:
Rispettare la contiguità anche nello spazio degli indirizzi fisici significa inevitabilmente
creare problemi di frammentazione, interna o esterna, così come mostrato nelle tecniche
descritte nelle precedenti Lezioni.
Nell’allocazione non contigua si intende che la memoria centrale deve essere allocata in
modo tale che un oggetto logico possa essere messo in aree separate e non consecutive di
memoria fisica.
Chi effettua la traduzione degli indirizzi, durante la loro esecuzione, dovrà stabilire la
corrispondenza tra lo spazio logico degli indirizzi e i corrispondenti indirizzi fisici delle
locazioni di memoria.
● La paginazione
Con la paginazione si risolve quindi il problema della frammentazione: la memoria cen-
trale è suddivisa in blocchi aventi tutti la stessa dimensione e lo spazio degli indirizzi di un
programma è suddiviso logicamente in parti chiamate pagine.
Con questa tecnica si cerca di distinguere la contiguità degli indirizzi propri dello spazio
logico creato dal linker, dall’allocazione in memoria fisica; quindi lo spazio degli indiriz-
zi fisici, nel caso della paginazione, non sarà più contiguo come per gli indirizzi virtuali
generati dal linker.
I blocchi hanno la stessa dimensione delle pagine (in genere multipli di 2k) e l’allocazione
del programma avviene quando in memoria centrale esiste un numero di blocchi liberi pari
o superiori al numero di pagine da allocare.
Mentre le pagine sono logicamente contigue, i blocchi di memoria centrale in cui verranno
caricate possono non esserlo. Per esempio se un programma è costituito da 4 pagine, al
momento della sua allocazione il gestore della memoria dovrà trovare 4 blocchi (anche
sparsi) liberi. Per poter fare questo il Sistema Operativo deve gestire delle tabelle di abbi-
namento fra pagine e blocchi: la tabella delle pagine e la tabella dei blocchi.
dove:
PGM-ID = identificativo del programma
n.pagina = identificativo della pagina
n. blocco = indica il numero del blocco nel quale è memorizzata la pagina
Per poter assegnare i blocchi alle pagine è necessario trasformare gli indirizzi relativi delle
variabili e delle istruzioni contenuti nelle pagine in indirizzi assoluti, in funzione dell’indi-
rizzo di caricamento del blocco.
Questo metodo è evidentemente basato sulla rilocazione dinamica dato che l’operazione
di traduzione viene effettuata a runtime.
Inoltre questa tecnica elimina completamente il fenomeno della frammentazione dato che
le pagine fisiche non necessitano di contiguità e loro stesse sono strutturate in frammen-
tazione.
Rimane però un concetto di frammentazione più sottile; se in un certo istante il SO pos-
siede quattro pagine fisiche libere e il prossimo processo da caricare ne richiede necessa-
riamente cinque o di più, il processo non verrà caricato e quelle quattro pagine saranno
considerate memoria frammentata.
Anche in questo caso il nuovo processo potrebbe essere caricato parzialmente, ma in que- Trashing
sto modo esso potrà produrre effetti collaterali indesiderabili all’intero Sistema Operativo Numero eccessivo di page-fault.
(trashing); in alternativa si potrà decidere per la paginazione su domanda.
Quindi la tecnica della paginazione pura è un sistema di gestione della memoria basato su
rilocazione dinamica e allocazione statica.
● La memoria virtuale
Con le tecniche viste finora un lavoro è portato in memoria centrale solo quando c’è a
disposizione tanta memoria libera in grado di contenerlo. Può accadere che programmi
piuttosto ampi difficilmente trovino il numero necessario di blocchi liberi e che quindi
debbano rimanere in attesa per mancanza di spazio.
D’altro canto è anche prevedibile che, durante l’esecuzione del programma non tutte le
routine vengano eseguite (per esempio una routine di errore sarà richiamata solo quando si
verifica una certa condizione, oppure se il programma è suddiviso in menu, difficilmente,
in una sessione di lavoro, verranno scelte tutte le opzioni presenti nel menu).
Con la tecnica della memoria virtuale si accettano lavori di qualsiasi dimensione (che
vengono parcheggiati in memoria di massa) e si portano in memoria centrale solo quelle
porzioni che devono essere eseguite.
Questi criteri sono seguiti nelle tre strategie principali per la gestione della memoria
virtuale:
UÊ }iÃÌiÊÛÀÌÕ>iÊ>ÊÀV
iÃÌ>Ê`Ê«>}>Æ
UÊ }iÃÌiÊÃi}iÌ>Ì>Æ
UÊ }iÃÌiÊÃi}iÌ>Ì>«>}>Ì>°
Per tenere sotto controllo l’occupazione della memoria il Sistema Operativo deve gestire
queste tabelle:
tabella delle pagine contiene informazioni sulle pagine di ciascun programma;
tabella dei blocchi contiene informazioni sullo stato di ciascun blocco di memoria cen-
trale;
tabella di mappa contiene informazioni per ogni pagina caricata in un blocco;
dove:
PGM-ID = identificativo del programma
n.pagina = identificativo della pagina
indir. mm = indica l’indirizzo di memoria di massa di caricamento della pagina
stato = indica se la pagina è caricata in memoria centrale (=1) oppure no (=0)
dove:
n. blocco = indica il numero del blocco
indirizzo = indica l’indirizzo di Memoria Centrale di caricamento del blocco
stato = indica lo stato del blocco (libero/occupato)
tabella di mappa
PGM-ID n. pagina n. blocco
dove:
PGM-ID = identificativo del programma
n. pagina = identificativo della pagina
n. blocco = identificativo del blocco occupato dalla pagina
● Tecniche di rimpiazzamento
Le tecniche più usate sono:
UÊ FIFO: viene rimpiazzata la pagina che da più tempo risiede in memoria centrale, cioè
la più vecchia. La prima pagina che è entrata sarà la prima a uscire in caso di necessità.
Per realizzare questo algoritmo è necessario che la tabella di mappa contenga un campo
per inserire l’informazione inerente il tempo in cui la pagina è stata caricata. Non è
detto però che la pagina più “vecchia” non venga usata dopo poco. In un programma
organizzato a menu, per esempio, la prima pagina sarà proprio quella del menu, e verrà
riutilizzata con una certa frequenza.
UÊ AlgoritmoÊ,1ÊL-/ÊR
/9ÊUSED): viene rimpiazzata la pagina che da più tempo
non è usata (la più vecchia d’uso). Quella che da più tempo non è usata, presumibilmen-
te non sarà richiesta entro breve tempo. Per realizzare questo algoritmo è necessario che
la tabella di mappa contenga un campo per registrare il momento in cui è stato richiesto
per l’ultima volta l’uso della pagina.
UÊ AlgoritmoÊ ,1ÊN"/ÊR
/9ÊUSED): si cerca di eliminare una pagina non utilizzata di
recente, non necessariamente quella non usata da più tempo. In questo modo la gestione
si semplifica. L’efficacia di questa tecnica è simile alla precedente ma è di più semplice
implementazione.
Per diminuire ancora i costi delle operazioni di swap il Sistema Operativo può usare
l’accorgimento di inserire nella tabella di mappa un bit (bit di variazione) che è posto ini-
zialmente a 0; quando la pagina subisce delle variazioni il bit è posto a 1. Al momento di
effettuare lo swap out, se il bit di variazione è 0 non è necessario ricopiare in memoria di
massa la pagina perché non è stata modificata; sarà necessario il trasferimento fisico della
pagina solo se il bit di variazione vale 1.
Questa informazione può essere anche utilizzata per la scelta della pagina vittima: infatti,
a parità di tempo di permanenza nella memoria centrale è sempre meglio scegliere una
pagina non modificata.
Il fenomeno del trashing si potrebbe generare se, per esempio, si decidesse di rimpiazzare
una pagina molto utilizzata nel corso della vita del processo, tale situazione provochereb-
be numerosi pagefault; inoltre il problema potrebbe ripetersi anche se un processo non
potesse avere caricate in memoria il minimo, ma necessario, numero di pagine più spesso
utilizzate.
Il primo problema si risolve adottando un algoritmo intelligente per la scelta della pagina
da rimpiazzare, mentre al secondo si può rimediare prendendo per esempio il modello
detto Working Set.
Si definisce Working Set di un processo in un certo istante l’insieme delle pagine virtuali Page fault
utilizzate correntemente dal processo in quell’istante, naturalmente durante la vita un pro-
Quando un processo cerca di ac-
cesso può possedere diversi Working Set. cedere a una pagina non carica in
Se, per esempio, il SO potesse garantire in memoria di volta in volta il Working Set cor- memoria fisica.
rente il tasso di pagefault diminuirebbe sensibilmente per il processo.
Quando si parla di memoria virtuale, si intende che i programmi non sono caricati per
intero in memoria centrale. Si deve quindi pensare a una suddivisione da effettuare su ogni
programma. La tecnica della paginazione, vista nella precedente Lezione è deterministica e
dipende dalla dimensione predefinita staticamente per i blocchi di memoria. Con la gestio-
ne virtuale segmentata i programmi vengono divisi in segmenti di dimensione variabile
secondo la logica del programma.
Nella paginazione si fa una suddivisione in pagine indipendentemente da quello che con-
tengono, utilizzando un criterio fisico. Nella segmentazione, la suddivisione in segmenti
viene fatta a seconda del significato del contenuto, utilizzando quindi un criterio logico.
● Segmentazione
In un sistema a memoria virtuale basato sulla segmentazione il programma viene diviso
in porzioni, dette segmenti, che corrispondono a unità logiche definite dal programmatore
come per esempio un array, un tabella, una routine.
Lo spazio degli indirizzi di un programma si può allora pensare composto da diversi seg-
menti che vengono caricati in memoria centrale solo quando se ne presenta la necessità.
Per esempio in figura 1 possono essere definiti 5 segmenti (TAB1, TAB2, MAIN,
PROC1 e PROC2) che saranno caricati in memoria centrale solo se richiesti dall’esecuzione.
PROGRAMMA
ZONA TAB1
DATI TAB2
MAIN
.......................
.......................
ZONA PROC1
ISTRUZIONI .......................
.......................
PROC2
.......................
.......................
Tramite la tabella dei segmenti il gestore della memoria conosce, in ogni istante, la situazione
dei segmenti del programma in esecuzione:
dove:
n. segm. = identificativo del segmento
dimensione (DIM.) = dimensione in byte del segmento
stato = indica se il segmento è caricato in memoria centrale (=1) oppure no (=0)
indirizzo = indica l’indirizzo di memoria centrale da cui parte il caricamento del
segmento
Se un processo fa riferimento a un segmento che non è presente in memoria centrale
viene generato un interrupt (segment fault) e il Sistema Operativo deve provvedere al suo
caricamento.
La segmentazione è di fatto una generalizzazione della gestione a partizioni dinamiche: in
questo caso i segmenti possono essere allocati in un’area di memoria che ha le loro esatte
dimensioni.
SO
SEGMENTO 1
180k
SEGMENTO 2
280k
300k
340k
SEGMENTO 3
carle tutte in memoria nello stesso tempo, viene caricato in memoria solo il programma
principale, mentre le altre parti vengono richiamate solo quando servono.
La gestione della memoria con la segmentazione presenta ancora alcuni problemi per-
ché:
UÊ >ÊiViÃÃÌDÊ`iÊV«>ÌÌ>iÌÊ>ÕiÌ>Ê>ÊV«iÃÃÌDÊ`i>Ê}iÃÌiÆ
UÊ >Ê`iÃiÊÊvÃÃ>Ê`iÊÃi}iÌÊ`iÊ«À}À>>ÊÊ}>À>ÌÃViÊÊÛ>Ì>}}Ê`Êi
rizzazione guadagnata nell’organizzazione a blocchi della memoria di massa;
UÊ >Ê`iÃiÊ>ÃÃ>Ê`ÊÕÊÃi}iÌÊmÊÌ>Ì>Ê>>Ê`iÃiÊ`i>ÊiÀ>ÊvÃV>Æ
UÊ iÊÌiVV
iÊ«iÀÊÀ`ÕÀÀiÊÊÃi}iÌÊv>ÕÌÊÃÊ«ÙÊV«iÃÃiÊ`i½iµÕÛ>iÌiÊi>Ê}iÃÌ
ne paginata.
PAGINA 4
PAGINA 1
PAGINA 2
SEGMENTO 2
INDIRIZZO
NUMERO NUMERO
SEGMENTO PAGINA DISPLACEMENT
● Interfacce
Nel sistema è presente un’area (buffer o registro dati) destinata a parcheggiare i dati prove-
nienti dall’elaboratore e diretti verso la periferica e viceversa; tale area serve per garantire
l’indipendenza tra i tempi di lavoro delle varie componenti che hanno caratteristiche ben
diverse. Poiché i tempi di elaborazione della CPU sono notevolmente superiori rispetto
a quelli di una periferica è necessario realizzare un meccanismo di sincronizzazione per
evitare situazioni di errore.
Scopo del registro dati è quello di rendere asincrono il modo di operare delle periferiche
rispetto al modo di operare dell’elaboratore (figura 1).
P
E
R
I
REGISTRO F
CPU
DATI E
R
I
C
A
figura 1 Collegamento tra CPU e periferica con l’uso del registro dati
Per realizzare l’operazione di scrittura la CPU pone i dati da stampare o da visualizzare nel
buffer che la periferica è in grado di prelevare secondo i suoi tempi di lavoro. È necessario
che queste operazioni siano sincronizzate: la CPU non può inserire dati nel buffer se questo
è già pieno e d’altro canto la periferica potrà prelevarli soltanto se il buffer non è vuoto.
P
BUS DATI REGISTRO BUS DATI
E
DATI R
C I
P F
U E
BUS SEGNALI UNITÀ BUS SEGNALI R
DI I
CONTROLLO C
A
Il registro dati comunica con l’unità centrale attraverso il bus dei dati, mentre l’unità di
controllo comunica attraverso il bus dei segnali di controllo.
Al momento di una richiesta di operazione di I/O la CPU invia all’unità di controllo asso-
ciata all’interfaccia il segnale di avvio. A questo punto l’unità di controllo dell’interfaccia
gestisce il trasferimento attivando la periferica che preleva le informazioni dal registro dati.
Al termine dell’operazione l’unità di controllo dell’interfaccia invia alla CPU l’interrupt di
fine I/O.
● Elaboratori di canale
Gli elaboratori di canale sono dei piccoli elaboratori in grado di eseguire le operazioni di
trasferimento dei dati fra memoria centrale e periferiche e viceversa.
Nel momento in cui il programma in esecuzione richiede un’operazione di I/O, la CPU
avverte l’elaboratore di canale che è necessaria la sua collaborazione e, mentre il canale
esegue l’operazione richiesta, la CPU è libera di essere assegnata a un altro programma che
già si trova in memoria centrale.
unità nastro1
CPU canale2
unità disco2
canale3
unità nastro2
Dopo aver attivato il canale, la CPU è libera di dedicarsi a un altro lavoro. Il canale, con un
segnale opportuno, avvertirà la CPU quando ha terminato la sua operazione.
Gli elaboratori di canale sono controllati dalla CPU nella forma MASTER_SLAVE nel senso che
la CPU può sempre controllare l’operato del canale (attivarlo, analizzarne lo stato, inter-
romperlo) ma mai viceversa.
Il gestore delle periferiche (Device Management) è quel modulo di Sistema Operativo pre-
posto alla gestione dei canali e delle periferiche. Esso deve:
UÊ `iV`iÀiÊ>ʵÕ>iÊ«ÀViÃÃÊ>ÃÃi}>ÀiÊÕ>Ê«iÀviÀV>Æ
UÊ VÃiÀÛ>ÀiÊÊÃÌ>ÌÊ`ÊÌÕÌÌiÊiÊ«iÀviÀV
iÆ
UÊ >ÃÃi}>ÀiÊiÊ«iÀviÀV
iÊ>Ê«ÀViÃÃÆ
UÊ }iÃÌÀiÊÊÀ>ÃVÊ`i>Ê«iÀviÀV>°
Per poter espletare queste funzioni il Device Management si avvale di due descrittori:
1. Descrittore della periferica (Unit Control Block UCB) che contiene queste informazioni:
UÊ `iÌvV>ÌÛÊ«iÀviÀV>Æ
UÊ ÃÌ>ÌÊ`i>Ê«iÀviÀV>ÊLiÀÉVVÕ«>Ì®Æ
UÊ ÃÌ>Ê`i}Ê`iÌvV>ÌÛÊ`iÊV>>Ê>ÃÃV>ÌÊ>>Ê«iÀviÀV>Æ
UÊ ÃÌ>Ê`iÊ«ÀViÃÃÊÊ>ÌÌiÃ>Ê`i>Ê«iÀviÀV>°
È necessaria una Unit Control Block per ogni periferica presente nel sistema.
2. Descrittore di canale (Channel Control Block CCB) che contiene queste informazioni:
UÊ `iÌvV>ÌÛÊ`iÊV>>iÆ
UÊ ÃÌ>ÌÊ`iÊV>>iÊLiÀÉVVÕ«>Ì®Æ
UÊ ÃÌ>Ê`i}Ê`iÌvV>ÌÛÊ`iiÊ«iÀviÀV
iÊ>ÃÃV>ÌÊ>ÊV>>iÆ
UÊ ÃÌ>Ê`iÊ«ÀViÃÃÊÊ>ÌÌiÃ>Ê`iÊV>>i°
È necessaria una Channel Control Block per ogni canale presente nel sistema.
Il modulo software che si occupa di associare ai processi che ne fanno richiesta, i dispositivi
individuati come liberi dal modulo traffic controller è l’I/O scheduler.
Se le richieste sono inferiori al numero di dispositivi, non si presentano problemi; vicever-
sa l’I/O scheduler dovrà effettuare l’assegnazione stabilendo una gerarchia fra le richieste
inoltrate.
Le politiche di schedulazione applicate dall’I/O scheduler, possono variare da sistema a
sistema. In generale può essere una buona politica, quella di associare a un processo la
stessa priorità assegnatagli dal process scheduler.
In base alle caratteristiche hardware delle periferiche, esse possono essere assegnate ai
processi secondo le seguenti modalità.
● Dispositivi dedicati
La periferica è assegnata al processo per tutta la durata della sua elaborazione. È questo
il caso dei nastri e delle stampanti: per esempio la stampante non può essere ripartita
fra vari processi altrimenti si mescolerebbero le righe di output dei diversi lavori. Tali
dispositivi vengono allocati a un processo e conservati fino a fine lavoro. Il processo
richiedente aspetta il suo turno per ottenere l’uso esclusivo della risorsa.
L’uso delle risorse risulta quindi abbastanza inefficiente. Un processo potrebbe usare poco
una risorsa e tenerla comunque allocata per molto tempo a discapito di altri processi.
● Dispositivi condivisi
La periferica può essere assegnata a diversi processi. È il caso dei dischi, sui quali possono
essere lette o scritte informazioni da processi diversi senza procurare inconvenienti. Se
due processi richiedono contemporaneamente l’uso di un disco è necessario stabilire un
criterio per determinare quale richiesta debba essere esaudita per prima. La politica di
gestione consiste nel suddividere logicamente il dispositivo (es. il disco) in diverse aree di
utilizzo ognuna delle quali viene assegnata a un particolare processo. In questo modo ogni
processo ha l’impressione di disporre di un dispositivo dedicato.
● Dispositivi virtuali
Con le tecniche di allocazione dedicata e condivisa non si risolve il problema della sincro-
nizzazione fra processi e periferiche. Spesso capita che i processi lavorino a una velocità
superiore a quella dei dispositivi periferici. Infatti le periferiche dedicate costituiscono un
“collo di bottiglia” per l’efficienza del sistema perché se per esempio la stampante è asse-
gnata a un processo, tutti gli altri che la richiedono dovranno attendere la conclusione del
processo in esecuzione per poter avanzare. Per ovviare a questo problema alle periferiche
reali vengono associate delle aree su disco che costituiscono delle periferiche virtuali. In
questo caso viene utilizzato un dispositivo di memoria ad alta velocità, solitamente un
disco, per simulare la periferica. Il processo selezionato dall’I/O scheduler invia (o preleva)
i dati in un’area del disco e non direttamente alla periferica potendo così sfruttare una
maggiore velocità di trasferimento.
esempio
Se durante l’esecuzione il processo PR1 deve stampare una riga, lo farà nella propria stampante
virtuale SP1. Quando il processo PR2 dovrà stampare, potrà farlo sulla stampante virtuale SP2
anche se PR1 non ha ancora terminato la stampa. Quando PR1 avrà terminato ed effettuerà
una operazione di chiusura, allora il contenuto di SP1 verrà inviato, riga per riga, alla stampante
reale (figura 1).
Area di SPOOL
PR1 SP1
PR2 SP2
PR3 SP3
Il SO si deve anche occupare della gestione delle informazioni memorizzate sulla memoria
secondaria (memoria di massa) e tale gestione deve essere trasparente per l’utente.
L’insieme dei programmi del Sistema Operativo preposto alla gestione delle informazioni
memorizzate sulle memorie di massa costituisce il file system.
Il file system consente all’utente di utilizzare gli archivi memorizzati su memoria di massa
senza preoccuparsi dell’effettiva modalità di memorizzazione e di tutti i problemi connessi
con tale utilizzo, facendo riferimento ai file solo con nomi simbolici. È il file system che
regola l’allocazione, il ritrovamento e la protezione dei file sulle memorie di massa.
In particolare esso deve:
UÊ V>Ì>}>ÀiÊ ÌÕÌÌÊ Ê viÊ «ÀiÃiÌÊ ÃÕ>Ê iÀ>Ê `Ê >ÃÃ>Ê ÕÌââ>`Ê ««ÀÌÕiÊ Ì>LiiÊ
memorizzate sulla memoria di massa stessa;
UÊ >ÃÃi}>ÀiʽÕÃÊ`ÊÕÊviÊvÀi`Ê>}ÊÕÌiÌÊiVV>ÃÊ`Ê«ÀÌiâiÊÃÕ½>VViÃÃÆ
UÊ }iÃÌÀiÊÊ`ÊÌÌ>iÊÊë>âÊ`ëLiÊÃÕ>ÊiÀ>Ê`Ê>ÃÃ>Ê«iÀÊ`iÌiÀ>ÀiÊ
in quale punto memorizzare nuove informazioni;
UÊ Ì}iÀiʽÕÃÊ`i>ÊÀÃÀÃ>ʵÕ>`ÊÊmÊ«ÙÊiViÃÃ>À>°
Un generico file system può essere composto dai seguenti moduli software:
UÊ file system simbolico: esamina le richieste dell’utente e individua dove sono memoriz-
zate le informazioni;
UÊ file system di base: estrae dalle directory le informazioni relative ai file richiesti;
UÊ file system logico: trasforma il numero del record logico nella posizione del primo byte
del record nel file;
UÊ file system fisico: determina la posizione fisica effettiva partendo dal numero del record
logico.
Esiste anche il file system virtuale (VFS) che permette un accesso al file system reale
attraverso delle funzioni standard e indipendenti dal file system reale e dal supporto di
memorizzazione.
Esso fornisce un’interfaccia comune rispetto ai diversi file system, locali o accessibili tra-
mite rete (figura 1).
PR3 1
DISCO DISCO 2 DISCO i RETE
dove:
ID-file = identificativo del file
lung. rec. = lunghezza record
n. rec. = numero record
indirizzo = indirizzo primo blocco
accesso = accesso permesso (solo lettura, lettura e scrittura)
creazione = data creazione
modifica = data ultima modifica
La directory viene aggiornata dal file system ogni volta che si crea o si cancella o si modifica
un file: per sveltire queste operazioni, quando è richiesto l’uso di una memoria di massa,
la directory è portata in memoria centrale sotto forma di tabella.
La tabella directory può essere anche molto ampia e occupare troppo spazio in memoria
centrale. Per semplificare le operazioni di ricerca e di gestione, la tabella directory viene
suddivisa in due parti: la directory simbolica e la directory di base.
La directory simbolica contiene, per ogni file, il nome simbolico e un puntatore al record
della directory di base in cui sono contenute tutte le informazioni riguardanti il file. La
directory di base contiene invece l’insieme completo delle informazioni.
directory simbolica
num. ID-file ID
dove:
num. = numero progressivo
ID-file = identificativo del file
ID = identificativo del file all’interno della directory di base
directory di base
ID-file lung. rec. n. rec. indirizzo accesso creazione modifica ID
Quando l’utente richiede la creazione di un nuovo file, il file system deve controllare che
esso non sia già presente nella directory e aggiungere la riga opportuna nelle tabelle.
Nel caso di cancellazione di un file, il file system, dopo averne controllato l’esistenza, eli-
mina dapprima solo logicamente le righe opportune in modo da poter ancora recuperare le
informazioni con specifici comandi nel caso si sia cancellato erroneamente un file. Seguirà
in un secondo momento la cancellazione fisica delle righe delle tabelle.
Il modulo di file system presentato è una semplificazione della realtà. I moderni file system
usano un sistema gerarchico di directory strutturato ad albero nel quale si possono definire
sottodirectory per raggruppare i file. Per esempio nei Sistemi Operativi Windows e Unix
è possibile raggruppare i file per argomento inserendoli nelle varie sottodirectory come
illustrato in figura 2.
Solo la radice (root) risiede in un’area prefissata di sistema; le sottodirectory possono tro-
varsi ovunque nel disco e avere dimensioni diverse. Nella root è presente il puntatore al
primo blocco che le sottodirectory occupano. A loro volta le sottodirectory possono conte-
nere voci descrittive ad altre ancora, generando la familiare struttura ad albero.
ROOT
SOTTODIRECTORY
FILE 2 FILE N
● Meccanismi di protezione
Un semplice meccanismo di protezione dei file è quello di inserire nella directory l’in-
formazione relativa al tipo di operazioni permesse sui dati contenuti nel file (R = lettura,
W = scrittura, RW = lettura e scrittura). In questo modo a tutti gli utenti è permesso lo
stesso tipo di accesso: in genere può invece capitare che lo stesso file debba godere di pro-
tezioni diverse a seconda dell’utente che uno usa. Si pensi per esempio al file contenente
Il controllo dell’accesso viene allora gestito con metodi più complessi che utilizzano strut-
ture dati più adatte allo scopo.
Per esempio si può utilizzare una matrice di controllo: ogni casella della matrice contiene
un’informazione relativa alla possibilità di accesso (accesso vietato, solo lettura, lettura e
scrittura ecc.) da parte dell’utente che corrisponde a una colonna per il file che corrisponde
alla riga.
Per esempio:
FILE1 R R R R
FILE2 R/W R/W N R
FILE3 R/W R R/W R
Un simile metodo, anche se molto sofisticato e sicuro, richiede molto spazio. Una notevole
riduzione nello spazio di memoria occupato si ottiene introducendo l’uso di una parola
chiave che viene associata a ogni file. Può accedere al file solo chi conosce la parola chiave.
In alcuni sistemi come Unix vengono definite solo tre classi di utenti (User, Group,
Others), cioè utente, l’utente dello stesso gruppo del proprietario e utente qualsiasi.
In presenza di un DBMS il controllo degli utenti che accedono ai file che costituiscono la
base dati e la protezione dei dati dagli accessi non autorizzati sono affidati allo stesso DBMS
che rappresenta quindi un’estensione del file system.
In modo molto intuitivo siamo soliti considerare un file come una sequenza di record logici
contigui. Se fisicamente i record fossero così memorizzati sorgerebbero notevoli problemi
al momento dell’inserimento di record in un file già esistente in quanto sarebbe necessario
dichiarare, in fase di creazione del file, quanto spazio è necessario per memorizzare l’intero file
in modo che il Sistema Operativo riservi la porzione di disco adeguata. È anche prevedibile che
non tutto lo spazio richiesto sarà poi realmente utilizzato con conseguente spreco di memoria.
Inoltre in memoria potrebbe non esservi un numero sufficiente di byte liberi contigui.
Per risolvere questi problemi è importante rilevare la differenza tra la struttura logica di un
file e la sua struttura fisica.
Mentre logicamente i record sono uno di seguito all’altro, fisicamente possono essere
memorizzati in maniera discontinua, nel senso che i record del file possono essere allocati
in blocchi fisici separati.
Ricordiamo che:
UÊ record (o blocco) fisico è la quantità di byte, di lunghezza prefissata, dipendente dalla
struttura hardware, che è trasferita dalla memoria centrale alla memoria di massa o vice-
versa con un’unica operazione di I/O;
UÊ record logico è l’insieme delle informazioni relative a un’entità logica ed è definito
dall’analista a seconda delle esigenze dell’applicazione;
UÊ v>ÌÌÀiÊ`ÊLVV è il numero di record logici contenuti in un record fisico.
I record di un file possono essere (figura 1):
UÊ ÃLVV>Ì se ogni record fisico contiene un solo record logico (fattore di blocco = 1);
UÊ LVV>Ì se ogni record fisico contiene più di un record logico (fattore di blocco > 1)
UÊ ÕÌLVV se occorrono più record fisici per memorizzare un record logico (fattore di
blocco minore di < 1).
GAP GAP
C) RECORD 1 RECORD 1
GAP GAP
A) record sbloccati B) record bloccati C) record multiblocco
● La FAT
L’accesso al disco è regolato dalla File Allocation Table, detta anche FAT, è stata sviluppata
per MS-DOS e successivamente utilizzata nei Sistemi Operativi Microsoft Windows. È un
sistema abbastanza semplice ed è suppotato da quasi tutti i Sistemi Operativi moderni.
● Tipi di allocazione
Ogni blocco fisico contiene, oltre ai record logici in esso memorizzati, il puntatore al blocco
logicamente successivo. Per poter agevolmente reperire le informazioni contenute in un 0 1 2
file è quindi sufficiente inserire nella directory di base l’indirizzo del primo blocco fisico;
3 4 5
l’indirizzo del blocco successivo è definito attraverso il puntatore contenuto nel blocco
stesso (figura 2). 6 7 8
9 10 11
Questo tipo di allocazione, detta a blocchi concatenati, risulta valido per memorizzare file
sequenziali, dove è comunque sempre necessario scandire il file dall’inizio per trovare una
informazione.
Nel caso di file ad accesso diretto è intuitivo capire come questa organizzazione risulti ina-
DIRECTORY
deguata. Una soluzione deriva dall’uso di un file (chiamato indice dei blocchi), memorizzato
NOME IND LUNG
sulla memoria di massa che contiene per ogni file la sequenza dei puntatori ai vari blocchi
del file. Nella directory di base è inserito il puntatore al file indice dei blocchi. Quando il
SOLE 5 4
file è aperto, il file indice viene portato in memoria centrale.
L’accesso diretto consiste allora in una ricerca nella tabella indice per poi passare diretta-
mente alla lettura del blocco che contiene il record voluto (figura 3).
figura 2 Allocazione
a blocchi concatenati
DIRECTORY
NOME IND LUNG
0 1 2
LUNA 6 3
3 4 5
6 7 8
9 10 11
3, 7, 10 INDICE DEI BLOCCHI
Per gestire agevolmente lo spazio libero il file system deve avere una tabella con l’indica-
zione dei blocchi liberi da poter reperire. Questa tabella (viene chiamata bit map) perché in
realtà è un insieme di bit dove ciascun bit corrisponde a un blocco: se l’i-esimo bit vale 0
l’i-esimo blocco è libero, se l’i-esimo bit vale 1 l’i-esimo blocco è occupato.
esempio
00101110000
UÊ SSTF (Shortest Seek Time First): si scelgono le richieste che danno il minimo tempo di seek
rispetto alla posizione corrente della testina. Con questa politica si ottimizzano i tempi di
accesso anche se si privilegiano le richieste relative a tracce situate in posizioni centrali. Può
condurre ad attese indefinite se nella coda arrivano continuamente richieste a blocchi vicini
alla posizione corrente. Le richieste a blocchi lontani possono non venire mai servite. Con
questo algoritmo si avrà, per l’esempio precedente la situazione di figura 5.
UÊ C-SCAN (per scansione circolare): è una variante dello SCAN. La testina si sposta da un
estremo all’altro ma quando giunge l’estremo opposto non torna indietro ma riparte dall’ini-
zio del disco trattandolo come una lista circolare. Questa politica garantisce un tempo di
attesa meno variabile rispetto allo SCAN e maggiore omogeneità nel rispondere alla richieste.
Con questo algoritmo si avrà, per l’esempio precedente la situazione di figura 7.
Altri fattori che possono influenzare la scelta della politica di scheduling sono:
UÊ la posizione delle directory e dei blocchi indice;
UÊ il metodo per l’assegnazione dei file (se è concatenato o indicizzato ci vogliono movi-
menti della testina);
UÊ il numero e il tipo di richieste.
3 sintesi
➞ L1
➞ L2
➞ L3
➞ L4
➞ L5
6 Illustra i principali vantaggi della gestione della memoria virtuale con la segmen-
tazione.
➞ L6
7 Quali sono i compiti dell’unità di controllo nel collegamento tra CPU e periferiche?
➞ L7
8 Illustra le varie modalità con cui le periferiche possono essere assegnate ai pro-
cessi.
➞ L8
➞ L9
➞ L10
Questions
1 What is the meaning of Spatial Locality and Temporal Locality?
2 What is the meaning of SPOOL?
3 What is swapping?
4 What is a page fault?
5 What are the principal jobs of Memory Management?
6 When does a deadlock happen?
7 In the main memory we can find:
a users’ and operating system programmes only, not data
b both users’s programmes and data
c operating system programmes and users’s data, not users’s programmes
d the operating system only
8 A hard partitioning of main memory implies:
a that memory is divided in two equal sections
b granting every process the minimum amount of memory only
c that memory is divided in sections of various dimension
d the use of a single partition
9 System overhead:
a is the number of processes executed per unit time
b happens when every process takes too much time
c is the time it takes to execute operating system programmes
d none of the previous answers is correct
10 In looking for a free memory block:
a best fit policy optimizes memory allocation
b first fit policy is the quickest
c best fit policy is always better than first fit policy
d first fit policy is always better than best fit policy
3 in English, please
Glossary Glossario
Best fit: a placement strategy which selects the smallest SCAN: a disk scheduling strategy which satisfies the
space from the free list which is large enough. pending disk request which is physically closest to
Circular SCAN disk scheduling: a disk scheduling the current position of the access arm in the direction
strategy which satisfies the pending disk request which toward the inside of the disk, reversing direction and
is physically closest to the current position of the access seeking to the outside when it reaches the innermost
arm in the direction toward the inside of the disk, cylinder, and repeating.
reversing direction and seeking to the outside when it Spatial locality: a condition in which references to
reaches the innermost cylinder, and repeating. address in a given period are close together.
Demand paging: a paging policy which reads in a Spool: simultaneous peripheral operations online.
page only when it is referenced.
File Allocation Table (FAT): a table on a disk Swapping: the process of copying a memory image
volume which selects the first space on the free list to secondary storage and making the memory space
which is large enough. available for other usage.
First Fit: a placement strategy which selects the first Temporal locality: a condition in which references
space on the free list which is large enough. to a single address are close together in time.
FIFO Page Replacement: a strategy that replaces the Thrashing: a condition in which the system is
page which has been in memory for the longest time. spending almost all or its time writing out virtual
GUI: Graphical User Interface memory pages and reading them back in.
I/O bound: a property of a process in which processor Virtual memory: memory simulated in software by
use is low, and I/O requests are high. swapping with a disk file.
LRU Page Replacement: a strategy which replaces Working Set: the set of pages, at any time, required
the page which has not been used for the longest time. in real memory for a programme to make reasonable
NUR: Page Replacement: a strategy which replaces a progress without thrashing.
page which has not been used recently.
Conoscenze
Conoscere le principali tecniche e tecnologie per la programmazione concorrente.
Conoscere le principali tecniche e tecnologie per la sincronizzazione dell’accesso
a risorse condivise.
Conoscere i principali problemi di accesso a una risorsa limitata.
Abilità
Progettare applicazioni in modalità concorrente gestendo problemi di sincronizzazione.
Realizzare applicazioni in modalità concorrente gestendo problemi di sincronizzazione.
Prerequisiti
Conoscere l’importanza e il ruolo dei Sistemi Operativi.
Conoscere le tecniche di gestione della CPU.
Conoscere elementi di programmazione.
● Concetti fondamentali
Illustriamo il supporto usato dal Sistema Operativo nel realizzare programmi concorrenti,
cioè programmi in grado di sfruttare nel modo più efficiente possibile le diverse risorse
presenti nel sistema.
Possiamo vedere come tutti questi elementi siano dipendenti tra di loro, infatti un processo
è un programma in esecuzione e, a un solo programma, si possono associare più processi.
Inoltre un processo per poter avanzare necessita di risorse, sia hardware sia software, in
particolare del processore.
In relazione alla programmazione concorrente è importante evidenziare le seguenti carat-
teristiche delle risorse. Esse possono essere:
UÊ Prerilasciabili
– si possono sottrarre al processo che le sta usando prima che esso le abbia rilasciate e
senza causare il fallimento della sua esecuzione;
– il loro stato non si modifica durante l’utilizzo e può essere salvato e successivamente
ripristinato (per esempio: memoria virtuale, processore virtuale).
UÊ Non prerilasciabili
– non si possono sottarre al processo che le sta usando senza causarne il fallimento;
– il loro stato non può essere salvato e ripristinato (per esempio: stampante, masteriz-
zatore, sezioni critiche).
● Processi concorrenti
Programmi concorrenti prevedono quindi processi (o thread) che competono tra loro per le
risorse di sistema, si sincronizzano e comunicano tra loro.
Essi sono più versatili ed efficienti rispetto a quelli sequenziali e richiedono applicazioni più
complesse e sofisticate.
Un programma concorrente prevede come requisiti tutti quelli previsti da una normale
elaborazione sequenziale più alcune primitive di sistema per la creazione e la terminazione
dei processi e per consentire ai processi di sincronizzarsi e poter comunicare tra di loro.
Per esempio il processo P0 passa il
P0 controllo al processo P1, il quale quan-
do ha terminato restituisce il controllo
a P0 (figura 1).
P1
In questo caso il processo P0 comuni-
P0
ca dei dati ai processi P1, P2 e P3 i qua-
li, quando hanno terminato restitui-
figura 1 Sincronizzazione dei processi scono il controllo a P0 (figura 2).
P0
TI DA
DA TI
DATI
P1 P3
P2
P0
Per poter realizzare la comunicazione si deve utilizzare una memoria condivisa, come per
esempio la condivisione di variabili o di buffer di comunicazione, come nel caso del pro-
duttore-consumatore.
Inizio Inizio
….. ….
Fork ….
P2 ….
….. fine
…..
Join
P2
…..
fine
Il processo padre continua la sua esecuzione fino a quando incontra la primitiva join attra-
verso la quale verifica la conclusione del processo figlio.
PR 2
PR 1
Notazione cobegin/coend
Esiste un costrutto linguistico utilizzato per la descrizione di esecuzioni concorrenti
cobegin
S1(...)
S2(...)
…….
Sn(...)
coend
Ogni istruzione viene eseguita in concorrenza e le istruzioni che seguono il coend ver-
ranno eseguite solo quando tutte le istruzioni sono terminate e verranno eseguite sequen-
zialmente.
SISTEMA DI
MONDO REALE
ELABORAZIONE
P1 P2 P1
P4 P2
P3 P4
P3
TEAM DI LAVORO
PROCESSORI
PS
SUPERVISORE
SISTEMA OPERATIVO
RISORSE RISORSE
COMUNI CONDIVISE
DEL TEAM DAI PROCESSI
Analizzando questa analogia con il mondo reale si possono verificare le seguenti situazioni:
UÊ «ÙÊ`iÃÌÊÀi>ââ>ÊÕÊÀÊ`iÊ>ÊVÊÀÃÀÃiÊ«À«ÀiÊ*>À>iîÆ
UÊ ÕÊ ÃÌiÃÃÊ `iÃÌ>Ê Ài>ââ>Ê «ÙÊ `iÊ ÕÌââ>`Ê Ê Ìi«Ê `Ê >ÌÌiÃ>]Ê «iÀÊ iÃi«Ê
della colla che si asciuga, per assemblare altri pezzi (Concorrenza);
UÊ iÊÀÃÀÃiÊÃÊVÕÊiÊÛi}ÊÕÌââ>ÌiÊ«iÀÊÀi>ââ>ÀiÊ«ÙÊ`iÊÌiÀviÀiâ>®°
Anche per le risorse si possono stabilire delle analogie con il mondo reale (tabella 2),
assumendo come considerazione che una risorsa può essere vista come una qualsiasi entità
necessaria a un processo per sviluppare il proprio compito e raggiungere l’obiettivo.
tabella 2 Confronto tra risorse del mondo reale e del sistema di elaborazione
mondo reale sistema di elaborazione
motorino per andare a scuola STAMPANTE
schedario MEMORIA
libri e dispense DATI PRODOTTI DA ALTRI
UÊ Consumabili: se possono essere riutilizzate dopo l’uso, come un buffer usato sia dal
lettore che dallo scrittore;
UÊ Non Consumabili: se non possono essere riutilizzate dopo l’uso, come i dati utilizzati dal
consumatore nel modello produttore-consumatore;
UÊ Condivisibili: se possono essere usati da più utenti contemporaneamente come, per esem-
pio nel caso del disco fisso;
UÊ Non Condivisibili: quando, per usarle un processo deve attendere che un altro processo
abbia finito, come un buffer del modello produttore-consumatore;
UÊ Sottraibili: quando possono essere tolte a un processo per essere date a un altro, salvan-
done il contesto (per esempio il processore).
● Competizione e cooperazione
fra processi
I processi concorrenti si dividono in due classi: processi disgiunti e processi interagenti.
I processi concorrenti disgiunti sono completamente indipendenti: ciascuno di essi opera su un
insieme esclusivo di risorse.
I processi concorrenti sono interagenti se hanno accesso a risorse comuni.
Esistono sostanzialmente due tipi di interazione tra processi. Il primo tipo si ha quando
due processi in realtà potrebbero evolvere in modo indipendente uno dall’altro ma non
lo possono fare perché alcune delle risorse a cui competono devono essere utilizzate da
In generarle ci si può trovare in una situazione di competizione quando due o più pro-
cessi in esecuzione chiedono l’uso di una risorsa comune riusabile e di molteplicità finita;
possono essere in cooperazione quando due o più processi in esecuzione cooperano per
raggiungere un obiettivo comune.
La competizione si verifica ogni qualvolta si debba usare una risorsa riusabile condivisa e
di molteplicità finita, come per un incrocio stradale, uno sportello di banca, una stampante
del laboratorio.
In presenza di competizione è necessario “gestire” i possibili fenomeni di interferenza.
Sia per la cooperazione che per la competizione si devono avere dei maccanismi di sincro-
nizzazione e comunicazione:
UÊ ÕÃÊ `i>Ê iÀ>Ê V`ÛÃ>Ê «iÀÊ v>ÀÊ ÃÊ V
iÊ >VÕÊ `>ÌÊ `Ê ÕÊ «ÀViÃÃ]Ê ÃiÊ `vV>Ì]Ê
possano essere visti da un altro:
UÊ ÃV>LÊ`ÊiÃÃ>}}Ê«iÀÊv>ÀÊÃÊV
iÊÕÊ«ÀViÃÃÊ«ÃÃ>ÊÌÀ>ÃiÌÌiÀiÊvÀ>âÊ>ÊÕÊ>ÌÀ°
Processo P1 Processo P2
………….. ………….
Codice P1 Codice P2
………….. ………….
…………. ………….
Codice P1 Codice P2
…………. ………….
Risorsa R
Per evitare il problema della mutua esclusione ogni soluzione prevede un protocollo di
utilizzo della risorsa R articolato nelle seguenti fasi:
1. richiesta di R;
2. utilizzo di R;
3. rilascio di R.
La richiesta è necessaria per garantire la prima condizione.
Il rilascio è necessario per garantire la seconda condizione.
Si definisce sezione critica una parte di codice del processo durante il quale il processo
accede alla risorsa per averne l’uso esclusivo. È evidente che l’accesso a una regione critica
debba avvenire in mutua esclusione.
Per esempio prendiamo in considerazione due processi P1 e P2 che abbiano accesso a una
struttura dati come una pila (stack) per prelevare e inserire messaggi. La struttura dati può
essere rappresentata da un vettore stack[top] i cui elementi costituiscono i singoli messaggi e
Lo stack è un dato astratto con una dal puntatore top che indica la posizione dell’ultimo elemento contenuto nella cima della pila.
modalità di accesso di tipo LIFO (Last Si possono considerare i seguenti due processi che provvedono a manipolare dati entrambi
In First Out). sul top dello stack.
P1 P2
…….. ……..
Risulta evidente che entrambe le operazioni hanno accesso e modificano le variabili con-
divise stack[top] e top. Però l’esecuzione contemporanea di tali operazioni può portare a
un uso scorretto della risorsa.
Una possibile sequenza problematica nell’esecuzione delle due operazioni potrebbe essere
infatti la seguente:
Il risultato è che viene assegnato a prelievo un valore non definito e che l’ultimo valore
valido della pila viene cancellato dal nuovo valore.
Per evitare tale situazione le operazioni di Inserimento e Prelievo devono appartenere alle
sezioni critiche associate alle variabili stack[top] e top.
● Deadlock e Starvation
Deadlock (stallo)
La realizzazione della mutua esclusione permette di risolvere il problema della non inter-
ferenza ma può causare il blocco permanente dei processi.
Starvation (inedia)
Si può anche verificare la possibilità che un processo non possa accedere a un risorsa
perché questa risulta “sempre occupata”.
Per esempio, se siete in coda dal salumiere e continuano ad arrivare clienti disonesti,
che vi passano davanti, non riuscirete mai a farvi servire. Oppure se tre amici giocano
a palla e i primi due fanno in modo di passarsela senza concedere mai al terzo di inter-
cettarla, questo non riuscirà mai a giocare.
Si verificherà allora una condizione di starvation, che a differenza del deadlock, non
è una condizione definitiva ed è possibile uscirne adottando un’opportuna politica di
assegnamento.
La mutua esclusione nasce nei sistemi concorrenti in cui abbiamo più processi che vogliano
accedere a una risorsa condivisa.
Ogni algoritmo che realizza la mutua esclusione deve prevedere:
UÊ Õ>ÊÃiâiÊVÀÌV>ÊV`ÛÃ>Ê«iÀÊ>VVi`iÀiÊ>>ÊÃiâiÊVÀÌV>Æ
UÊ ÕÊÃiiÊ`ÊÃÌÀÕâÊV
iÊ«ÀiVi`Ê>ÊÃiâiÊVÀÌV>Æ
UÊ ÕÊÃiiÊ`ÊÃÌÀÕâÊV
iÊÃi}ÕÊ>ÊÃiâiÊVÀÌV>°
La regola della mutua esclusione impone che le operazioni con le quali i processi accedono
a risorse condivise non si sovrappongano.
Il problema può essere risolto in modo generale adottando il seguente schema.
“A ogni classe di sezioni critiche viene associato un indicatore. Tale indicatore può assu-
mere due stati per indicare rispettivamente che una delle sezioni critiche è in esecuzione o
che nessuna sezione critica è in esecuzione”.
Ogni processo che vuole accedere a un insieme di variabili comuni tramite la sua sezione
critica esegue due operazioni atomiche (non interrompibili).
WAIT (SR)
USO DI R
SIGNAL (SR)
FINE
Per realizzare la mutua esclusione nell’ac- Per rendere mutuamente esclusive la wait
cesso della risorsa si fa precedere la lock( ) e la signal si può procedere nel seguente
e seguire la unlock( ) all’uso della risorsa: modo:
INIZIO
INIZIO
INIZIO
LOCK LOCK
LOCK
USO DI R UNLOCK
NO SR o LIBERO
SR = LIBERO
UNLOCK SI
USO DI R
UNLOCK
FINE SR o OCCUPATO
FINE
UNLOCK
FINE
Per esempio, se lo schedulatore deve alternare i processi PA e PB, con PA a cui è stata asse-
gnata una alta priorità (schedulato appena esso è nello stato di Pronto) e PB a cui è stata
assegnata una bassa priorità, può succedere che:
1. PA è in stato Pronto;
2. PB viene schedulato (stato Esecuzione) ed entra in SC;
3. PB perde la CPU (stato Pronto) e viene schedulato PA (stato Esecuzione);
4. PA deve entrare in SC, quindi va in attesa attiva.
Il processo PB, dotato di bassa priorità, verrà schedulato raramente o per poco tempo e
quindi, la Sezione Critica su cui è in attesa attiva, verrà liberata dopo un tempo lunghissimo.
Questa situazione grave, in cui i due processi sono nello stato di Esecuzione (PA) e Pronto
(PB) ma non avanzano, può portare alla starvation, cioè morte per fame.
Le attese attive possono essere trasformate in attese passive facendo in modo che i pro-
cessi consumatori di eventi dichiarino il proprio interesse e attendano passivamente che si
verifichino i processi produttori di eventi, i quali informino attivamente i corrispondenti
processi consumatori.
-ʫբÊ>ÃÃV>ÀiÊ>ÊÃi>vÀÊÕ>ÊV`>Ê`Ê«ÀViÃÃ]Ê`vV>`ÊVÃÊ>ÊÜ>ÌÊiÊ>ÊÃ}>\
WAIT(S): inizio
se s = 0 allora
“il processo viene sospeso e il suo descrittore inserito nella coda Qs“
altrimenti s = s–1
fine
SIGNAL(S): inizio
se “esiste un processo in coda“ allora
“il suo descrittore viene rimosso da Qs e il suo stato modificato in
pronto”
altrimenti s = s+1
fine
Tale soluzione evita l’attesa attiva, infatti un processo che esegue la primitiva di wait e
trova il semaforo a zero si blocca e colloca il suo descrittore nella coda di attesa per quel
semaforo; mentre quando un processo viene riavviato grazie a una primitiva di signal farà
passare il processo presente nella coda di attesa allo stato di Pronto.
L’attesa attiva è eliminata per effetto della sospensione del processo. La disciplina di estra-
zione/inserimento della coda QS deve garantire che non si verifichi la starvation.
● TestAndSet
Questi inconvenienti si possono anche risolvere grazie all’hardware.
L’unico punto in cui la lock(x) può essere interrotta è nell’intervallo di tempo che intercorre
tra il test del valore di x e la sua assegnazione a 0, quindi si prevede una istruzione macchina
TestAndSet che, in maniera indivisibile, controlla il valore di un bit e lo azzera. Analogamente
si può supporre indivisibile l’istruzione macchina che implementa la unlock(x).
Usando come abbiamo visto precedentemente la wait (P) e la signal (V) mentre il processo
Q1 possiede la risorsa R, Q2 non può interferire con Q1 perché se cerca di accedere a R viene
bloccato dalla wait e viceversa.
● Lo stallo
Stallo: due o più processi si bloccano La mutua esclusione permette di risolvere il problema della non interferenza ma può cau-
a vicenda in attesa che si verifichi sare il blocco permanente dei processi. Un classico esempio reale può essere quello di un
una determinata situazione. incrocio stradale (figura 1).
figura 1 Situazione di stallo a un incrocio. Nessuna delle auto potrà passare e ci sarà
il blocco del traffico
posseduta
R1 P1
richiede
richiede
posseduta
P2 R2
figura 2 Lo stallo
1. Può esserci una fuga dallo stallo: si rifiutano le richieste di risorse che causano o
potrebbero causare lo stallo. Questa è una strategia conservativa con la quale si consi-
dera la possibilità di rifiutare, o comunque di posticipare alcune richieste. Essa consiste
nel mantenersi in uno stato sicuro nell’allocazione delle risorse.
Uno stato è sicuro se:
UÊ ÊÃÊmÊÊÃÌ>Æ
UÊ ÃÊmÊÊ}À>`Ê`ÊÃ``Ãv>ÀiÊÊÕÊÌi«ÊvÌÊÌÕÌÌiÊiÊÀV
iÃÌiÊ>VÀ>Ê`>ÊiÛ>`iÀi°
A tal proposito Dijkstra propose un algoritmo di fuga dello stallo noto come Algoritmo
del Banchiere. Questo algoritmo consiste nello scegliere un’allocazione che consenta ad
almeno un processo di poter lavorare e concludere la sua esecuzione.
UÊ Ê«ÀViÃÃÊ`iÛÊëiVvV>ÀiÊÊ>ÌV«ÊʵÕ>ÌÌ>ÌÛÊ`ÊÀÃÀÃiÊV
iÊÌi`ÊV
sumare;
UÊ «iÀÊiÛÌ>ÀiÊÊ«iÀVÊ`ÊÃÌ>]ÊÃÊÀvÕÌ>ÌiÊ>VÕiÊÀV
iÃÌiÊ>V
iÊÃiÊÊV`ÕVÊ
necessariamente allo stallo; in questo modo alcune risorse potrebbero essere poco
utilizzate.
3. Prevenzione dello stallo: il sistema deve capire quando esistono le condizioni per la
nascita di un deadlock e cercare di prevenire lo stallo invalidando le condizioni per cui
si verifica.
CASSA = 2
In questo caso il banchiere è in uno stato sicuro perché può soddisfare le potenziali richieste
di A, infatti quando questo termina sarà possibile (con i 10 rientrati dal suo fido) soddisfare
gli altri.
Esempio 2
CASSA = 0
CASSA = 1
Siamo in uno stato non sicuro, infatti il banchiere non può più soddisfare l’eventuale
richiesta di alcun cliente. Siamo in pericolo di stallo, infatti tutti possono cominciare a
chiedere un prestito ma nessuno restituisce
6 Produttore-consumatore
Processo Processo
BUFFER
Produttore Consumatore
Una possibile soluzione consiste nel sospendere l’esecuzione del produttore se il buffer è
pieno. Il produttore verrà svegliato dal consumatore, non appena il consumatore avrà pre-
levato un elemento dal buffer, consentendogli di ricominciare a riempire il buffer.
Analogamente, il consumatore si sospenderà se il buffer risulta essere vuoto e, non appena
il produttore avrà depositato dati nel buffer, risveglierà il consumatore.
I due processi devono essere opportunamente sincronizzati per evitare che si verifichino
le seguenti situazioni:
UÊ ÕÊVÃÕ>ÌÀiÊi}}iÊÕÊ`>ÌÊÃiâ>ÊV
iÊÕÊ«À`ÕÌÌÀiÊiÊ>LL>Ê`i«ÃÌ>ÌÊ>VÕÆ
UÊ ÕÊ«À`ÕÌÌÀiÊÃÛÀ>ÃVÀÛiÊÕÊ`>ÌÊÃVÀÌÌÊ«À>ÊV
iÊÕÊVÃÕ>ÌÀiÊÃ>ÊÀÕÃVÌÊ>Êi}
gerlo;
UÊ ÕÊ`>ÌÊÛiiÊiÌÌÊ`>ÊVÃÕ>ÌÀÊ«ÙÊ`ÊÕ>ÊÛÌ>°
Bisogna fare attenzione perché si potrebbe avere una situazione di stallo, come nel caso in
cui entrambi i processi aspettano di essere risvegliati.
Esempio: si consideri il caso in cui il processo P1 debba prelevare dati da un file su
un’unità A, elaborarli e successivamente depositare il risultato dell’elaborazione su un
nastro presente sull’unità B; analogamente il processo P2 dovrà prelevare dati da un file
su un’unità B, elaborarli e successivamente depositare il risultato dell’elaborazione su un
nastro presente su A.
Le azioni dei due processi possono essere eseguite nel seguente modo:
– P1 chiede l’unità A per prelevare il file e la ottiene;
– P2 chiede l’unità B per prelevare il file e la ottiene;
– P1 chiede l’unità B per depositare il file e rimane bloccato in attesa che P2 la liberi;
– P2 chiede l’unità A per depositare il file e rimane bloccato in attesa che P1 la liberi.
In questo caso nessuno dei due processi può proseguire perché sono l’uno in attesa di una
risorsa posseduta dall’altro. Si realizza una situazione di stallo che, come già visto prece-
dentemente, può essere risolta solo interrompendo l’esecuzione di uno dei due processi.
Il problema del produttore-consumatore si può risolvere utilizzando due semafori, deposita
inizializzato a 0 e preleva inizializzato a 1.
Quando un nuovo dato viene immesso e tolto nel buffer, deposita viene incrementato e
preleva viene decrementato. Se il produttore prova a decrementare preleva mentre questo
è 0, la sua esecuzione viene sospesa; non appena un elemento del buffer viene consuma-
to, preleva viene incrementato e il produttore si riattiverà. Il consumatore funzionerà in
maniera analoga.
7 I cinque filosofi
È uno dei problemi classici proposti da E.W. Dijkstra. Ci sono cinque filosofi che passano
la loro vita alternando il pensare al consumo di cibo per sostenersi. Essi vivono in una
stanza in cui è apparecchiata una tavola al centro della quale è posto un grosso piatto di
spaghetti. Ogni filosofo è seduto sulla sua sedia e ha a disposizione un piatto di portata
e una forchetta (alla sua sinistra) (figura 1). Per mangiare, un filosofo deve dotarsi di
entrambe le forchette, cioè sia di quella alla sua destra che di quella alla sua sinistra. Dopo
aver mangiato, un filosofo ripone le forchette. Bisogna trovare una strategia che consenta a
ogni filosofo di ottenere sempre le due forchette richieste.
F1
F5
F4 F3 F2
ciclo
“pensa”;
“impossessati delle due forchette”;
“mangia”;
“rilascia le due forchette”;
fine
var S: semaforo
inizio
INIZ_SEM(S,1)
coinizio A(0) || B(1) || C(2) || D(3) || E(4) cofine
fine
...
procedura concorrente filosofo
inizio ciclo
<<pensa>>
P(S)
<<mangia>>
V(S)
fine
Questa soluzione evita qualsiasi stallo, ma in effetti non fa altro che serializzare l’ordine
con il quale i filosofi mangiano. Infatti può mangiare un solo filosofo alla volta anche se le
forchette basterebbero per due.
Il messaggio viene visto come una struttura dati, per esempio un array di byte. Con la send
questa struttura viene inviata al processo destinatario, mentre con la receive viene acquisito
un messaggio inviato da un processo mittente.
Un messaggio è costituito normalmente da due parti: un’intestazione o header (con infor-
mazioni di controllo) e un corpo (contenente i dati trasmessi). L’intestazione può recare
l’identità del destinatario, del mittente, la lunghezza del messaggio e altre informazioni come
quelle per verificare, in sede di ricezione, la correttezza della trasmissione rispetto agli errori.
● Tipi di comunicazione
La comunicazione è diretta se i processi si conoscono reciprocamente, è indiretta se i pro-
cessi, pur non conoscendosi, concordano sull’utilizzazione, esempio di una mailbox sulla
quale i mittenti scrivono e da cui i ricevitori prelevano.
In entrambi i casi è preferibile usare nomi simbolici al posto di indirizzi fisici. I nomi sim-
bolici vanno comunque tradotti in indirizzi numerici.
La comunicazione è simmetrica nel caso in cui ci sia un solo mittente e un solo destinatario
(point-to-point). È asimmetrica nei casi: 1-to-N, N-to-1, N-to-M.
Il caso N-to-1 è classico delle situazioni Client/Server. Più client possono mandare mes-
saggi di richiesta a uno stesso server. Il server deve ottenere informazioni dai messaggi per
poter rispondere al client richiedente.
PRODUTTORE CONSUMATORE
inizio inizio
ripeti ripeti
……. receive( produttore, msg )
<produci elemento> …….
……. <consuma elemento>
send( consumatore, msg ) …….
finché finito finché finito
fine fine
La sincronizzazione tra i processi è garantita dalla primitiva receive che impone al processo
di rimanere in attesa di un altro messaggio, mentre per la primitiva send ciò non è neces-
sario. La comunicazione è asincrona.
Il primo caso corrisponde alle comunicazioni sincrone dove il primo dei due processi che
arriva aspetta l’altro. Quando entrambi i processi sono pronti a comunicare, il messaggio
spedito dalla send viene passato alla receive ed entrambi riprendono la loro esecuzione con-
corrente. Tipico delle comunicazioni sincrone è l’assenza della bufferizzazione dei messaggi
da parte del sistema.
Il secondo caso corrisponde a una send asincrona e a una receive sincrona. Il mittente non
aspetta che il destinatario sia pronto a ricevere il messaggio, ma procede immediatamente
all’invio. In queste situazioni i messaggi vanno bufferizzati dal sistema in attesa del loro
prelievo.
Nel terzo caso alla fine dell’operazione di receive viene inviato un messaggio di ok se il
messaggio è stato ricevuto; altrimenti viene segnalata la mancata ricezione.
Con questo tipo di comunicazione un processo chiede, tramite la send, che un messaggio
prodotto sia collocato in un’apposita area e che un destinatario, con la receive, vada a veri-
ficare l’area comune e, se presente, prelevi il messaggio.
Nella comunicazione N-to-M viene spesso utilizzato il concetto di mailbox.
4 sintesi
4
lo stallo può avvenire nei seguenti modi: fuga dallo stallo, riconoscimento e risoluzione
dello stallo, prevenzione dello stallo.
lezione 6 Produttore-consumatore
Il problema del produttore-consumatore è un problema di accesso a una risorsa limitata
(buffer limitato) e rappresenta il classico esempio di sincronizzazione tra processi. La sin-
cronizzazione impedisce al produttore di depositare nuovi dati se il buffer è pieno e al
consumatore di prelevarli se il buffer è vuoto. Il problema del produttore-consumatore
si può risolvere utilizzando due semafori, deposita inizializzato 0 e preleva inizializzato 1.
➞ L1
➞ L1
➞ L2
➞ L3
➞ L4
➞ L4
➞ L4
➞ L5
➞ L5
➞ L6
➞ L7
➞ L8
This module focuses on multiprocessor systems and the problems associated with
concurrent programming. Particular attention is given to problems of synchronization
between parallel processes, such as competition and collaboration and the processes
which lead to the solution of the problem of mutual exclusion. Attention is given
above all to the basic instructions such as lock, unlock, TestAndSet, wait and signal
which operate on the semaphores. As for the multiprocessor systems, the problem of
deadlock is examined.
Deadlock consists of a system block and can only be resolved by destructive means.
Managing deadlock can be achieved by backing off from deadlock once it has been
identified or by resolving the deadlock or by anticipating it.
In shared programming there is the problem of the producer and the consumer
who share a common buffer. Another classic problem is the problem of the five
philosophers who spend their time thinking and eating. To be able to eat the
philosopher needs both forks. This action must occur so as to avoid deadlock.
Questions
1 What are the main elements of concurrent programming?
5 What is a semaphore?
4 in English, please
Glossary Glossario
Atomic action: an indivisible step. On a uni-processor executing a single machine-
code instruction is an atomic action.
Concurrent programming: designing and implementing code that comprises
several threads/processes working together to accomplish a task.
Conditional critical region: the procedure by which one process ensures it does
not proceed until some conditions have been fulfilled.
Critical section: a portion of code that must be executed by only one process/
thread at a time, typically because it updates shared variables
Executable: an executable process is one that is able to be executed, i.e. is either
running or runnable. See also runnable, running.
Mutual exclusion: a section of code that must execute under mutual exclusion
must be executed without the process/thread being interrupted.
Shared variables: data that lives in a memory location that can be updated by more
than one process/ thread at a time.
Competenze
Scegliere dispositivi e strumenti in base alle loro caratteristiche funzionali.
Gestire processi produttivi correlati a funzioni aziendali.
Configurare, installare e gestire sistemi di elaborazione dati.
Conoscenze
Conoscere le caratteristiche di una shell GUI e CLI.
Conoscere esempi significativi di funzionalità programmabili rese disponibili da un
Sistema Operativo.
Conoscere le principali caratteristiche di una shell.
Conoscere i fondamenti di uno script di shell.
Abilità
Confrontare shell GUI e CLI.
Progettare applicazioni che interagiscono direttamente con le funzionalità dei
Sistemi Operativi.
Realizzare applicazioni che interagiscono direttamente con le funzionalità dei
Sistemi Operativi.
Prerequisiti
Conoscere l’importanza e il ruolo dei Sistemi Operativi.
Conoscere le tecniche di gestione del file system.
Conoscere elementi di programmazione.
● Introduzione
Ogni computer viene solitamente equipaggiato con un Sistema Operativo direttamente dal
costruttore o dall’installatore in quanto la maggior parte degli utenti si limita a installare dei
pacchetti software aggiuntivi già pronti per l’esecuzione delle comuni attività informatiche,
GUI è l’acronimo di Graphical User
come per esempio l’installazione del pacchetto Office, di un software di geometria dinamica
Interface e CLI è invece l’acronimo come Cabrì o GeoGebra, di giochi, cioè in generale di programmi di utility.
di Command Live Interface. Per ciò che riguarda gli utenti più esperti si ha la possibilità di sostituire o installare altri
Sistemi Operativi o realizzare programmi in grado di interagire con il Sistema Operativo.
Come abbiamo visto il ruolo del Sistema Operativo non è limitato alla gestione centraliz-
zata delle varie periferiche, ma coinvolge anche tutte le funzioni di messa in esecuzione e
di sincronizzazione di altri moduli. Per esempio il Sistema Operativo è in grado di gestire
la concorrenza di più processi che usano la stessa CPU. I Sistemi Operativi che facilitano
attività concorrenti sono detti Sistemi Operativi multitasking.
In particolare nell’uso del SO UNIX il multitasking viene interpretato come multiprocesso
perché ogni programma che è in esecuzione diviene un processo.
Dopo la fase di installazione, che può essere eseguita tramite un apposito programma di instal-
lazione, l’utente deve poter interagire con il Sistema Operativo.
La comunicazione può avvenire tramite interfaccia grafica (GUI), tramite linea di comandi
(CLI) o tramite chiamate di sistema.
● Attivazione del SO
Abbiamo detto che dopo l’installazione si deve provvedere all’attivazione cioè alla fase di
bootstrap.
Il bootstrap o avvio è quel processo di caricamento di un Sistema Operativo nella memo-
ria principale del computer. Esso viene eseguito grazie a un programma memorizzato in
modo permanente, solitamente nella ROM, quando il calcolatore viene acceso. Una parte
del Sistema Operativo deve essere sempre mantenuta in memoria centrale e deve essere
sempre pronta all’esecuzione. Questo avviene tramite il bootloader, un piccolo programma
utilizzato per il boot del sistema.
Il funzionamento di un bootloader è molto complesso, ma si può schematizzare e sempli-
ficare in poche fasi:
UÊ â>iÌi]ÊÊ "-Ê`i>Ê>VV
>ÊV>ÀV>ÊÊbootloader;
UÊ ÊLÌ>`iÀÊÃÕVViÃÃÛ>iÌiÊV>ÀV>ÊÊiÀiÊ`iÊÃÃÌi>ÊÊʺLÌÊÃiVÌÀûÊ`Ê>ÌÀÊÃÃÌi
mi operativi, come nel caso di Windows, passando ad altri programmi la successiva
operazione di boot;
UÊ v>ÌÌÊV¢Ê>ÊvÕâiÊ`iÊLÌ>`iÀÊmÊÌiÀ>Ì>ÊiÊÊVÌÀÊÛiiÊ`>ÌÊ>Ê-"ÊV
iÊâ>Ê
la vera fase di bootstrap del Sistema Operativo.
"-Êmʽ>VÀÊ`Ê >ÃVÊ«ÕÌÉ"ÕÌ«ÕÌÊ-ÞÃÌiÆÊmÊÕÊ«À}À>>Ê>}>ââ>ÌÊ>½ÌiÀ
no di un chip di memoria delle schede madri dei computer (EPROM o EEPROM).
Oltre ad avviare il computer e lanciare il Sistema Operativo, effettua diverse operazioni
utili, come:
UÊ >V>Ê>Êv>ÃiÊ`Ê *"-/Ê*ÜiÀ"Ê-ivÊ/iÃÌ®\ÊVmÊÊÌiÃÌÊV
iÊÊ "-Êv>Ê>ÊÃiÊÃÌiÃÃ]Ê>>Ê
macchina e all’hardware per verificare se ci sono dei problemi;
UÊ }iÃÌÃViÊiÊÛ>ÀiÊ«ÃÌ>âÊ`i½
>À`Ü>ÀiÊ`i>Ê>VV
>°
● Interazione con SO
L’interazione con il Sistema Operativo può avvenire solitamente secondo due tipi di inter-
facce:
UÊ GUI (Graphical User Interface) che utilizza la metafora del desktop, cioè una scrivania
su cui si andranno a svolgere tutti i lavori e che permette all’utente di interagire con la
macchina manipolando una serie di oggetti grafici convenzionali, come le icone per rap-
presentare i file e le finestre per rappresentare le applicazioni. La GUI rende il software
molto accattivante e particolarmente semplice e intuitivo da usare (figura 1).
La comunicazione con il Sistema Operativo può avvenire anche tramite delle System Call
(chiamate di sistema), che fungono da interfaccia tra i programmi in esecuzione e il Sistema
Operativo.
Esse sono solitamente disponibili come speciali istruzioni assembler o come delle funzioni
nei linguaggi che supportano direttamente la programmazione di sistema (per esempio, il
linguaggio C). Di queste istruzioni esistono vari tipi, da quelle relative al controllo di pro-
cessi, a quelle per la gestione dei file e dei dispositivi, a quelle per il reperimento di infor-
mazioni. L’invocazione di una chiamata di sistema serve a ottenere un servizio dal Sistema
Operativo, passando dal user mode al kernel mode, per ragioni di sicurezza, mediante una
speciale istruzione detta TRAP.
Una volta terminato il compito relativo alla particolare chiamata di sistema invocata, il
controllo ritornerà al processo chiamante passando dal kernel mode al user mode.
! L’interprete dei comandi è la parte del SO attiva inizialmente e quella a cui ritorna il controllo dopo
che sono state eseguite le funzioni richieste.
controllo A volte alcuni utenti che hanno bisogno di fare Gli utenti hanno un controllo maggiore dei loro
compiti specifici, potrebbero avere bisogno di file system e del Sistema Operativo tramite un’in-
ricorrere a una riga di comando per effettuare terfaccia a riga di comando.
tale operazione.
multitasking Gli utenti di sistemi con GUI hanno finestre Anche se molti ambienti a riga di comando sono
che gli consentono di visualizzare, controllare e capaci di multitasking, non danno la possibilità
manipolare le cose in una sola volta e di farlo di vedere le cose contemporaneamente su uno
velocemente. schermo.
velocità Una GUI può essere più facile da usare, grazie Poiché gli utenti CLI hanno solo bisogno di utiliz-
al mouse. Ma l’operatore, utilizzando un mouse e zare la tastiera per navigare e spesso hanno solo
una tastiera per navigare e controllare il Sistema bisogno di eseguire alcune righe per svolgere
Operativo, può essere molto più lento di chi lavora un compito avanzato, essi riescono a lavorare più
in una riga di comando. velocemente di utenti GUI.
poche risorse Una GUI richiede molte più risorse di sistema per Un computer con un’interfaccia solo a riga di
ciascuno degli elementi che devono essere caricati comando richiede molte meno risorse del com-
come icone, font ecc. Inoltre, anche per i driver del puter.
mouse saranno necessarie risorse aggiuntive.
scripting Anche se una GUI consente all’utente di creare Un’interfaccia a riga di comando consente
collegamenti o compiti, per completare un com- all’utente di scrivere facilmente una sequenza di
pito o eseguire un programma non ci sono molte comandi per eseguire un compito o eseguire un
possibilità rispetto a una CLI. programma.
accesso remoto Anche se l’accesso remoto grafico è possibile non Spesso quando si accede a un altro computer o
tutti i computer hanno questa capacità. dispositivo di rete, il dispositivo o il suo file si pos-
sono manipolare tramite riga di comando.
2 Linux
● Introduzione
Linux è nato come un progetto personale di Linus Torvalds, studente all’università di
Helsinki in Finlandia, sullo studio della multiprogrammazione dei microprocessori i386.
Nato negli anni 1990 sull’esperienza di Unix, Linux è un Sistema Operativo freeware, cioè
che può essere distribuito liberamente; rispetto a Unix è più semplice e meno costoso
procurarselo.
Linus Torvalds decise di trasferire il suo studio dei microprocessori i386 su Minix con
l’idea di realizzare qualcosa di simile a Minix ma migliore. Dopo molto lavoro, riuscì
ad arrivare a un sistema minimo e soprattutto autonomo da Minix. Linux è un Sistema
Operativo multitasking e multiutente.
A partire dai primi anni Novanta, Stallman e un gruppo di programmatori che lavoravano
all’interno del progetto GNU riuscirono a sviluppare un Sistema Operativo quasi completo,
che poteva essere liberamente distribuito con il modello Open Source.
Open Source significa che è presente il codice sorgente, che può essere compilato per
MINIX
ottenere un codice eseguibile; una licenza Open Source deve garantire:
MINIX (MIni-uNIX) è un sistema UÊ >ÊLiÀÌD di eseguire il programma come si desidera;
operativo basato su un’architettura UÊ >ÊLiÀÌD di studiarne il codice sorgente e modificarlo;
creata da Andrew S. Tanenbaum a
scopo didattico.
UÊ >ÊLiÀÌDÊ`Êv>ÀiÊV«iÊiÊ`ÃÌÀLÕÀiÊ>ÊÌÕÌÌʵÕiÊV
iÊÛ}>Æ
UÊ >ÊLiÀÌD di pubblicarne versioni modificate.
Il kernel Linux costituisce il nucleo dei Sistemi Operativi della famiglia di Linux. Esso è
stato rilasciato sotto la libera licenza GNU ed è stato sviluppato da collaboratori di tutto il
mondo sfruttando la mailing list di Linux.
Nel 2011 la maggior parte della distribuzioni Linux si basa sul kernel Linux, infatti non
esiste una sola versione di Linux ma varie distribuzioni.
Tutte le distribuzioni condividono il kernel Linux, anche se in versioni diverse, ma si diffe-
renziano tra loro per i pacchetti preparati dai singoli sviluppatori, per il sistema di gestione
del software e per i servizi di assistenza e manutenzione.
iÊ V>À>ÌÌiÀÃÌV
iÊ ÃÊ Ìi«V]Ê «iÀÊ iÃi«Ê iÃÃÌÊ `ÃÌÀLÕâÊ ºlive»Ê `ÀiÌÌ>iÌiÊ
eseguibili da CD senza che sia richiesta l’installazione e altre in cui si può effettuare l’in-
ÃÌ>>âiÊ`>Ê«i>Ê1- °
Alcune delle principali distribuzioni Linux sono:
UÊ Debian: offre un ottimo sistema di gestione dei pacchetti software, compilati per
££Ê >ÀV
ÌiÌÌÕÀiÊ `vviÀiÌ°Ê *iÀÊ µÕiÃÌÊ ÌÛÊ ÛiiÊ VÃ`iÀ>ÌÊ ViÊ ºÊ -ÃÌi>Ê
"«iÀ>ÌÛÊÕÛiÀÃ>i»°Ê>ÊÃÕ>ÊÃÌ>>âiÊmÊ`ëLiÊÃ>ÊÊ`>ÌDÊÌiÃÌÕ>iÊÃ>Ê
grafica.
UÊ Knoppis: è la distribuzione live CD più famosa. Deriva da Debian ed è molto adatta per
i neofiti di Linux. Essa consente di avere un sistema completo avviabile direttamente da
CD-ROM.
UÊ Gentoo: è una distribuzione non commerciale basata sui sorgenti che permette di otti-
mizzare e rendere estremamente flessibile il sistema. È una distribuzione che prevede
un’ottima documentazione e una comunità molto attiva. L’installazione può essere
manuale o attraverso live CD.
UÊ Mandriva: nota anche come Mandrake, è una tra le distribuzioni più diffuse e maggior-
mente orientate all’utente desktop. È distribuita sia in forma gratuita che come prodotto
commerciale perché può includere alcuni pacchetti proprietari.
● Caratteristiche di Linux
Alcune delle principali caratteristiche di Linux sono le seguenti:
UÊ multitasking: possibilità di eseguire più programmi contemporaneamente;
UÊ multiuser: più utenti nella stessa macchina contemporaneamente;
UÊ multipiattaforma: Linux è praticamente compatibile con tutti i comuni hardware di pc,
e può girare anche su processori non INTEL;
UÊ «ÀiÛi`iÊvÕâÊ`Ê«ÀÌiâiÊ`i>ÊiÀ>ÊÌÀ>Ê«ÀViÃÃ]ÊÊ`ÊV
iÊÕÊ«À}À>>Ê
non possa mandare in crash l’intero sistema;
UÊ «ÀiÛi`iÊ>Ê}iÃÌiÊ`i>ÊiÀ>ÊÛÀÌÕ>iÊ>ÌÌÀ>ÛiÀÃÊ>Ê«>}>âiÆ
UÊ demand loads executables: Linux legge dal disco solo le parti di un programma che
sono attualmente usate;
UÊ «ÀiÛi`iÊLÀiÀiÊÃÌ>ÌV
iÊiÊ`>V
iÆ
UÊ V`ÛÃiÊ«>}iÊV«ÞÜÀÌiÊÌÀ>Ê«ÀViÃÃ]ÊVmÊÊ«ÀViÃÃÊÕ̫ʫÃÃÊÕÃ>ÀiÊ
la stessa memoria per funzionare;
UÊ «ÀiÛi`iÊÕ>ÊiÀ>ÊÕvV>Ì>Ê«iÀÊ«À}À>ÊÕÌiÌiÊiÊ cache del disco, in modo che
tutta la memoria può essere usata per la cache e la cache può essere ridotta quando
funzionano grandi programmi;
UÊ ÕÌââ>ÊÕÊ«À«ÀÊÌ«Ê`Êfile system in cui i file possono avere nomi composti da non
più di 255 caratteri e dimensioni fino a 2 Gbyte, con file system fino a 4 Tbyte;
UÊ «iÀiÌÌiÊ`Ê>VVi`iÀiÊ>ÊviÊÃÞÃÌiÊ`ÛiÀÃÆ
UÊ ÃÕ««ÀÌ>Ê`ÛiÀÃiÊÌ>ÃÌiÀiÊÌiÀ>â>Æ
UÊ ÃÕ««ÀÌ>ÊÕ½>«>Ê}>>Ê`Ê«ÀÌVÊ`ÊÀiÌiÊ/
*É*]Ê-*]Ê***ÊiVV°®Æ
UÊ ÌÕÌÌÊÊV`ViÊÃÀ}iÌiÊmÊ`ëLi]ÊV«ÀiÃÊÊiÀiÊiÊÌÕÌÌÊÊ`ÀÛiÀ]Ê}ÊÃÌÀÕiÌÊ
di sviluppo e tutti i programmi utente;
UÊ «ÀiÛi`iÊVÃiÊÛÀÌÕ>ÊÕÌ«i]ÊiÃÃiÊÃÊ>V>ÌiÊ`>V>iÌiÊiÊÃiÊiÊ«ÃÃÊ
usare fino a 64.
Come abbiamo detto Linux è un sistema multiuser dove ogni utente ha un account e può
appartenere a uno o più gruppi. Presenta poi una home directory e una shell di avvio.
Alcuni account possono essere predefiniti come root, cioè l’account dell’amministratore di
sistema o superuser, che può fare qualsiasi operazione.
Ogni utente di Linux è proprietario di directory e file e su di essi ha dei permessi, come la
lettura, scrittura ecc. Il proprietario può concedere i permessi ad altri utenti che hanno i Superuser
suoi file, mentre il superuser ha sempre tutti i permessi.
È l’utente che ha il massimo controllo
La prima cosa che si nota quindi quando si avvia un sistema Linux è il fatto che il sistema del sistema.
non è immediatamente disponibile, ma si presenta con una richiesta di autenticazione:
<stazione> login:
Alla richiesta di login noi dovremo rispondere con l’identificativo dell’utente noto al
sistema.
password:
per essere sicuro che l’utente che si è presentato con quel nome di utente, sia proprio lui.
Naturalmente la password verrà richiesta solo se l’utente ne ha selezionata una, altrimenti,
una volta scritto il nome, il sistema sarà immediatamente disponibile.
Abbiamo visto che una caratteristica di Linux è quella di mettere a disposizione dell’utente
un certo numero di terminali virtuali diversi. Noi possiamo connettere il nostro video e
Terminale virtuale
la nostra tastiera a ciascuno dei terminali, utilizzando la combinazione di tasti Alt+<Tasto
È un servizio del sistema operativo Funzione>. Anche se non necessariamente tutti i terminali virtuali saranno abilitati e
Linux che emula il comportamento
non su tutti sarà possibile fare il login. Per esempio se premo Alt+F2 si passa al secondo
di un terminale.
terminale, e così via.
Per quanto riguarda la gestione dei file, si hanno le seguenti differenze fondamentali di
Linux rispetto a Windows:
UÊ ÊÊ`iÊviÊ«ÃÃÊÀ>}}Õ}iÀiÊ>ÊÕ}
iââ>Ê>ÃÃ>Ê`ÊÓxxÊV>À>ÌÌiÀÆ
Per poter lanciare un programma,
UÊ ÊV>À>ÌÌiÀiÊ`ÊÃi«>À>âiÊ`iiÊ`ÀiVÌÀÞÊmÊÊV>À>ÌÌiÀiʺɻÊ>âV
jÊÊV>À>ÌÌiÀiʺM»Æ
occorre avere permessi di esecuzione UÊ ÕÝÊ`ÃÌ}ÕiÊÌÀ>ÊiÌÌiÀiÊÕÃViÊiÊ>ÕÃVi]ÊV>ÃiÊÃiÃÌÛi°Ê*iÀÊiÃi«ÊÃiÊV
>
sul file che contiene il programma miamo un file fausto questo sarà diverso da un file denominato Fausto presente nella
e per poter accedere al contenuto stessa directory;
di una directory, occorre avere per- UÊ ÊV>À>ÌÌiÀiʺ°»ÊÊ
>ÊÕÊÃ}vV>ÌÊ«>ÀÌV>Ài]ÊÛÃÌÊV
iÊÊÌ«Ê`ÊviÊÊmÊ`V>ÌÊ`>Ê
messi di lettura ed esecuzione sulla tre caratteri dopo il punto e addirittura un nome può contenere più punti o nessuno;
directory.
per esempio i file e le directory i cui nomi cominciano con un punto sono considerati
file nascosti;
UÊ ½iÃÌiÃiÊ`iÊviÊmÊëiÃÃÊÕÌiÊ«iÀÊ`iÌiÀ>ÀiÊÊÌ«Ê`Êvi]Ê>ÊÊ
>ÊÃ}vV>ÌÊ
vincolante per il Sistema Operativo;
UÊ ÊviÊiÊiÊ`ÀiVÌÀÞÊ
>ÊÕÊ«À«ÀiÌ>À]ÊVmʽÕÌiÌiÊV
iÊÊ
>ÊVÀi>ÌÊiÊÕÊ}ÀÕ««Ê`Ê
appartenenza;
UÊ ÊviÊiÊiÊ`ÀiVÌÀÞÊ
>Ê`iÊ«iÀiÃÃ\Ê«iÀiÃÃÊ`ÊiÌÌÕÀ>]Ê`ÊÃVÀÌÌÕÀ>ÊiÊ`ÊiÃiVÕâ
ne. Tali permessi sono suddivisi in tre tipi (per ciascun file): i permessi concessi al
proprietario del file, i permessi concessi al gruppo, i permessi concessi a tutti gli altri
utenti;
UÊ ÃÊÊ«À«ÀiÌ>ÀÊ`iÊviÊiʽ>ÃÌÀ>ÌÀiÊ`ÊÃÃÌi>®Ê«Õ¢Ê`vV>ÀiÊÊ«iÀiÃÃÊ`Ê
un file.
Naturalmente i vari permessi non sono uguali per tutti gli utenti, dipende dal tipo di desti-
natario. I vari destinatari sono:
UÊ proprietario: chi ha creato il file;
UÊ gruppo: i membri che appartengono al gruppo di appartenenza del file;
UÊ altri: tutti gli utenti che non rientrano nelle categorie precedenti.
● Il partizionamento
Linux utilizza più di una partizione sullo stesso disco, anche quando si usa la procedura
di installazione standard.
Uno degli scopi principali per avere diverse partizioni è quello di raggiungere un livello di
sicurezza dei dati maggiore in caso di disastro. Dividendo il disco rigido in partizioni, i dati
possono essere raggruppati e separati. Quando capita un danno, solo i dati nella partizione
colpita saranno danneggiati, mentre i dati nelle altre partizioni molto probabilmente non
subiranno danni.
3 La shell
Molte sono le definizioni di shell, ma per dirlo in parole semplici una shell può essere vista
come uno strumento per parlare con il computer. In termini più formali la shell si può defi-
nire come un interprete di comandi che legge l’input, lo elabora e ne restituisce l’output.
Per il neofita il primo impatto con i comandi della shell può essere abbastanza impegnativo,
essi sono numerosi e molte volte sembrano un’insieme di lettere a caso, come per esempio
pwd, anche se in realtà hanno un significato ben preciso e conoscerlo può aiutare a memoriz-
L’interprete dei comandi e i pro-
zarli. Infatti la maggior parte delle abbreviazioni o acronimi assumono significati ben precisi,
grammi di utilità sono moduli visibili
all’utente. per esempio il comando cdÊÃ}vV>ʺV
>}iÊ`ÀiVÌÀÞ»]ÊrmʺÀiÛi»]Êpwdʺ«ÀÌÊÜÀ}Ê
`ÀiVÌÀÞ»°
Quindi, specialmente gli utenti più inesperti potrebbero essere motivati a interagire con
il computer mediante un altro linguaggio basato su GUI. Tale linguaggio è mediato dal
mouse che si muove sul desktop, ma con esso è il computer a guidare la conversazione e
l’utente si limita a selezionare le funzioni che questo gli presenta. In questo caso risulta dif-
ficile per un programmatore considerare tutte le opzioni e gli usi possibili di un comando.
Ciò fa si che le GUI siano quasi sempre meno potenti delle interfacce a riga di comando.
Con la shell l’utente può gestire un sistema in modo abbastanza flessibile e può facilmente
automatizzare i compiti. Come contro si richiede un maggior rigore e una certa conoscenza
dei comandi.
La shell è quindi un programma che gestisce la comunicazione fra utente e Sistema
Operativo interpretando ed eseguendo i comandi dell’utente. Essa può avere diversi utilizzi:
UÊ uso interattivo: il sistema attende i comandi digitati dall’utente;
UÊ configurazione della propria sessione: si possono definire variabili e parametri che ven-
gono utilizzati in ogni interazione dell’utente con la macchina;
UÊ programmazione: utilizzando comandi di sistema e funzionalità della shell è possibile
realizzare piccoli programmi (script) in grado di automatizzare operazioni e reagire a
eventi.
● La shell di Linux
Come abbiamo visto, il computer
presenta due tipi di interfacce, l’in-
terfaccia grafica (o GUI, Graphical
User Interface) (figura 1) e l’in-
terfaccia testuale (o CLI, Command
Line Interface). Entrambe hanno
punti di forza ed entrambe presen-
tano delle debolezze.
CSH (C SHell) Bill Joy usa una sintassi simile a quella del linguaggio C
KSH (Korn Shell) David Korn le KSH rispettano il linguaggio standard per shell.
Fino al 2000 sono rimaste un software proprie-
tario di AT&T e successivamente sono divenute
Open Source
Il programma più utilizzato su Linux per utilizzare la shell è la shell bash, in quanto è la
più completa e presenta, in un unico pacchetto, tutte le caratteristiche positive delle altre.
Si noti che ogni shell fa lo stesso lavoro, ma ognuna ha una diversa sintassi dei comandi e
fornisce diverse funzioni.
Anche in MS-DOS abbiamo una shell di nome COMMAND.COM, che viene utilizzata
anche per lo stesso scopo, ma non è potente come la shell di Linux.
Senza entrare nel dettaglio vediamo ora alcuni semplici esempi di comandi.
UÊ date: è un comando senza argomenti che ci restituisce la data di sistema; si può speci-
ficare il formato;
UÊ passwd: è usato per cambiare la propria password digitando quella vecchia; i caratteri
digitati non vengono visualizzati. Naturalmente il superuser può cambiare qualsiasi
password;
UÊ su: è un comando che, senza argomenti, permette di accedere all’utente root; seguito dal
nome dell’utente permette di aprire temporaneamente un’altra sessione;
UÊ login: è un comando che seguito dal nome dell’utente permette di aprire un’altra sessio-
ne terminando quella attuale;
UÊ echo: è un comando che manda in output sullo schermo la stringa che lo segue;
UÊ ls: è un comando che visualizza la lista dei file contenuti nella cartella in cui vi tro-
vate;
UÊ man ls: è un comando che ci fa apparire il manuale del comando ls.
Si possono quindi scrivere programmi di shell creando script contenenti alcuni comandi
di shell. La prima linea dello script deve iniziare con #!, che indica al kernel che lo script
è direttamente eseguibile. Si fa immediatamente seguire a quel simbolo il nome della shell
Come abbiamo detto lo script è dipendente dal linguaggio della shell utilizzata, quindi per
iÃi«Ê«iÀÊâ>ââ>ÀiÊÕÊÃVÀ«ÌÊ«iÀÊ>ÊÃ
iÊ ÕÀiÊ>Ê«À>Êi>Ê`ÛÀDÊiÃÃiÀi\
# ! /bin/sh
# ! /bin/csh -f
dove l’opzione -f indica che la shell non deve leggere il file .csh. Alcuni spazi bianchi
seguenti il simbolo, #!, sono opzionali.
Si deve inoltre specificare che lo script è eseguibile, settando gli opportuni bit sul file con
il comando chmod, esempio:
% chmod +x shell_script
All’interno degli script il simbolo # indica un commento da quel punto fino alle fine della
linea; #! è un caso speciale se trovato come primo carattere del file.
● Introduzione
Abbiamo già visto che i nomi dei file in Linux possono essere lunghi fino a 255 caratteri e
che i nomi sono case sensitive, cioè viene fatta distinzione tra lettere minuscole e maiusco-
le (i file tizio e Tizio sono diversi); inoltre in Linux non viene richiesta l’estensione dei file.
Ricordiamoci che per i nomi dei file non si possono usare simboli che hanno un significato
speciale nella shell.
Solitamente si considerano tre tipi di file:
UÊ viÊÀ>\ÊÃiµÕiâ>ÊVÌÕ>Ê`ÊV>À>ÌÌiÀÊV
iÊÌiÀ>ÊVÊÕÊ>ÀV>ÌÀiÊ`ÊviÊviÆ
UÊ directory: file che raggruppano altri file;
UÊ viÊëiV>\ÊV
iÊÀ>««ÀiÃiÌ>ÊÊ`ëÃÌÛÊ`Ê«ÕÌÉ"ÕÌ«Õ̰
L’organizzazione dei file viene fatta in modo gerarchico. La radice, chiamata root, è una
`ÀiVÌÀÞÊiÊÃÊ`V>ÊVÊÊÃLÊɰ
ÌÀiÊ>VÕÊV>À>ÌÌiÀÊ
>ÊÕÊÃ}vV>ÌÊëiV>i]ÊÊÃ}Ê«ÕÌʺ°»Ê`V>Ê>Ê`ÀiVÌÀÞÊ
VÀÀiÌi]Ê`ÕiÊ«ÕÌÊÃÕVViÃÃÛʺ°°»Ê`V>Ê>ÊV>ÀÌi>ÊV
iÊVÌiiʵÕi>Êi>ʵÕ>iÊÃÊm]Ê
VmÊÊ«>`Ài]Ê>ÊÌ`iʺH»Ê`V>Ê>Ê`ÀiVÌÀÞÊ
iÊ`i½ÕÌiÌi]Ê>ÊÃ>Ã
ʺɻÊ`V>Ê>Ê`ÀiVÌÀÞÊ
radice.
Oltre alla radice, in Linux, esistono una serie di directory predefinite (tabella 1):
cd Directory
Volendosi spostare direttamente in una sua sottodirectory (anche infiniti livelli di sottodi-
rectory, non c’è un limite) basta scrivere:
ls
rmdir Directory
rm Directory
È inoltre disponibile il comando pwd (print working directory) che visualizza il nome della
directory corrente.
cp file destinazione
Ã}>Êv>ÀiÊ>ÌÌiâiÊ>Êv>ÌÌÊV
iÊcp non avverte il caso che esista già un file con quel
nome. Per evitare problemi di sovrascrittura si può usare l’opzione -i che abilita la richiesta
di conferma (viene posta una domanda) in caso che il file esista già.
Un’altra opzione molto utile è -a, che conserva nella copia quanto è possibile della strut-
tura e degli attributi dei file originali. Può essere utile se si vogliono preservare gli stessi
permessi durante un backup di sistema.
Spostare un file
Il comando mv (move) serve per spostare i file, il suo uso più elementare è:
mv file destinazione
Rinominare un file
Per rinominare un file (o directory) viene utilizzato il precedente comando mv, la sintassi
più elementare è:
mv nome_file nuovo_nome_file
Naturalmente conviene sempre tutelarci dalla sovrascrittura di un file con lo stesso nome
utilizzando l’opzione –i.
Eliminare un file
Per eliminare un file usiamo il comando rm visto precedentemente per le directory, il suo
uso più elementare è:
rm file
È comunque consigliabile usare un’opzione di sicurezza come -i che chiede conferma per
ogni file da cancellare.
Leggere un file
Per leggere il contenuto di un file possono essere usati tre comandi:
UÊ cat che ci mostra semplicemente il contenuto del file, il suo uso è:
cat nomefile
UÊ less che ci legge il documento pagina per pagina, è possibile scorrere il testo usando le
frecce e uscire dalla letture premendo il tasto q, il suo uso è:
less nomefile
UÊ more che ci permette di controllare in modo più efficiente la visualizzazione, il suo uso è:
more nomefile
lpr nomefile
Se si utilizza l’opzione –pt lpnn sarà possibile dirigere i file a una determinata stampante
(nn), altrimenti viene utilizzata la stampante di default.
Utilizzando il sistema ottale si avrà un numero composto da tre cifre, ognuna per espri-
Permessi di accesso
mere rispettivamente:
in ottale
UÊ Ê«iÀiÃÃÊ`iÊ«À«ÀiÌ>ÀÊ>Ê«À>ÊVvÀ>®Æ
UÊ Ê«iÀiÃÃÊ`iÊ}ÀÕ««Ê>ÊÃiV`>®Æ Per ogni cifra si userà il valore (da 0
UÊ Ê«iÀiÃÃÊ>ÊÌÕÌÌÊ}Ê>ÌÀÊÕÌiÌÊ`iÊÃÃÌi>Ê>ÊÌiÀâ>®° a 7) in base a queste regole:
s NESSUN PERMESSO
VALORE 0;
s PERMESSO LETTURA
VALORE 4;
Utilizzando i caratteri si seguiranno delle semplici regole:
s PERMESSO SCRITTURA
VALORE 2;
UÊ u identifica il proprietario (user); s PERMESSO ESECUZIONE
VA
UÊ g identifica gli utenti dello stesso gruppo del proprietario (group); lore 1.
UÊ o identifica tutti gli altri utenti del sistema (others); Per ogni soggetto basterà fare la
UÊ a identifica tutti gli utenti del sistema (all). somma dei valori dei permessi che
Con: vogliamo assegnargli, per esempio
se desideriamo dare il permesso di
UÊ – si toglie un permesso;
lettura e scrittura, la cifrà sarà:
UÊ + si concede un permesso. 4 (lettura) + 2 (scrittura) = 6
Ovviamente per ognuno dei tre tipi di permesso.
Creare un link
In Linux esistono due tipologie di link:
UÊ ÃLVÊsoft link): è quello che siamo soliti incontrare anche in ambiente Windows
ed è quello che continueremo a usare, salvo specifiche necessità.
UÊ hard link: è qualcosa di più complesso, che lega il link al contenuto stesso (inode) del
file collegato.
Per creare un link simbolico dobbiamo usare il comando ln con l’opzione -s, il suo utilizzo è:
ln -s file nome_collegamento
Ridirezione dell’output
Qualche volta potrebbe essere necessario salvare l’output di un comando in un file oppure
applicare un altro comando sull’output di un comando. Questa operazione è nota come
ridirezione dell’output.
>ÊÀ`ÀiâiÊÃÊv>ÊÕÌââ>`ÊÃ>ʺ>»ÊÃLÊ`Ê>}}Ài®ÊV
iÊÛ>ÊÊÃÌ>`>À`ÊÕÌ«ÕÌÊ
a un file; se questo file esiste già il suo contenuto viene sostituito. Per evitare ciò si deve
ÕÃ>ÀiÊʺ»ÊV
iÊ>}}Õ}iÊÊ`>ÌÊÊv`Ê>Êvi°
Ridirigendo l’output si può anche usare il comando cat che concatena i file e li invia tutti
insieme allo standard output. Ridirigendo questo output a un file, esso verrà creato o
sovrascritto se già esistente.
A fine operazione il filenuovo conterrà i dati del primo file e in coda quelli del secondo,
concatenando così i due file.
Posso creare file vuoti usando: > file
allora tutte le righe che seguono il comando, fino all’etichetta saranno considerate come
facenti parte di un file virtuale e prese come standard input.
È possibile reindirizzare lo standard input e output contemporaneamente. Infatti digitando
il comando:
il comando legge il suo input dal file ingresso e reindirizza il risultato al file uscita.
Ridirezione dell’errore
Come abbiamo detto lo standard error è usato per visualizzare i messaggi di errore; per
default, esso appare sullo schermo ma può essere anche reindirizzato su file in questo caso
si usa il simbolo >&.
In questo modo avremo l’output sul file uscita e lo standard error nel file errore.
● I filtri
Un filtro è un comando che elabora un flusso di dati in input per produrre un flusso di
dati in output. Uno degli usi più comuni dei filtri è quello di ristrutturare l’output. Linux
dispone di molti filtri:
UÊ grep: il comando (grep stringa file) ricerca, nei file elencati nella riga di comando o in
standard input, le righe che contengono la stringa specificata. Per default restituisce le
righe selezionate nello standard output.
Prevede una serie di opzioni, tra cui le seguenti:
-i ignora la differenza tra maiuscole e minuscole;
-l produce solo i nomi dei file che contengono la stringa ma non le righe;
-c dà solo il numero delle righe;
-v dà le righe che non contengono la stringa;
-L dà i nomi dei file che non contengono la stringa.
Il comando grep può essere usato utilizzando anche i metalinguaggi, per esempio il
comando:
ÃÃÌ]Ê ÌÀi]Ê `ÕiÊ vÌÀÊ ÌÊ «ÌiÌÊ µÕ>Ê ºsed»Ê iÊ ºawk»°Ê >Ê «Ìiâ>Ê `Ê Ì>Ê vÌÀÊ
consiste nel modificare il contenuto di un file aggiungendo, eliminando o modificando le
informazioni in maniera non interattiva.
Il nome sed è l’abbreviazione di stream editor; tale comando è particolarmente utile quando
VVÀÀiÊ`vV>ÀiÊÕÊviÊÌÊ}À>`iÆÊÃÊ`}ÌiÀDʺ>ÊÃi`»°
Awk è un linguaggio completo per l’elaborazione di testo, con una sintassi simile a quella
del C, è utile per effettuare ricerche e trasformare i database. È possibile usarlo per cercare
un nome particolare in un documento o per aggiungere un nuovo campo a quest’ultimo.
Le sue caratteristiche, infatti, lo rendono particolarmente adatto a lavorare con file che
contengono informazioni strutturate in campi come inventari, elenchi, database ecc.
● La pipe
ÊÃLÊ`Ê««iʺN»ÊVmÊ>ÊL>ÀÀ>ÊÛiÀÌV>iÊV
iÊÃÕ>ÊÌ>ÃÌiÀ>ÊÌ>>>ÊmÊ«Ãâ>Ì>ÊÊ>ÌÊ>Ê
sinistra del tasto 1, è molto usato all’interno della shell Linux.
1Ã>`ʽ«iÀ>ÌÀiÊ`Ê««iʼN½ÊÃÊVÕV>Ê>>ÊÃ
iÊV
iÊmÊiViÃÃ>ÀÊVi}>ÀiʽÕÌ«ÕÌÊÃÌ>
dard del primo comando all’input standard del secondo comando.
Quindi la pipe è un meccanismo di comunicazione tra due processi che permette di tra-
sferire, ridirigere l’output di un programma su un altro che lo userà a sua volta come suo
input. Per esempio se eseguendo il comando ls per visualizzare il contenuto di una direc-
tory si ha un output troppo lungo da non riuscire a leggerlo tutto, si hanno due possibilità
per gestire l’output:
UÊ À`À}iÀiʽÕÌ«ÕÌÊÊÕÊviÊ`ÊÌiÃÌÊVÊÊV>`]Êls > ls.txt, per poi visualizzarlo con
un editor di testo;
Inoltre una pipeline può essere composta anche da più comandi, nel caso si utilizzi un
comando di filtro come sort, al fine di evitare la creazione di file temporanei tra un pro-
gramma e l’altro, si può usare una pipe per connettere lo standard output di un comando
con l’input di un altro. Per esempio:
Il comando ‘sort’ prende lo standard output del comando ‘ls’ lo ordina e ridirige il suo
standard output allo standard input del comando ‘lpr’. Quindi la linea di comando manda
il listato ordinato alla stampante.
Un altro esempio di uso della pipe può essere, sempre con l’uso dei filtri, nell’uso del
comando grep°Ê*iÀÊÌÀÛ>ÀiÊÌÕÌÌiÊiÊiiÊV
iÊVÌi}Ê>Ê«>À>ʺ*«i»ÊÊÕÊViÀÌÊÌiÃÌ]Ê
>ÊÊVÌi}Ê>Ê«>À>ʺÌÀ»ÊÃʫբÊÕÌââ>ÀiÊ>ÊÃi}ÕiÌiÊi>Ê`ÊV>`\
In questo modo l’output del primo grep, che contiene tutte le linee di file contenenti la
parola Pipe, diventerà l’input del secondo grep che ci restituirà tutte le linee che non
contengono la parola Filtri.
● Le variabili ambientali
Quando si esegue un comando si utilizza un ambiente di esecuzione, in cui possono essere
definite delle variabili dette d’ambiente. Le variabili ambientali sono gestite dalla shell, contraria-
mente alle normali variabili di shell, quelle d’ambiente vengono ereditate da qualsiasi program-
ma che si avvia, compresa un’altra shell. Ai nuovi processi viene assegnata una copia di queste
variabili, copia che essi potranno leggere, modificare e passare a loro volta ai propri processi
figli, ma non ai genitori. Il contenuto di una variabile d’ambiente viene copiato ogni volta che
viene generato un figlio e le modifiche che il figlio apporta non modificano il valore dei genitori.
Si possono creare variabili d’ambiente partendo da una variabile di shell e, con il comando
export VARIABILE, esportarle nell’ambiente.
7 Script di shell
● Introduzione
Le shell sono degli interpreti di un linguaggio, detto linguaggio di shell, che utilizzando i
comandi di tale linguaggio, realizzano dei programmi detti script di shell. Realizzare degli
script non è così difficile. Uno script di shell bash è una lista di comandi da eseguire, salvati
successivamente in un file con estensione sh. La sintassi da imparare è molto semplice e le
regole utilizzate sono poche e ben definite.
Per scrivere uno script di shell, basta un qualsiasi editor di testo, quindi può essere editato
con per esempio, Vi (editor testuale).
Uno script, come tutti i programmi, deve soddisfare le seguenti proprietà:
UÊ `iÛiÊ}À>ÀiÊÃiâ>ÊiÀÀÀÆ
UÊ `iÛiÊiÃi}ÕÀiÊÊV«ÌÊ>ÊVÕÊmÊ`iÃÌ>ÌÆ
UÊ >Ê}V>Ê`iÊ«À}À>>ÊmÊV
>À>iÌiÊ`ivÌ>ÊiÊÛÃLiÆ
UÊ ÊÃÛ}iÊiViÃÃ>À>iÌiÊÕÊ>ÛÀÆ
UÊ `iÛiÊiÃÃiÀiÊÀÕÌââ>Li°
Per poter richiamare lo script con il #!/bin/bash per comunicare la shell che eseguirà lo script.
suo nome, senza indicare il PATH
completo, si deve inserire nella va- 2. L’estensione degli script è .sh: ogni volta che si deve salvare uno script appena creato,
riabile PATH la directory in cui si trova deve avere come estensione sh.
il file, con il comando:
3. Uno script, per funzionare, deve essere reso eseguibile: una volta salvato lo script,
PATH=$PATH
per renderlo eseguibile, si deve usare il seguente comando per dare all’utente che ha
In alternativa si può inserire l’istruzio- scritto il file il permesso di essere eseguito:
ne nel file .profile nella propria home
directory. chmod +x nome_script.sh
4. Avviare lo script attraverso ./: se la directory corrente non fa parte del PATH, per poter
avviare uno script, da terminale, si deve procedere come segue:
./nome_script.sh
Un semplice script potrebbe essere quello che stampa la propria HOME DIRECTORY:
vi stampa-home
#! /bin/bash
echo $HOME
abbiamo visto che dopo aver editato lo script, dobbiamo salvarlo e successivamente uscire
dall’editor e infine eseguirlo.
Il modo più semplice per eseguire lo script creato in bash è col comando sh <nomefile>.
Nel nostro caso:
mio-prompt> sh stampa-home
successivamente si deve modificare il PATH in modo tale che sia compresa la localizzazione
del file, in modo da poterlo eseguire:
I commenti
Uno dei modi migliori di introdurre gli elementi sintattici degli script di shell è quello di
utilizzare i commenti. Un commento all’inizio dello script può spiegarne lo scopo e il modo
per usarlo, altri commenti possono spiegare singole istruzioni. In bash i commenti vengono
individuati dal carattere #. In particolare, tutto ciò che segue ed è sulla stessa riga di # è
da considerarsi un commento.
Per esempio le linee seguenti rappresentano commenti:
# Questo è un commento su una linea
# Questo è un commento
# su due linee
funzione() # questo è un commento dopo una funzione
VARIABILE=valore
Inoltre per fare riferimento al valore della variabile si fa precedere il nome della variabile
dal $ che provoca l’espansione della variabile:
echo $VARIABILE
Esistono molti operatori utilizzabili con le variabili, gli operatori di stringa e quelli di con-
trollo di contenuto.
Gli operatori di stringa controllano se la variabile è nulla, per esempio:
Gli operatori di controllo di contenuto servono per operare con stringhe con formatta-
zione libera come per esempio la variabile PATH.
Solitamente sono usati per manipolare i nomi di file e di percorso, per esempio:
Esistono anche degli operatori di controllo come && e // che ci permettono di collegare
due comandi e controllando la terminazione del primo comando decidono se eseguire o
meno il secondo. Per esempio:
I parametri posizionali possono essere modificati mediante il comando set, che assegna
direttamente i valori alle variabili posizionali, shift che fa traslare i valori dei parametri.
Quando un’espressione che contiene questi caratteri si trova nel mezzo di un comando, sh
sostituisce l’elenco di tutti i file il cui nome corrisponde al modello. Questo è noto come
ºÊ }LL}°½½Ê1ÊL>VÃ>Ã
ʺM»® invece rimuove ogni significato speciale dal carattere che
segue. Se il carattere dopo il backslash non è speciale, il backslash non ha alcun effetto.
● L’istruzione se
L’if è l’istruzione più semplice relativamente a un costrutto di controllo che si può trovare.
Se si avesse bisogno di più condizioni annidate, si può avere una forma generale la cui
sintassi è:
if la condizione è vera
then
esegui comandi
elseif altra condizione vera
then
esegui comandi
else
esegui comandi
fi
if ((Voto>=6))
then
echo “Promosso!”
else
echo “Mi spiace…Bocciato!”
fi
La condizione può essere indicata con un’espressione condizionale tra parentesi quadre:
e così via per gli altri operatori relazionali (-gt >; -ge >=; -lt <; -le <=).
Espressioni con operatori logici:
UÊtÊÌÊ Ê «iÀ>ÌÀiÊ `Ê i}>âi]Ê ÛiÀÌiÊ Ê Û>ÀiÊ }VÊ `i½iëÀiÃÃiÊ >Ê VÕÊ ÛiiÊ
applicato (!(vero) = falso).
UÊ>Ê>`Ê Ê «iÀ>ÌÀiÊ Ê }V]Ê ÀÌÀ>Ê ÛiÀÊ ÃiÊ iÌÀ>LÊ }Ê >À}iÌÊ «>ÃÃ>ÌÊ ÃÊ
veri.
UÊÊÀÊ «iÀ>ÌÀiÊ",Ê}V]ÊÀÌÀ>ÊÛiÀÊÃiÊ>iÊÕÊ`i}Ê>À}iÌÊmÊÛiÀ°
● L’istruzione mentre
L’istruzione while è simile a qualsiasi altro linguaggio di programmazione. La sua sintassi
in sh è:
while condizione
do
comandi
done
Come probabilmente sappiamo il ciclo while esegue i comandi fino a quando la condizio-
ne è vera. Anche in questo caso, condizione può essere qualsiasi comando, ed è vero se il
comando termina con uno stato pari a zero.
Un ciclo while può contenere due comandi speciali: break, per il quale si esce dal ciclo
while saltando alla prima istruzione successiva al fatto e continue, che salta il resto del
corpo del ciclo e salta di nuovo alla parte superiore, dove condizione viene valutata.
Per esempio:
EXIT_SUCCESS=0
while [ “$RISPOSTA” != “q” ]
do
echo “Premi un tasto (per uscire \”q\”):”
read RISPOSTA
done
iÊ}Õ>}}ÊVÕiÊÃÊ«ÌÀiLLiÊ`Ài\ʺvV
jÊmÊÛiÀ>Ê>ÊV`âiÊiiÊ«>ÀiÌiÃ]ÊiÃi}ÕÊiÊ
istruzioni tra do e done»°Ê iÊÃÌÀÊV>Ã]Ê>ÊV`âiÊ`>ÊÛiÀvV>ÀiÊmÊ“$RISPOSTA’’ != “q’’.
Sottolineiamo come prima cosa che le virgolette giocano un ruolo fondamentale, soprattutto
quelle relative alla variabile $RISPOSTA; se avessimo scritto $RISPOSTA != “q’’, la shell
avrebbe interrotto l’esecuzione dello script ritornando un messaggio e un codice d’errore.
● L’istruzione per
Il ciclo for della shell bash è decisamente differente da quello presente in altri linguaggi di
programmazione, infatti la sua sintassi è:
Per esempio:
EXIT_SUCCESS=0
for file in $(ls $PWD);
do
echo $file
done
exit $EXIT_SUCCESS
All’inizio, il ciclo inizializza una nuova variabile $file al primo elemento della lista
$(ls $PWD), che contiene l’output del comando ls $PWD e successivamente stampa sullo
schermo il contenuto di tale variabile.
Questo processo continua fino a quando non vengono esauriti gli elementi presenti
nella lista. La lista di elementi deve essere composta da una serie di parole separate dal
separatore (eventualmente più di uno) standard $IFS, come abbiamo visto preceden-
temente.
● Le funzioni
Quando un gruppo di comandi si verifica più volte in uno script, è utile definire una
funzione. La definizione di una funzione è un po’ come la creazione di un mini-script
all’interno di uno script.
[ function ] Nome () {
comandi
}
Se analizziamo la sintassi vediamo che la parola chiave function è tra parentesi quadre
poiché è opzionale, infatti possiamo analogamente scrivere
L’unica differenza tra le due dichiarazioni consiste nel fatto che la scrittura di function
consente di omettere le parentesi tonde (), altrimenti obbligatorie. Altra cosa importante
da notare è che le parentesi graffe devono essere separate dal testo che le precede tramite
ÕÊë>â]ÊÕÊ/ ÊÌ®ÊÊÕÊ
7
Ê®°
Definendo una funzione, si ha quindi l’opportunità di richiamare i comandi in essa conte-
nuti in maniera più semplice all’interno di uno script, possiamo anche passarle argomenti
sotto forma di parametri posizionali e ritornare allo script un valore attraverso il quale
scegliere cosa fare successivamente.
Ê«ÃÃLiÊÀi`Àââ>ÀiÊÕ>ÊvÕâiÊ`ÊÉ"]Ê«À«ÀÊViʵÕ>Ã>ÃÊ>ÌÀÊV>`°Ê
Può succedere che sia necessario utilizzare all’interno di una funzione un nome di variabile
già utilizzato nel codice dello script. Ciò può accadere spesso negli script di grosse dimen-
sioni, in cui si vuole che le variabili abbiano nomi significativi.
Per evitare di modificare il valore della variabile globale la shell bash consente di dichiarare
delle variabili che vivono solo all’interno del corpo della funzione, tali variabili vengono
dette locali e vengono dichiarate attraverso l’istruzione:
Le parentesi quadre rappresentano argomenti facoltativi, infatti local può essere richiama-
to da solo (sempre all’interno di una funzione) con il risultato di stampare sullo standard
output una lista di variabili locali definite nella funzione.
Una funzione può anche prendere argomenti della riga di comando, proprio come qualsiasi
altro script.
Per esempio:
function lista ( ){
CD $1
ls
}
#main
lista
5 sintesi
lezione 2 Linux
Linux è un Sistema Operativo Open Source, multitasking e multiutente. Open Source
significa che è presente il codice sorgente e che può essere compilato per ottenere un
codice eseguibile. Esistono diverse distribuzioni di Linux come Debian, Ubuntu ecc.
Molte sono le caratteristiche che lo rendono interessante, per esempio la grande inte-
razione con l’utente.
lezione 3 La shell
Una shell può essere vista come uno strumento per parlare con il computer. L’interfaccia
testuale di Linux è strettamente integrata con la GUI e spesso deve essere utilizzata per
>VÕiÊ«iÀ>â°ÊÊÕÝÊÃÊ`ëLÊ`ÛiÀÃiÊÃ
i]ÊÌÀ>ÊVÕ\Ê "1,
Ê-]Ê
-Ê
Ê-i®]Ê-ÊÀÊ-
i®ÊiÊ -Ê ÕÀiÊ}>Ê-i®°
I comandi che si impartiscono alla shell sono composti da tre parti: nome del comando,
opzioni e uno o più argomenti.
➞ L1
➞ L2
➞ L2
➞ L3
➞ L3
➞ L4
➞ L5
➞ L5
➞ L6
➞ L7
➞ L8
➞ L9
Domande
1 Quando è già stato fatto il login si può iniziare un’altra sessione di lavoro in un’altra console. Qual è
l’azione da effettuare per passare il controllo alla terza console? Devo effettuare sempre lo stesso login?
2 Cosa si realizza con il comando su?
3 L’utente root può cambiare la password di un utente normale? In che modo?
4 Cosa si realizza con il seguente comando: $ cd/usr/bin [Invio]?
5 Supposto di essere nella directory precedente, quale comando cambia la directory corrente in modo che
diventi ÉÕÃÀÉV>ɶÊÊ«iÀVÀÃÊ`V>ÌÊmÊ>ÃÃÕÌÊÊÀi>ÌÛ¶
6 A cosa serve il seguente comando: $ cd [Invio]?
7 Come faccio a visualizzare i file che iniziano con un punto nella directory home di un utente?
8 Quale comando utilizzo per visualizzare il contenuto di file di testo?
9 Spiega quali sono i comandi per leggere un file e quali sono le loro differenze.
10 Spiega cosa produce la seguente sequenza di comandi:
cat Pippo > Pluto
cat Topolino >> Pluto
11 Dopo aver spiegato in cosa consiste il comando grep e quali sono le sue opzioni, scrivi quale comando
utilizzi per trovare tutte le righe del file che iniziano per t.
12 Cosa produce la seguente linea di comando: ‘ls | pr -3 | lpr’?
Risposte
1 Devo fare [Alt+F3], così si passa alla terza console virtuale e su questa si può eseguire un login differente.
Le attività svolte nelle varie console virtuali sono indipendenti, come se fossero svolte attraverso termina-
li fisicamente distinti.
2 Si termina una sessione di lavoro e si conclude l’attività della shell, ovvero di quel programma che
mostra il prompt.
3 Sì l’utente root cambia la password di un altro, inserendo semplicemente la nuova password senza dover
conoscerne la vecchia dell’utente normale.
4Ê
Ãi}Õi`ÊÊV>`Ê«ÀiVi`iÌi]Ê>Ê`ÀiVÌÀÞÊ>ÌÌÕ>iÊ`iÛiÊ`ÛiÀiÊÉÕÃÀÉLɰ
5Ê fÊV`ÉÕÃÀÉV>ÊQInvio]
5 Il percorso indicato è assoluto perché inizia con una barra obliqua che rappresenta la radice.
6 Usando il comando cd senza argomenti, si raggiunge la propria directory personale, senza bisogno di
indicarla.
7 $ ls -a [Invio]
8 Solitamente si utilizzano i comandi cat e more.
5 in English, please
Abstract
INTERACTION WITH THE OPERATING SYSTEM
In this module the fundamental elements are the interaction with the computer and
in particular the function of the shell. We examine the main characteristics of Linux
and of its shell bash. We also look at use of scripts in programming the shell.
Questions
1 Describe the interaction with the operating system. 4 Describe the main Linux shell.
2 Explain the main differences between GUI and CLI. 5 Is it similar to the management of I/O in Linux?
3 What are the main features of Linux? 6 Explain the main features of a shell script.
Glossary Glossario
BIOS (Basic Input / Output System): the program and binding for a given user logged into the system.
resident in the hardware that starts up (boots) the As part of its directory, the user has full access, but
computer. It can be configured with a utility called up normally cannot act in other users’ home directories
by pressing a button on the computer (usually DEL). Generally, the user name corresponds to bring home
Bootloader: ÃvÌÜ>ÀiÊÃÌ>i`ÊÊÌ
iÊ ,ÊvÊÌ
iÊ >`ÊÃÊV>Ìi`ÊÊ>ÊLÀ>V
ÊvÊÌ
iÊviÊÃÞÃÌiÊV>i`ʺÉÊ
hard disk in order to start an operating system among
i»°
those present on the system configuration, passing Init: process that starts up in Linux software services
>ÞÊ«>À>iÌiÀðÊ
Ý>«iÃÊÊ 1ÊÉÊÕÝÊ>ÀiÊ"Ê in the machine after loading the kernel. Always has a
>`Ê,1 ° PID number as it is the first process started.
Bootstrap: sequence of operations initiated by the LILO (LInux LOader): bootloader widely used in
"-ÊÌ
>ÌÊ>ÜÃÊ>ÊV«ÕÌiÀÊÌÊL̰ 1ÊÉÊÕݰ
Case sensitive: said of a system that distinguishes Live CD: CD-Rom containing an operating system
Õ««iÀV>ÃiÊvÀÊÜiÀV>Ãi°ÊÊÌ
iÊVÃiÊ 1ÊÉÊÕÝÊ that boots directly, without having to install it on your
º,
»ÊviÊÃÊ`vviÀiÌÊvÀÊÌ
iʺÀi>`i»Êvi° V«ÕÌiÀÊ
>À`Ê`ÀÛi°Ê««ÝÊÃÊiÊiÝ>«i°
DOS (Disk Operating System): Microsoft operating Open Source: software for which source code is
system created in the 80s for the first Personal publicly available, fundamental prerogative of free
Computer. It has a command-line interface, such as software and the GPL license.
the Linux console. Path: 1) location of a file within the directory tree. 2)
EXT2 / EXT3: two types of file systems used in Linux. system variable which contains the paths where the
GNU (GNU is Not Unix): recursive acronym to system looks for commands to execute.
indicate the operating system developed by R. Stallman Root: 1) in a Linux file system, the highest level
after 1984 in order to provide an environment directory that contains all of the others, indicated by
compatible with UNIX, but based on the philosophy ºÉ»°ÊÓ®Ê/
iÊ}Ê>iÊvÊÌ
iÊÃÕ«iÀÕÃiÀ°
of Free Software. Later he joined the system giving rise Script: a program written in a language that does not
ÌÊÕÝÊ 1ÊÉÊÕݰ require compilation, but is run directly by a special
Home Directory: Ê1 8Ê>`Ê 1ÊÉÊÕÝÊ`ÀiVÌÀÞÊ >««V>Ì]ÊV>i`ʺÌiÀ«ÀiÌiÀ»°
Conoscenze
Fasi e modelli di gestione di un ciclo di sviluppo.
Tecniche e strumenti per la gestione delle specifiche e dei requisiti di un progetto.
Tipologie di rappresentazione e documentazione dei requisiti, dell’architettura dei
componenti di un sistema e delle loro relazioni e interazioni.
Rappresentazione e documentazione delle scelte progettuali e di implementazione
in riferimento a standard di settore.
Abilità
Identificare le fasi di un progetto nel contesto del ciclo di sviluppo.
Documentare i requisiti e gli aspetti architetturali di un prodotto/servizio, anche in
riferimento a standard di settore.
Prerequisiti
Saper risolvere problemi.
Saper organizzare i dati usando matrici e tabelle.
Saper organizzare un programma in sottoprogrammi.
! Per ingegneria del software s’intende tutta quella parte dell’informatica legata alla progettazio-
ne, alla produzione, alla riutilizzabilità e alla manutenzione dei programmi atta a ridurre i costi di
produzione del software migliorandone la qualità.
Per progettazione si intende lo studio di un problema e l’individuazione della soluzione informa-
tica atta a risolverlo.
Per produzione si intende l’insieme delle fasi che portano a scrivere un programma in un linguaggio
di programmazione e a renderlo funzionante per l’utente finale.
Per riutilizzabilità si intende la possibilità di usare pezzi di programma già realizzati per creare
nuovi sistemi.
Per manutenzione si intende l’insieme delle attività di modifica e aggiornamento di un program-
ma necessarie per poter continuare a usarlo nel tempo.
L’ingegneria del software può essere comparata all’ingegneria civile: anche un edificio viene
prima ideato e progettato (dagli architetti che realizzano il progetto e i disegni), poi rea-
lizzato (dall’impresa edile) e infine consegnato al cliente. Sono inoltre da effettuare attività
manutentive periodiche più o meno onerose, perché l’edificio rimanga sempre efficiente
per tutto il tempo del suo utilizzo; si hanno a questo proposito manutenzioni di conser-
vazione (la tinteggiatura delle pareti), di riparazione a fronte di guasti (aggiustamento del
tetto, rifacimento dell’impianto elettrico) o di tipo migliorativo (aggiunta di una veranda).
In tutte queste fasi rivestono particolare importanza la documentazione del processo
e del progetto, cioè l’insieme di tutti quei documenti indispensabili per consentire la
tracciabilità delle attività svolte e delle ragioni che hanno condotto a determinate scelte
tecnologiche.
Il termine software engineering è stato introdotto nel 1967 dal professore F. Bauer. Tra
le molte definizioni disponibili, riportiamo quella dell’IEEE (Institute of Electrical and
Electronics Engineers).
Per fornitori intendiamo, invece, coloro che sviluppano e vendono il software. Tra questi
troviamo quindi i “commerciali” delle aziende di software, gli analisti, i progettisti, i pro-
grammatori ecc.
● Processo
Per processo di sviluppo definiamo tutte le attività e le procedure organizzative che vengo-
no definite per poter portare allo sviluppo di un prodotto di qualità.
Un modello di processo permette di:
UÊ suddividere le attività da svolgere e stabilirne l’ordine di esecuzione;
UÊ stabilire la documentazione da fornire e quando questa deve essere fornita;
UÊ assegnare le singole attività agli sviluppatori;
UÊ fornire criteri e metodi per monitorare l’andamento del progetto.
● Progetto
Si descrive il progetto nei minimi dettagli, prima a livello macro, poi sempre più nei par-
ticolari, fino a identificare anche gli aspetti implementativi. Questa fase viene suddivisa in
● Realizzazione
Si codifica (traduce) il progetto in programmi scritti in un linguaggio di programmazione,
si eseguono dei test e si integrano tra loro le differenti componenti del sistema. Si consegna
il prodotto al cliente e il sistema entra in produzione.
In particolare vengono effettuate le seguenti attività:
UÊ Programmazione.
Vengono codificate nel linguaggio di programmazione scelto le varie procedure e ven-
gono effettuate le prime prove di funzionamento per eliminare gli errori più grossolani
(sintattici e logici).
UÊ Test.
Vengono effettuati dei test più approfonditi tramite cui è possibile individuare e correg-
gere gli errori di logica verificando che la semantica del programma sia corretta.
UÊ Integrazione e test del sistema.
Si eseguono dei test approfonditi e si integrano tra loro le differenti componenti del
sistema. Si effettuano dei test per verificare se i moduli (già controllati singolarmente dal
punto di vista funzionale) continuano a funzionare insieme agli altri.
UÊ Rilascio del prodotto (release) e collaudo.
Viene consegnato al committente il prodotto software completo e la relativa documen-
tazione comprendente tra l’altro il manuale d’uso. Il sistema viene installato presso il
cliente in quella che sarà la sua locazione definitiva.
Vengono effettuati test specifici con il personale del cliente e utilizzando dei dati di
prova reali. A fronte di errori funzionali dovuti a incomprensioni e malintesi tra il com-
mittente e il progettista si provvede alla loro correzione. Si realizzano i primi corsi di
istruzione per il personale del cliente.
UÊ Avviamento.
Il sistema entra in produzione, cioè comincia a essere utilizzato concretamente dal
cliente anche se in questa fase il fornitore affianca ancora per un certo periodo il cliente
correggendo eventuali anomalie che dovessero emergere. Vengono avviati corsi più spe-
cifici e approfonditi.
● Software di qualità
Tre sono le caratteristiche che deve avere un software per potersi dire di qualità:
UÊ il prodotto deve rispecchiare fedelmente le reali necessità dell’insieme di persone per
cui il software è realizzato (il “CLIENTE”), deve cioè rispettare le esigenze funzionali
dell’utente e le prestazioni definite e concordate;
UÊ deve essere facilmente manutenibile, deve cioè essere possibile apportare modifiche al
programma in modo immediato e localizzato, senza quindi sconvolgere l’organizzazione
del sistema;
UÊ deve essere ben documentato, sia per quanto riguarda il manuale utente, sia per tutta la
documentazione di progetto.
Il software non è infatti solo un insieme di programmi, ma comprende anche tutta la docu-
mentazione per la definizione, lo sviluppo e la manutenzione degli stessi. Di questo fatto ci si
dimentica e spesso si provvede alla stesura della documentazione solo a progetto finito quando
● Gestione progetto
Oltre al tempo dedicato alle fasi più operative della realizzazione del 10%
software (analisi, codifica e test) bisogna anche considerare il tempo da 45%
dedicare alla pianificazione e alla gestione del progetto e alla sua docu- 20%
mentazione. Nella figura 1 viene mostrato come statisticamente si può
suddividere il tempo di un progetto software. Si può vedere che il tempo
dedicato ai test e al controllo qualità, comprendendo tutte le fasi relative
5% 20%
alle varie prove e alle conseguenti modifiche, occupa ben il 45%. Se poi
si confrontano la fase di analisi e di realizzazione (cioè la fase produttiva)
e la fase di manutenzione risulta ancora più evidente come il tempo dedi- pianificazione
cato alla correzione e alla modifica del sistema una volta in produzione analisi e progettazione
programmazione effettiva
sia percentualmente molto alto (figura 2). Questo soprattutto se le documentazione
fasi precedenti non sono state fatte in modo ottimale, con specifiche poco test e controllo qualità
chiare e programmi difficilmente modificabili per cui a volte risulta più
facile riscrivere un pezzo di programma piuttosto che modificarlo. figura 1 Suddivisione del tempo
La riduzione di questo tempo porterebbe a un notevole risparmio in relativo alle varie fasi
termini di costi, poiché si potrebbero impegnare meglio le risorse, con-
segnare il prodotto in tempo e ridurre gli interventi successivi. Per farlo
è necessario realizzare un software di qualità, che riduca al minimo il 35%
numero e il peso delle revisioni e correzioni a posteriori. Il costo delle 65%
modifiche a un sistema software cresce in modo esponenziale a mano a
mano che ci si allontana dalle fasi iniziali del progetto. Nella figura 3
viene riportato il diagramma proposto da Bohem nel volume Software
Engineering Economics in cui si evidenzia come l’individuazione e la corre-
zione di un errore durante l’uso di un sistema costino 200 volte di più di manutenzione
sviluppo
ciò che sarebbero costati se si fosse individuato e corretto durante la fase
di analisi. Per questo bisogna dedicare più tempo alle fasi iniziali (analisi
e progettazione) realizzandole in modo più accurato, permettendo una figura 2 Differenza tra tempo
programmazione senza errori e imprecisioni (o quasi). dedicato allo sviluppo e alla manutenzione
200
100
80
60
40
20
ANALISI CODIFICA ACCETTAZIONE
PROGETTO TEST ESERCIZIO
Dati specifici per alcune parti del ciclo di vita del software. Per esempio sono nate apposite
io
nz
metodologie per l’analisi e la descrizione dei dati e metodi per guidare il progettista nella
Fu
fase di analisi funzionale. Esistono anche metodologie complete che guidano il progetti-
sta in tutte le fasi del ciclo di vita del software. Alcune metodologie sono state sviluppate
figura 1 Aspetti da anche in base al campo di applicazione del software da produrre, per cui sono stati trovati
coprire da parte di una metodi particolarmente efficaci per realizzare software gestionale e metodi applicabili per
metodologia il progetto di sistemi real-time.
Esistono alcuni aspetti che devono essere trattati con differenti metodi (figura 1):
UÊÊ>ëiÌÌÊvÕâ>i\ÊV
iÊVÃ>Ê`iÛÊv>ÀiÊiÊÛ>ÀiÊV«iÌÊ`iÊÃÃÌi>Æ
SADT - Structured flusso dei dati e delle funzioni che approccio top-down spinto
Analysis and Design agiscono su loro
Technique
entità-relazioni descrizione dei dati approccio orientato alla semantica dei dati
UML - Unified metodologia a oggetti comprendente molto completa e moderna
Modelling Language aspetti funzionali, temporali e di dati
Alcune metodologie coprono tutti questi aspetti, mentre altre si concentrano solo sugli
aspetti funzionali o su quelli dei dati. In questi casi si preferisce parlare di tecniche piutto-
sto che di vere metodologie.
Nella tabella della pagina a fianco sono riportate alcune tecniche metodologiche con indi-
cati gli aspetti che coprono.
SADT/IDEF A B B
reti di Petri B A –
UML A M A
diagrammi di flusso A – B
DFD A B M
ER – – A
● Modello a cascata
Il modello a cascata (waterfall), formalizzato nel 1970 da Royce e raffinato da Boehm nel
1976, risulta essere il ciclo di vita più conosciuto e messo alla prova.
Nella sua definizione originaria, il modello può essere rappresentato come nella figura 1.
Esigenze aziendali
Analisi
Progetto
Sistema completo
Realizzazione
Il modello a cascata divide il ciclo di vita del software in una serie di fasi, alcune delle quali
sono strettamente sequenziali, in particolare quelle relative al periodo di sviluppo. L’output
di ogni fase è input per la fase successiva ed è possibile tornare indietro a una fase prece-
dente se si verificano errori o cambiamenti di specifiche. In questo caso andranno rivisti e
modificati i documenti e le parti già realizzate.
Questo è stato il primo modello di ciclo di vita del software e ha permesso la nascita di
grossi sistemi organizzandone la crescita. Ancora oggi molte metodologie fanno riferimento
a questo modello, anche se si evidenziano alcuni punti deboli che ne penalizzano l’efficacia.
Pur permettendo il ritorno a fasi precedenti, questa attività risulta pesante, comportando una
revisione e riorganizzazione dei requisiti e della documentazione, con costi e tempi a volte
eccessivi. Inoltre, fino a quando non si raggiunge la fase di codifica, il modello permette solo
un limitato feedback da parte del committente, con la conseguente individuazione di errori di
interpretazione dei requisiti solo alla fine della fase di sviluppo. In questo caso il riesame delle
● Prototipizzazione rapida
Il modello Rapid Prototyping è stato formalizzato da Gomaa e Scott nel 1981; obiettivo di
questo modello è assicurare l’aderenza del prodotto finale alle attese della committenza.
Un prototipo software è un sistema che funziona effettivamente, ha una durata non gene-
ralizzabile e può servire a vari scopi. È parte integrante di un processo iterativo di sviluppo
centrato sull’utente e deve poter essere costruito rapidamente e a basso costo.
Il modello è stato proposto come soluzione ad alcuni principali problemi emersi con l’ap-
plicazione del modello waterfall:
UÊ `vvVÌDÊ`ÊvÀ>ââ>ÀiÊÊ`ÊÊ>L}ÕÊiÊ>`iÀiÌiÊÊÀiµÕÃÌÆ
UÊ VÃÌÊiiÛ>ÌÊ«iÀÊ>Ê`vV>Ê`iÊÀiµÕÃÌÊÊv>ÃÊ>Û>â>ÌiÊ`ÊÀi>ââ>âi°
ASCOLTARE COSTRUIRE
IL CLIENTE IL MODELLO
TEST
DEL CLIENTE
● Modello incrementale
In questo modello si adotta una strategia di segmentazione del progetto in parti al fine di
soddisfare più velocemente (per quanto possibile) l’utente e ottenere feedback anticipati
sull’efficacia del prodotto.
Il sistema viene diviso in parti differenti che possono essere progettate e sviluppate in
parallelo (figura 3).
Nel modello incrementale viene subito realizzata una prima parte del sistema (kernel), già
completamente utilizzabile da parte degli utenti. La prima versione del prodotto risulta,
quindi essere la parte “invariante” del sistema in grado di soddisfarne i requisiti di base.
In base alle valutazioni degli utenti possono emergere i requisiti di secondo livello che
permetteranno di definire il piano di rilascio successivo, cioè l’incremento rispetto alla
versione precedente. Il prodotto finale sarà il risultato di un numero limitato di incrementi.
Da notare che è possibile lavorare sugli incrementi successivi mentre si è ancora in fase di
completamento di quelli precedenti (figura 4).
Integrazione
INCREMENTO 2 Disegno Codifica e Test
. .
. .
. .
Integrazione
INCREMENTO n Disegno Codifica e Test
● Modello a spirale
Il modello a spirale estremizza il concetto di sviluppo incrementale. In tale modello il ciclo
di vita è un insieme di numerosi prototipi, che si evolvono attraverso successive sperimen-
tazioni e raffinamenti fino a soddisfare completamente le necessità dell’utente.
La manutenzione diviene la componente centrale: si arriva al prodotto finito tramite una serie
di approssimazioni successive. Vengono considerate quattro fasi (analisi, progetto, realizza-
zione, test). Si parte da un nucleo iniziale del programma e si realizzano di questo le quattro
fasi. Si aggiungono quindi nuove funzionalità al sistema e si ripercorrono i passi precedenti
(figura 5). Si parla anche di approccio prototipale perché alla fine di ogni ciclo si ottiene
un sistema utilizzabile, anche se non completo, cioè un vero e proprio prototipo.
Il software è sviluppato attraverso una serie
di release incrementali. Le prime release sono
prototipi che concretizzano i requisiti noti; le ANALISI REQUISITI PROGETTO
iterazioni successive sono versioni operative
del sistema fino alla versione finale.
Questo modello risulta interessante anche
perché unisce in sé caratteristiche del model-
lo per prototipi (fondamentale per la defini-
zione dei requisiti) e del modello waterfall
(formalizzazione di ogni fase in ogni release
successiva).
Va infine sottolineato che l’applicazione del
modello a spirale richiede la capacità di valu- TEST REALIZZAZIONE
tare i rischi tecnici del progetto a ogni itera-
zione: ciò consente di ridurre i rischi prima figura 5 Modello a spirale
che si trasformino in problemi effettivi.
● Videate di input/output
In ogni applicazione possono apparire videate (o schermate) differenti per permettere
all’utente di interagire con l’applicazione (videate di input – figura 2) e di vedere i
risultati (videata di output o prospetto di stampa – figura 3). Per ognuna di esse è
necessario definire qual è il formato che sarà presentato all’utente in fase di esecuzione del
programma segnando in modo opportuno quali sono le intestazioni e le descrizioni e quali
invece i campi di input e di output. Alcuni linguaggi forniscono già delle funzionalità per
tale realizzazione (per esempio i form in Visual Basic o i report di Access), mentre per altri
(per esempio C++) è necessario crearsi le maschere tramite istruzioni di input e output. In
ogni caso a livello di progetto queste andranno descritte.
esempio
Vediamo un esempio di un supermercato.
Vogliamo una bibita e la cerchiamo in uno Scaffali Cliente
scaffale del supermercato. Una volta trovata
la bibita andiamo alla cassa, paghiamo e Cerca bibita
viene emesso lo scontrino.
bibita Cassiere
Pagamento ed
emissione scontrino
Scontrino
UÊ Parallelismo
La concorrenza di operazioni che possono essere fatte partire in parallelo (figura 5).
UÊ Branching
Si possono rappresentare situazioni in cui lo stato vero di una con-
dizione avvia 2 eventi, oppure situazioni in cui la condizione viene
resa vera da uno o da un altro degli eventi (figura 6).
esempio
Possiamo rivedere l’esempio del supermercato in cui il cassiere, una volta che ci ha servito,
torna disponibile per un altro pagamento.
Scaffali Cliente
Cerca bibita
Bibita Cassiere
Pagamento ed
emissione scontrino
Scontrino
8 Modello Entità-Relazione
● Entità e attributi
Conosciuto anche come modello E-R (Entity-Relationship), si basa sul concetto che è possi-
bile modellare la realtà individuando delle entità e delle relazioni (o associazioni) tra di esse.
Le entità sono elementi della realtà che vengono raggruppati in una classe essendo dotati
di caratteristiche comuni (la classe costituisce il tipo di entità, mentre le istanze della classe
sono le entità) e vengono rappresentate graficamente con un rettangolo. Il termine entità
viene spesso usato indistintamente per indicare sia la classe sia la singola istanza.
Gli attributi o caratteristiche sono le proprietà attraverso cui è possibile descrivere un’en-
tità (ma anche un’associazione). Vengono rappresentati graficamente con punti collegati a
entità o ad associazioni. Non possono esistere da soli (figura 1).
Per esempio “persona” è un tipo di entità con le caratteristiche “nome” e “città” mentre
“ROSSI” di “Milano” è un’istanza del tipo entità persona.
Nome
PERSONA
Città
● Associazioni
Le associazioni o relazioni sono i legami logici esistenti tra due o più entità e vengono
rappresentate graficamente con un rombo collegato alle entità. Un’associazione non può
esistere slegata dalle entità (figura 2).
Le associazioni corrispondono esattamente al concetto matematico di relazione fra insiemi
(figura 3). Si hanno infatti associazioni di tipo 1:1 (a ogni elemento del primo insieme
ne corrisponde uno e uno solo del secondo insieme e viceversa), 1:N (a un elemento del
primo insieme possono corrispondere più elementi del secondo insieme, ma non è vero il
contrario) e M:N (a un elemento del primo insieme possono corrispondere più elementi
del secondo insieme e viceversa).
DATA ACQUISTO
RELAZIONE
MATRIMONIO
MARITI
MOGLI
b) RELAZIONI 1: N
RELAZIONE
MADRI-FIGLI
FIGLI
MADRI
c) RELAZIONI M: N
RELAZIONE
TRA CUGINI
CUGINI
CUGINI
N
NOME
DATA AU TORI
NASCITA
● Componenti IDEF
Due sono le componenti fondamentali: il box o rettangolo e l’arrow o freccia.
Il box (rettangolo) rappresenta una funzione o un’attività del sistema ed è “etichettato” da un
predicato verbale. Esiste un ordinamento tra i box (dominanza), espresso con la loro numera-
zione. La dominanza evidenzia l’importanza relativa delle attività, vari passi di attività conse-
quenziali, attività che consentono di controllarne altre (figura 3).
PROGETTARE
1
COSTRUIRE
2
PRODURRE
3
esempio
Vediamo ora un esempio in cui vogliamo descrivere la fase iniziale di un qualsiasi progetto
in cui viene definito un prodotto. Lo schema a livello 0 potrà essere il seguente:
Controlli
Analisi Mercato
La difficoltà nel creare un diagramma SADT è nel riuscire a rappresentare per ogni casella
un’attività ben identificabile, con input, output e condizionamenti non ambigui. Si dovrà
inoltre cercare di decomporle a uguale livello di dettaglio, riducendo al minimo le interazio-
ni fra caselle in modo che la rappresentazione grafica dia un’immagine chiara delle attività.
Istruzioni
Ingredienti
Preparare un Hamburger
data
hamburger
Utensili Griglia o
da cucina barbecue
figura 2 Preparare un hamburger figura 3 Schema IDEF per preparare un hamburger
Definire ● Connessioni
Input DISEGNI
Prodotto
esempio
Vediamo ora un esempio in cui si descrive la preparazione di una lettera da spedire a un cliente.
Segreteria Classificatori
PREPARARE Invio
LETTERA
Correzioni lettera
● Diramazioni
Ogni freccia può rappresentare una collezione di oggetti
(figura 6).
È il caso dell’esempio precedente relativo agli ingredienti
dell’hamburger. Fino a che non è necessario entrare nel
dettaglio degli oggetti possiamo considerare più ogget- SADT
ti come un tutt’uno e utilizzare un nome “collettivo”.
Quando dobbiamo cominciare a considerarli singolar-
mente procediamo con il “Branch” o “Split”, cioè li sud-
dividiamo creando delle diramazioni (figura 7).
Analogo discorso possiamo farlo con gli output. Quando
non è più necessario avere oggetti molto dettagliati pos-
siamo accorparli creando un nuovo oggetto composto da figura 6 Freccia in sezione
vari oggetti (figura 8).
A0 Specifiche A0 Elementi
da utilizzare
A2 Ciclo A2 Semilavorati
A0
A1 A2 A3 A4
1 2
1
2 3
2
3 4
4 3 A-1
A-1 A-2 A-3
A-0
3 di questo diagramma 2
A-21 A-22
A-1
3
A-4
figura 10 Approccio Top-Down
A-12
figura 12
Come già detto i diagrammi possono essere scomposti secondo il classico approccio Top-
Context Diagram
Down partendo dal Diagramma di Contesto fino all’ultimo livello in cui viene descritta nel
dettaglio l’attività (figura 10).
Unica eccezione è il caso di oggetti composti, che per comodità vengono visti a un livello
con il loro nome collettivo, e al livello inferiore vengono suddivisi (“splitted”) nelle loro
componenti.
È possibile a volte che alcuni oggetti compaiano solo a un livello più basso poiché troppo
specifici e perché interessano solo quella specifica attività.
C1 C2 C3
BOX PADRE
L1 SUDDIVISO O1
IN DIAGRAMMI
L2 DI DETTAGLIO O2
C3
C2
L1
L2
1
O1
C1 2
3 O2
6 sintesi
Questions
1 What is meant by software engineering?
2 What is meant by the prototype model?
3 What are the stages in the life cycle of software?
4 Devise a test for a program for calculating the maximum salaries of a group of employees.
5 Describe the acquisition of a computer with DFD.
6 Describe the acquisition of a computer with SADT.
7 How is the prototype of a system prepared?
8 What does it mean that a program is maintainable?
Exercises
1 In the following DFD diagram the P1 procedure:
A P1 B
6 in English, please
1 N
A C B
Glossary Glossario
Analysis: stage of study and of approach to a problem, DFD: data Flow Diagram.
however complex it may be, so as to identify a solution.
Documentation: information describing how a
The problem is ideally subdivided into less complex
program works, how it should be used and how it
parts.
has been developed.
Applications: application programs to be used by
Entity-Relationship: conceptual model for planning
the final user of the system to carry out work tasks.
a database.
Bottom-up: an analytical methodology which enables
Maintenance: ongoing corrections and adjustments
a problem to be resolved by first analysing its details.
to software throughout its life.
Bug: program error or malfunction. ”Bug” is generically
Object-Oriented: programming based on objects.
a harmful and nasty-looking invertebrate.
Package: set of programs resolving recurrent and
CASE (Computer Aided software Engineering):
generalizable application problems.
yool for the production and documentation of software.
Project Management: management of all stages of
Comment: part of a source program which is not
a software project.
translated into a machine language but which is useful
in explaining and describing the program. SADT: structured Analysis and Design Technique.
Database: the entirety of data which is correlated Software Engineering: software design in all its
and memorized according to criteria independent of stages.
the programs using it. Software Life Cycle: stages in the life of software.
Data-Flow: tool for the analysis and documentation Stakeholder: all those involved in the same project.
of software based on data flow
Top-down: methodology of analysis which enables
Debugging: activity of correcting program errors a problem to be broken down into simpler sub-
Deployment: activation of a computer application problems.
Conoscenze
Linguaggio UML.
Tecniche e strumenti per la gestione delle specifiche e dei requisiti di un progetto.
Sintassi UML per rappresentare e documentare i dati di un sistema e le loro relazioni
e interazioni.
Sintassi UML per rappresentare delle componenti dinamiche di un sistema.
Rappresentazione e documentazione delle scelte progettuali.
Abilità
Saper progettare e documentare un sistema utilizzando UML.
Saper rappresentare tramite UML i dati di un sistema e le loro relazioni e interazioni.
Saper rappresentare tramite UML le componenti dinamiche di un sistema.
Prerequisiti
Conoscere fasi e modelli di gestione di un ciclo di sviluppo.
Saper progettare un sistema usando tecniche e strumenti di software engineering.
1 UML
● La storia dell’UML
UML (Unified Modeling Language) è una metodologia
1991-1992 definizione delle metodologie “Object-Oriented
che nasce alla fine degli anni ’90, frutto del lavoro di
Design” (Booch).
“Object Modeling Technique” (Rumbaugh).
Grady Booch, Ivar Jacobson e Jim Rumbaugh. Questi
“Objectory / Object-Oriented Software studiosi avevano sviluppato propri approcci meto-
Engineering” (Jacobson) dologici per la progettazione e lo sviluppo di sistemi
e successivamente hanno lavorato insieme unendo i
1994 definizione della metodologia “Object-Oriented propri lavori e cercando di creare un’unica metodo-
Analysis and Design” (Booch). logia. Dal loro sforzo e dall’appoggio delle principali
Booch e Rumbaugh si uniscono alla Rational case di informatica (Microsoft, Platinum, IBM, HP e
Software
altre) nasce nel 1997 la prima versione di uno standard
1995 - definizione della metodologia “Unified Method” riconosciuto a livello internazionale dall’OMG (Object
ottobre versione 0.8 (Booch e Rumbaugh). Management Group).
Jacobson si unisce alla Rational
Lo scopo di UML è di aiutare i progettisti nella fase
1996 - Unified Method diventa “Unified Modeling di progettazione di un nuovo sistema utilizzando un
estate Language” (UML) versione 0.9 con il contributo linguaggio universale dotato di sintassi e semantica
di Jacobson standard. Viene spesso usato anche per documentare
un sistema già esistente.
1997 - nasce la versione 1.0 di UML grazie anche
gennaio al contributo di alcuni partner UML, tra cui Nella metodologia UML possiamo individuare quattro
Microsoft, Oracle, Hewlett-Packard, Digital, fasi principali che in qualche modo ricalcano le clas-
Texas Instruments, in risposta alla richiesta avan- siche fasi della progettazione di un sistema: analisi,
zata dall’ OMG (Object Management Group) progettazione del sistema, progettazione degli oggetti,
per un framework di interoperabilità tra stru- e implementazione.
menti di analisi e disegno
● Diagrammi UML
Per svolgere questi compiti UML mette a disposizione una serie di diagrammi in grado di
coprire i vari aspetti metodologici del progetto (dati, funzioni, tempo).
In particolare per la modellazione degli oggetti fornisce il diagramma delle classi, per la
modellazione funzionale il diagramma dei casi d’uso, mentre per la modellazione dina-
mica i diagrammi di stato, i diagrammi di sequenza e i diagrammi di attività. Ogni
modello descrive un aspetto specifico del sistema ma è collegato con gli altri modelli. Per
esempio le operazioni presenti nel modello degli oggetti corrispondono agli eventi del
modello dinamico e alle funzioni del modello funzionale.
● Paradigma Object-Oriented
Poiché UML si basa sulla programmazione Object-Oriented, descrivendo le componenti
del diagramma degli oggetti riprendiamo i concetti di base di questo paradigma.
Ricordiamo i 2 concetti base dell’Object-Oriented:
UÊ incapsulamento: i dati e le procedure che li manipolano sono raggruppati in un’unica
entità, l’oggetto (figura 1);
UÊ information hiding: il mondo esterno ha accesso ai dati solo tramite un insieme di
operazioni (metodi) che costituiscono l’interfaccia dell’oggetto (figura 2). I dettagli
dell’implementazione sono nascosti.
Nelle prossime lezioni vedremo come utilizzare i diagrammi UML e riprenderemo altri
concetti importanti della programmazione a oggetti man mano che ne emergerà la
necessità.
METODI
DATI
DATI
METODI
OGGETTO
Il modello degli oggetti fornisce la struttura di base a cui fanno riferimento il modello dina-
UML mico e il modello funzionale. Graficamente è rappresentato per mezzo di “diagrammi delle
classi”. Queste classi possono essere organizzate in gerarchie di aggregazione.
● Classi e oggetti
Oggetti
Ogni entità del sistema che si vuole descrivere è rappresentata da un oggetto. Un oggetto
è caratterizzato da alcune proprietà strutturali chiamate attributi. Un oggetto possiede un
insieme di metodi, cioè operazioni che possono essere effettuate sull’oggetto stesso.
Ogni oggetto ha una propria identità che lo distingue da altri oggetti, due oggetti con
identità differenti sono distinti (anche se hanno gli stessi valori per le proprietà) pertanto
in ogni sistema orientato a oggetti, ogni oggetto ha un identificatore (ID) che ne permette
il riferimento.
Classe
L’insieme degli elementi della realtà (oggetti) dotati di caratteristiche comuni viene rappre-
Nome classe sentato in una classe (figura 1). Il singolo oggetto rappresenta quindi l’istanza di una
classe. Per esempio possiamo avere la classe LIBRO, caratterizzata da attributi comuni quali
Attributi “titolo”, ”autore” ecc. e l’oggetto “Promessi Sposi”, istanza della classe LIBRO con l’attributo
titolo che vale appunto “Promessi Sposi” e l’attributo autore che vale “Manzoni”.
Operazioni () Viene normalmente rappresentata con un rettangolo che al suo interno può essere ulterior-
mente suddiviso in tre parti che contengono rispettivamente: nome della classe, lista degli
figura 1 attributi, lista delle operazioni.
Classe Nella figura 2 viene mostrato il rapporto tra classe e oggetto dove la freccia rappresenta
la relazione “istanza di”.
OGGETTO CLASSE
PROMESSI
LIBRO
SPOSI
● Operazioni e metodi
I metodi sono le operazioni tramite cui è possibile accedere agli oggetti. Si tratta di una
funzione o trasformazione che può essere applicata agli oggetti di una classe.
Per chiarire meglio il concetto vediamo due esempi:
Il metodo “Calcola area” per la classe Triangolo permette di ottenere il valore dell’area del
triangolo specificato. Non è indicato come questa viene ottenuta, se cioè si parte dal valore
dei lati o si usano la base e l’altezza. Noi sappiamo solo che richiamando questo metodo
viene restituito il valore dell’area.
Il metodo “Stampa nome” per la classe Persona restituisce il valore dell’attributo Nome di
un oggetto Persona.
A ogni classe devono sempre essere associati due metodi speciali detti costruttore e di-
struttore. Il costruttore è un metodo che ha lo stesso nome della classe e viene utilizzato
per inizializzare un nuovo oggetto e viene richiamato automaticamente quando l’oggetto
viene istanziato, il distruttore prende il nome della classe preceduto dal carattere speciale
~(tilde), serve per distruggere l’oggetto quando questo non è più necessario.
● StarUML
Vi sono molti strumenti software che possono essere
usati per descrivere il diagramma delle classi. Noi use-
remo uno strumento software Open Source chiamato
“StarUML” facilmente reperibile su Internet all’indirizzo:
http://staruml.sourceforge.net
Si tratta di uno strumento facile da usare, ma completo.
Unica difficoltà potrebbe essere il fatto che esiste solo la
versione in inglese. Accedendo al sito basta fare clic sulla
voce “download” e poi seguire le istruzioni. Verrà creata
anche sul desktop un’icona per avviare il programma.
Per inserire una classe nel diagramma delle classi si seleziona l’icona della classe e si inse-
risce nel diagramma. Quindi si assegna un nome alla classe (figura 5).
Tramite l’iconcina verde è possibile inserire nella classe gli attributi (figura 6).
ÊÊÌ>ÃÌʺ³»ÊÃiÊiÊÃiÀÃVÊ`ÊÕÛÊfigura 7), con il “–” si cancellano.
In questo modo possiamo creare le informazioni di base di una classe (figura 9).
3 Associazioni e link
Nella realtà gli oggetti non sono mai considerati da soli, ma vivono legati ad altri oggetti.
Un link rappresenta una connessione fisica o concettuale tra due oggetti mentre un’asso-
ciazione rappresenta il legame tra due classi di oggetti. Possiamo quindi dire che un link è
un’istanza di un’associazione.
AZIENDA DIPENDENTE
+NOME 1 * +MATRICOLA
+TIPOLOGIA +COGNOME
+INDIRIZZO LAVORA +NOME
Nell’esempio della figura 1 l’associazione LAVORA lega la classe Dipendente alla classe
Azienda: se il dipendente Mario Rossi lavora per l’azienda FIAT avremo un LINK che lega
i due oggetti. Un’associazione descrive quindi un insieme di link potenziali così come una
classe descrive un insieme di oggetti (figura 2).
lavora
Persona Azienda
* 1
● Grado di un’associazione
Un’associazione ha un grado, cioè un numero di classi coinvolte. Normalmente è di
due, ma può essere anche di uno (associazione unaria o ricorsiva), tre (ternaria), o
maggiore.
La classe PERSONA può per esempio essere legata a se stessa dall’associazione PARENTELA
per cui Mario Rossi e Luigi Rossi (entrambi oggetti della classe PERSONA) sono legati da
un link che indica che Mario è il padre di Luigi (figura 3).
Un esempio di associazione ternaria può essere dato dai dati relativi agli acquisti di una
casa. Vi sarà quindi un acquirente, un venditore e l’immobile oggetto della compra-vendita
(figura 4).
ACQUIRENTE
+COGNOME
+NOME
VENDITORE CASA
+COGNOME Acquisto +INDIRIZZO
+NOME
● Ruoli
Un ruolo indica un lato di un’associazione e specifica il “compito” che un oggetto ha in
un’associazione. Normalmente non è obbligatorio ma in alcuni casi molto utile come nelle
associazioni definite tra oggetti di una stessa classe (associazione unaria).
Per esempio nell’associazione Parentela della classe PERSONA i ruoli Padre e Figlio distin-
guono due persone che partecipano in questa associazione (figura 5).
+PADRE
PARENTELA
PERSONA
+COGNOME
+NOME +FIGLIO
Molto spesso quando due classi hanno tra loro una sola associazione, i nomi delle classi
possono essere usati anche come ruoli e, quindi, i ruoli possono essere omessi.
1 esattamente uno
* molti (zero o più)
0 opzionale (eventualmente non presente)
m specificato numericamente
● Classe Associazione
Può essere necessario avere un attributo che rappresenti una proprietà in un’associazione.
Pensiamo di voler inserire la data nell’associazione Acquisto dell’esempio precedente di
figura 4. La data di acquisto non può essere, in effetti, considerata come attributo di
nessuna delle tre classi, ma ha senso solo come specificazione del legame tra tutte e tre.
Quando vi sono delle associazioni M:N o di grado superiore a due, ricche di informazioni,
l’associazione può anche essere modellata con una classe: ogni link diventa quindi un’istan-
za della classe. Per esempio se abbiamo la classe Utente e la classe Workstations, possiamo
avere necessità di sapere i privilegi di accesso di ogni utente per ogni WS. Questi infatti
possono essere diversi (figura 6).
UTENTE Accesso WS
Permesso
+Privilegio
UTENTE Accesso WS
Permesso
+Privilegio
+Home Dir
+warning()
+Log()
Abbiamo detto che in UML la modellazione degli oggetti avviene tramite la definizione del
diagramma delle classi. Il diagramma delle classi è composto da tutte le classi con i relativi
attributi e le operazioni e dalle relazioni tra di esse. Nelle lezioni precedenti abbiamo visto
come queste vengono rappresentate nello schema UML.
Vediamo ora come fare, durante la fase di analisi, a individuare le classi e le associazioni
partendo dalla descrizione del problema e seguendo alcune semplici indicazioni.
● Identificare le classi
Per individuare le classi candidate cominciamo a considerati tutti i sostantivi presenti nella
descrizione del problema tenendo comunque conto di alcuni aspetti:
UÊ V>ÃVÕ>ÊV>ÃÃiÊ`iÛiÊ>ÛiÀiÊÕ>ÊV
>À>Êv>ÌDÊiÊÃÃÌi>Æ
UÊ ÃiÊ`ÕiÊV>ÃÃÊiëÀÊ>ÊÃÌiÃÃ>ÊvÀ>âiÊiÃ\ÊViÌiÊi`ÊÕÌiÌi®ÊiÊ>`ÀDÊVÃ`i
rata una sola accorpandole;
UÊ }Ê V>ÃÃiÊ `iÃVÀÛiÊ ÕÊ ÃiiÊ `Ê }}iÌÌ]Ê µÕ`Ê V>ÃÃÊ Ã}>À]Ê «iÀÊ iÊ µÕ>Ê VmÊ mÊ
possibile immaginare solo un oggetto singolo, non sono in genere rilevanti. Per esempio
la classe Azienda, se stiamo analizzando il sistema per gestire una sola azienda, non ha
molto senso perché conterrà un solo oggetto (la nostra azienda appunto);
UÊ ÊÊV
iÊ`iÃVÀÛÊ}}iÌÌÊiÃÃiâ>iÌiÊÃ}Ê`ÛÀiLLiÀÊiÃÃiÀiÊÀvÀÕ>ÌÊViÊ
attributi (es: l’età di una persona...);
UÊ V>ÃÃÊ iÊ >ÌÌÀLÕÌÊ ÃÊ iiiÌÊ `ÃÌÌÊ `Ê `i>âi]Ê «iÀÊ VÕÊ ÃiÊ ÕÊ ViÀÌÊ VViÌÌÊ
deve essere modellato come una classe o come un attributo, questo dipende dal dominio
applicativo. Per esempio il concetto di Matrimonio può essere rappresentato come una
associazione unaria tra PERSONE o un attributo di quella classe stessa.
Ogni classe deve essere specificata tramite un insieme di attributi ed è buona norma deter-
minare quale o quali fra questi permettono di individuare un oggetto fra gli altri oggetti
della classe. Definiamo cioè gli attributi d’identificazione (chiavi). Anche se ogni classe
comprende un insieme di operazioni (metodi), nella fase iniziale dell’analisi non è neces-
sario individuarle subito. Se comunque ne vengono individuate di evidenti e importanti si
può cominciare a indicarle.
Poiché le parole possono essere soggette a interpretazioni differenti, è necessario compilare
un dizionario dati per tutte le classi rilevate nella fase precedente. Si dovrà specificare una
definizione che descriva precisamente ogni classe di oggetti nel contesto del problema
corrente.
esempio
Vediamo come esempio l’analisi di un sistema per gestire dei corsi universitari:
Descrizione del problema:
1. Ogni studente per ottenere una specifica laurea deve frequentare corsi obbligatori e corsi a
scelta.
2. Ogni studente per laurearsi dovrà definire un proprio Piano di Studi in cui sono presenti tutti
i corsi obbligatori e i propri facoltativi tra quelli possibili.
Individuiamo i sostantivi che ci sembrano rilevanti e ipotizziamo le classi candidate con i loro
attributi principali:
s Laurea
s Corso
s Studente
s Piano di studi
Studente Laurea
+Matricola +Codice
+Cognome +Nome
+Nome +Numero crediti
Quando poi si creano gli altri diagrammi (attività, sequenza ecc.) si può far riferimento alle
classi già definite. Inoltre, si avrà sempre sotto controllo il rapporto esistente tra le classi e
i vari diagrammi.
● Identificare le associazioni
tra le classi
Esaminando le parti verbali delle frasi dei requisiti (…il cliente emette un ordine… con
l’ordine viene emessa una fattura…) è possibile individuare i legami tra oggetti, cioè le
associazioni tra classi.
Possiamo quindi ipotizzare come associazioni candidate tutti i verbi che troviamo nella
vÀÕ>âiÊ`iÊ«ÀLi>ÊÊiÊ`â>ÀÊ`iÊ`>̰Ê
Ã`iÀ>ÊÊ«>ÀÌV>ÀiʵÕiÊV
iÊ
facciano riferimento ad almeno due classi o a una classe in modo iterativo.
Nella figura 2 si vede come potrebbe essere definito lo schema dell’esercizio precedente.
La presenza di una associazione 1..1 ci potrebbe mettere in allarme. Analizzandola meglio
si vede che sarebbe possibile creare una sola classe Studente con inseriti anche gli attributi
del Piano di Studi. Ma se si considerano che gli attributi delle due classi coprono ambiti
diversi, possiamo decidere di tenerle separate per una maggior chiarezza semantica.
Studente Laurea
+Matricola +Codice
+Cognome +Nome
+Nome +Numero crediti
1 *
presenta appartiene
1 *
Piano di Studi Corso
relativo
+Anno +Codice
+Crediti ottenuti * * +Nome
+Crediti da raggiungere +Crediti
5 Generalizzazione ed ereditarietà
● Ereditarietà (Inheritance)
Una delle caratteristiche dei sistemi a oggetti è quello di poter gestire l’ereditarietà, che con-
sente di estendere classi preesistenti aggiungendo o modificando componenti (variabili o
metodi). Il concetto di ereditarietà permette di definire una nuova classe, detta sottoclasse,
partendo dalla definizione di una classe già esistente detta superclasse. La sottoclasse ere-
dita gli attributi, i messaggi e i metodi della superclasse e inoltre l’utente può specificarne
di aggiuntivi. Una classe può avere più sottoclassi.
VEICOLO
QUATTRO
DUE RUOTE
RUOTE
MOTO BICI
Nella figura 1 viene mostrato un esempio molto semplice e intuitivo. Una moto avrà
tutte le caratteristiche dei veicoli a due ruote, esattamente come la bici, ma in più avrà per
esempio degli attributi relativi al motore che la bici non avrà. In entrambi i casi comunque
sia moto che bici sono anche oggetti della classe Veicolo.
Alcuni sistemi impongono la restrizione che per ogni sottoclasse vi sia una sola superclasse,
in questo caso si parla di ereditarietà singola. Altri sistemi permettono invece la presenza di
più superclassi e in questo caso si parla di ereditarietà multipla (figura 2). Anche se non è
permesso in tutti i linguaggi questo concetto dà maggiore espressività, permettendo nella fase
`Ê>>ÃÊ`Ê`ivÀiÊÕÊÃV
i>ÊÃi>ÌV>iÌiÊ«ÙÊÀVV°Ê
Ài>Ê«iÀ¢Ê«ÀLiÊ`ÊVvÌÌÊ
e duplicazioni.
Televisore
pollici
esempio
Si supponga di avere tre classi di oggetti: foto, disegno, schema; si vuole eseguire il display di
questi tre tipi di oggetti. Per fare ciò si:
s DEFINISCE UNA SUPERCLASSE COMUNE Oggetto_grafico;
s DEFINISCE UN METODO display per la classe Oggetto_grafico;
s RIDEFINISCE TALE METODO IN OGNUNA DELLE SOTTOCLASSI
La ridefinizione dei metodi è possibile grazie al concetto di polimorfismo, una delle caratte-
ristiche dell’Object-Oriented, grazie a cui una stessa operazione può avere comportamento
differente per classi differenti. Per esempio: l’operazione print si comporta differentemente
se usata sulle istanze della classe Immagine o sulle istanze della classe Testo.
● Overriding
Nell’overriding un metodo viene ridefinito in una sottoclasse riscrivendone il codice (viene cioè
reimplementato). Il richiamo e i parametri (sia come numero che come tipi) sono gli stessi.
Un metodo di una sottoclasse definito per overriding non sempre ridefinisce completa-
mente il metodo con lo stesso nome della sua superclasse, ma spesso si limita a estenderlo.
esempio
Essendo la classe Quadrato derivata dalla superclasse
Quadrilatero, ne erediterà tutti gli attributi e i metodi, e QUADRILATERO
quindi anche il metodo Perimetro.
Il metodo Perimetro della classe Quadrilatero generico
sarà però implementato in modo differente dallo stesso
metodo presente nella classe Quadrato.
Perimetro ( )
Quadrilatero
Perimetro = L1 + L2 + L3 + L4 QUADRATO
Quadrato
Perimetro ( )
Perimetro = L * 4
● Overloading
Nell’overloading (sovraccarico) vi è la possibilità di avere in uno stesso ambiente più proce-
dure con lo stesso nome, distinte per il numero e/o tipo dei parametri.
esempio
Nell’oggetto triangolo il metodo AREA può essere
TRIANGOLO
differente a seconda del tipo di triangolo (se rettangolo
per esempio utilizzerà i due cateti).
Triangolo
Area = Base * Altezza / 2
Area (Altezza, Base)
Equilatero
EQUILATERO
Area = L1 * L12 +(L1/2)2 /2
Area (L1)
Si possono definire quindi all’interno di una classe più metodi con lo stesso nome, distinti
per numero e/o tipo dei parametri.
esempio
Anche il costruttore potrà essere diver-
so all’interno della superclasse, se per TRIANGOLO
esempio prevediamo di avere per alcuni
triangoli solo i tre lati, mentre per altri solo
la base e l’altezza avremo 2 costruttori,
ma con un numero di parametri diverso.
e
6 Aggregazioni
L’aggregazione è legata al concetto di oggetto composto per cui un oggetto è parte (compo-
nente) di un altro oggetto. Una classe composta contiene una o più classi componenti (le
classi componenti sono elementi della classe composta).
L’insieme rappresentato da un oggetto e dalle sue componenti è spesso chiamato oggetto
composito. Una classe e l’insieme delle classi componenti è chiamato assembly. Un oggetto
composito è pertanto un’istanza di un assembly. UML riconosce due semantiche dell’aggrega-
zione, chiamate aggregazione (semantica per referenza) e composizione (semantica per valore).
Nella figura 1 vediamo come l’automobile sia un classico esempio di oggetto composto,
cioè è un aggregato di oggetti, quali la carrozzeria, gli interni, il motore ecc.
carrozzeria
motore
interni
figura 1 Struttura gerarchica di un’automobile
Automobile
– marca : string
– modello: string
– velocità : int
– Stato : StatoMotore
+ MuoviAvanti()
+ MuoviDietro()
+ Avvia()
1 1 1
1 1 4
Carrozzeria Motore Ruota
– Numero di serie : string – Numero di serie : string – circonferenza : int
– colore : enum – numero valvole : int – tipo cerchi : string
– peso : int – numero cilindri: int
+ Avvia() : boolean
7 La modellazione funzionale
Caso d’uso
Per caso d’uso intendiamo una singola funzione del sistema visibile all’esterno che può
essere controllata singolarmente nel processo di sviluppo.
Attore
Si tratta di chi o cosa (persona, macchinario, organizzazione, sistema esterno) interagisce
(tramite un caso d’uso) con il sistema per ottenere un servizio o un qualche risultato utile
e viene rappresentato mediante un’icona stilizzata (figura 1).
Un attore descrive uno o più utenti (entità esterne) che ricoprono un ruolo in una o più
interazioni col sistema a cui il caso d’uso appartiene. Un particolare utente può ricoprire
utente impiegato più di un ruolo: quando si ragiona in termini di attori è importante concentrarsi sui ruoli
e non sugli utenti. In una piccola azienda familiare per esempio un utente può in un certo
figura 1 Attori momento rivestire il ruolo di contabile (per gestire l’amministrazione) e in un altro quello
di impiegato. In questo caso nel diagramma noi considereremo due attori differenti, perché
è differente il modo con cui il singolo utente interagirà con il sistema.
Un singolo attore può partecipare a più casi d’uso, così come in un caso d’uso potrebbero
partecipare più attori.
esempio
s LUTENTE SCHIACCIA IL TASTO DESTRO DEL MOUSE
s IL VOLO !: PARTE DA -ILANO
– stato: lo stato di un oggetto è il valore dei suoi attributi e l’insieme dei links a cui l’og-
getto partecipa
esempio
Relativamente all’esempio di prima:
s LOPZIONE hTASTO DESTROv Ò PRESENTE
s IL VOLO !: Ò hDECOLLATOv
Il diagramma degli stati è usato per rappresentare la modifica dello stato di un oggetto al
verificarsi di un evento.
Prenota visita
Paga visita
figura 3 #ASO DUSO CHE hUSAv UN ALTRO CASO DUSO
<<include>>
Aggiorna prenotazioni
Prenota visita
utente
Cerca posto
Paga visita
figura 4 %SEMPIO DI hINCLUDOv
esempio
Partiamo dal seguente testo in cui sono espressi i requisiti del sistema:
Un produttore di computer offre la possibilità di acquistare computer on line. Accedendo alla
pagina Web il cliente può visualizzare le configurazioni standard di computer disponibili o può
costruirsela interattivamente. I componenti configurabili (come memorie, CPU ecc.) sono visua-
lizzati in una lista di opzioni disponibili. Per ogni configurazione, il cliente può valutarne il costo.
Nella fase di configurazione il cliente può farsi aiutare da un venditore.
Per determinare i casi d’uso può essere utile compilare una lista di attori identificando poi i casi
d’uso che coinvolgono ogni attore costruendo una matrice in cui i requisiti di funzionalità sono
associati agli attori e ai casi d’uso.
2 accedendo alla pagina Web il cliente può cliente visualizza configurazioni standard
visualizzare le configurazioni standard di com-
puter disponibili
6 nella fase di configurazione il cliente può farsi cliente, venditore richiesta aiuto venditore
aiutare da un venditore configura computer
Ordina Computer
Visualizza configurazioni standard
Seleziona computer
<<extend>>
Calcola costo
Visualizza elenco componenti
<<extend>>
Cliente
Seleziona componenti
Richiesta aiuto venditore <<extend>>
Configura computer
Venditore
8 La modellazione dinamica
● Diagrammi di sequenza
Gli aspetti temporali sono in genere più difficili da modellare. È quindi preferibile esamina-
re prima gli aspetti statici di un sistema (cioè la struttura degli oggetti e le associazioni tra di
essi). Successivamente si analizza l’evoluzione temporale degli oggetti e delle associazioni:
uno dei principali strumenti di modellazione dinamica sono i diagrammi di sequenza.
Una sequenza è un insieme di eventi che si verificano in successione durante una partico-
lare esecuzione di un sistema. Vediamo quale può essere un esempio di sequenza per la
prenotazione di un campo da calcetto:
UÊ ½ÕÌiÌiÊÀV
i`iÊÊV>«Ê`iÃ`iÀ>ÌÆ
UÊ ½«i}>ÌÊÛiÀvV>Ê>Ê`ëLÌDÊ`iÊV>«Ê«iÀÊÊ}ÀÊiʽÀ>ÊÀV
iÃÌ>Æ
UÊ ½ÕÌiÌiÊ«>}>Ê>Ê«ÀiÌ>âiÊ`iÊV>«ÆÊ
UÊ ½«i}>ÌÊÀ>ÃV>ÊÕ>ÊÀViÛÕÌ>°Ê
La sequenza di eventi e di oggetti coinvolti in ogni evento costituisce un diagramma di
sequenza (o event trace). Questo graficamente è formato da:
UÊ iiÊÛiÀÌV>ÊV
iÊ`iÌvV>Ê}Ê}}iÌÌÆÊ
UÊ vÀiVViÊV
iÊÀ>««ÀiÃiÌ>ÊiÃÃ>}}ÊV
iÊ`>ÊÕÊ}}iÌÌÊÛi}ÊÛ>ÌÊ>ÊÕÊ>ÌÀ°
Da notare che:
UÊ ÊÌi«Ê>Û>â>Ê`>½>ÌÊÛiÀÃÊÊL>ÃÃÆ
UÊ ÊiÃÃ>}}ÊVÀÀë`Ê>iÊÀV
iÃÌiÊ`ÊÃiÀÛâÊV
iÊ}Ê}}iÌÌÊÃÊÃV>L>°
Analizzando i diagrammi di sequenza è possibile capire ciò che può fare ogni oggetto del
dominio e quindi l’interfaccia che ognuno deve fornire agli altri. In pratica è possibile
identificare i metodi di ogni classe di oggetti.
esempio
Ecco come possiamo descrivere l’esempio precedente (figura 1).
1: Richiedi il campo()
2: Verifica disponibilità campo()
3: campo disponibile()
4: Risposta affermantiva()
5: Paga campo()
6: prenota campo()
7: aggiorna stato()
8: Rilascia ricevuta()
Richiedi campo
Verifica disponibilità
Cliente
Paga campo
Impiegato
Rilascia ricevuta Aggiorna stato
● Diagramma di stato
Abbiamo già visto come un evento sia qualcosa che avviene in un dato istante di tempo
come per esempio il fatto che un utente prema un tasto del computer o che il volo AZ123
parta da Roma. In genere si assume che un evento non abbia durata, ma questo ovviamente
non è vero nella realtà.
Lo stato corrisponde a un intervallo tra due eventi ricevuti da un oggetto, cioè l’oggetto
cambia stato dopo che è accaduto un evento. Per esempio il volo AZ123 prima si troverà
nello stato “in attesa” e poi sarà “decollato”. In genere lo stato di un oggetto è determinato
dai valori dei suoi attributi Per esempio: “l’acqua è liquida” equivale a dire che il valore
dell’attributo temperatura è tra 0 e 100.
Un diagramma di stato collega eventi e stati. Gli eventi rappresentano dei punti nell’asse
temporale, gli stati rappresentano degli intervalli. Quando un evento è ricevuto da un
oggetto in un certo stato, il prossimo stato dell’oggetto dipende sia dall’evento sia dallo
stato di partenza. Una modifica di stato è detta transizione.
Un diagramma degli stati di una classe illustra gli stati che gli oggetti di una classe possono
assumere e le possibili transizioni tra di essi. Un diagramma degli stati è semplicemente un
grafo i cui nodi sono gli stati e gli archi gli eventi. I diagrammi di stato delle varie classi si
combinano in un singolo modello dinamico attraverso eventi condivisi.
esempio
6EDIAMO PER ESEMPIO IL DIAGRAMMA DI STATO DELLA CLASSE #/.4/ CHE INIZIALMENTE RISULTA hNON
PAGATOv 0OTRÌ PASSARE IMMEDIATAMENTE NELLO STATO h0AGATOv SE VIENE SALDATO SUBITO OPPURE
PASSARE PRIMA NELLO STATO h0AGATO PARZIALEv SE VIENE SALDATO IN UN SECONDO MOMENTO DOPO AVER
dato un anticipo.
NON PAGATO
ANTICIPO
PAGATO SALDO
PARZIALE
SALDO
PAGATO
● Condizioni
Una condizione è una combinazione booleana dei valori
degli attributi di un oggetto e può essere valida per un
intervallo di tempo:
UÊ º>ÊÌi«iÀ>ÌÕÀ>ÊmÊ>Ê`ÊÃÌÌÊ`iÊâiÀ»°
UÊ º>ÊÌi«iÀ>ÌÕÀ>ÊiÀ>Ê>Ê`ÊÃÌÌÊ`iÊâiÀÊ`>Ê£xÊ>ÊÓxÊ
CANCELLO CODICE
gennaio”. CHIUSO INSERITO
Uno stato può essere definito in termini di condizioni
mentre viceversa essere in uno stato è una condizione.
Le condizioni possono essere usate come guards sulle Apri
transizioni. Quindi una transizione si attiva (fire) quando
l’evento a cui è associata si verifica ma solo se la condi- CANCELLO
zione di guard è vera. APERTO
esercizio guidato
Testo Descrivi il diagramma di stato dell’oggetto “telefonata”.
Analisi Gli stati possibili sono:
UÊ ÌiivÊ VÊ ÌÊ â>i]Ê µÕ>`Ê ÃÊ mÊ >â>Ì>Ê >Ê VÀiÌÌ>Ê iÊ Ê ÃÊ mÊ >VÀ>Ê `}Ì>ÌÊ Ê
numero;
alza cornetta
INIZIA TONO
riattacca
cifra
DIGITAZIONE riattacca
NUMERO
numero completo
altra cifra riattacca
ATTESA RISPOSTA
riattacca
risponde
CONVERSAZIONE
● Diagramma di attività
Per specificare completamente il comportamento degli oggetti è necessario indicare cosa fa
l’oggetto in risposta agli eventi. Per fare questo si utilizza il diagramma di attività in cui in
ogni nodo dello schema si esegue “qualcosa”. Il flusso di controllo da uno stato di attività al
seguente è chiamato transizione. Nello schema vi è uno stato iniziale e uno o più stati finali.
Le transizioni si possono separare (branch), fondere (merge), creare cammini (threads) di
computazione alternativi.
Le transizioni possono anche biforcarsi (fork) e riunirsi (join) creando cammini di compu-
tazione concorrenti (paralleli).
Configura computer
incompleto
Compila modulo
OK
Salva ordine
7 sintesi
lezione 1 UML
UML è una metodologia in quattro fasi (Analisi, Progettazione del sistema, Progettazione
degli oggetti, Implementazione) che aiuta i progettisti nella fase di progettazione di un
nuovo sistema utilizzando un linguaggio universale dotato di sintassi e semantica stan-
dard. Si basa sul modello Object-Oriented.
lezione 6 Aggregazioni
Tramite il concetto di aggregazione si definisce un oggetto come composto da altri og-
getti. Un oggetto può quindi essere parte di un altro oggetto. Una classe e l’insieme del-
le classi componenti è chiamato assembly.
➞ L1
➞ L2
➞ L1,L2
➞ L3
5 Che rapporto c’è tra dizionario dei dati e diagramma delle classi?
➞ L4
➞ L5
➞ L6
➞ L7
➞ L8,L9
➞ L8,L9
Risoluzione
DIAGRAMMA DELLE CLASSI
Analizzando il testo dei requisiti si individuano le seguenti classi:
UÊ v
UÊ V«>Ê}iÀ>ÀV
>ÊVÊ6ÊiÊLÕÀ>Þ®
UÊ V`âÊ>vvÌÌ
UÊ ViÌi
affitta
Gestire Cliente
Verifica disponibilità
Cliente
<<extend>>
Affittare video
Aggiorna scorta
Breve descrizione. Un cliente richiede in affitto un film in un particolare formato presentando la tes-
sera. Il film è dato in affitto una volta che il pagamento sia stato ricevuto. Se non è restituito in tempo,
un’informativa è inviata al cliente.
Attori. Impiegato.
Flusso principale. Un cliente può chiedere all’impiegato la disponibilità di un video. Se il video nel
supporto richiesto è disponibile viene richiesto il pagamento, e una volta ricevuta la somma da pagare,
viene aggiornata la quantità disponibile (scorta) e i dischi sono consegnati al cliente insieme alla ricevu-
ta dell’affitto.
DIAGRAMMA DI SEQUENZA
Uno dei diagrammi di sequenza sarà il seguente:
1: Verifica disponibilità()
2: OK()
3: Richiedi pagamento()
4: Paga()
5: Aggiorna disponibilità()
disponibile
Pagamento effettuato
A partire dai seguenti requisiti definire il diagramma 4 Dato un collaboratore deve essere possibile
delle classi, il diagramma dei casi d’uso, il diagram- stampare i titoli di tutti gli articoli scritti e su
ma di sequenza e il diagramma di attività. quale testata.
1 Si voglia gestire una casa editrice che pubblica 5 Gli abbonati possono richiedere l’invio
riviste di vario genere (settimanali, mensili ecc.). tramite e-mail di vecchi articoli segnalando
2 Le riviste sono vendute in abbonamento con un titolo specifico.
scadenze differenti (in base a quando è stato
effettuato il pagamento). 6 Ogni mese si devono verificare e stampare
i nomi degli abbonati e la rivista in scadenza
3 Su ogni numero di una rivista vi sono articoli quel mese.
scritti da collaboratori diversi. Questi possono
scrivere su differenti numeri di una rivista, ma 7 Vanno effettuate statistiche contando quanti
anche su riviste differenti. sono gli abbonati per ciascuna rivista.
7 in English, please
Abstract
PLANNING WITH UML
UML (Unified Modelling Language) is a language used describe not only the structure of the data but also the
to support the Object-Oriented methodology which functional and temporal aspects.
makes it possible to plan and document systems. It is The tools used are the use case diagram, the class
divided into four stages: analysis, system planning, goal diagram, the sequence diagram, the activity diagram
planning and implementation. It makes it possible to and the state diagram.
Questions
1 What does UML mean? Indicate the multiplicity of association by which more
2 Which diagrams are used to cover the dynamic than one Employee can work in a Department.
aspects? 5 In the two parts of the diagram place a significant
3 What is meant by generalization? number of attributes.
4 Look at the following diagram: 6 Which of the following diagrams covers the static
aspects?
Department Employee a activity diagram
b class diagram
c state diagram
d use case diagram
Glossary Glossario
Aggregation: concept whereby an object is a carried out when a particular event occurs.
(component) part of another object Object: each entity of the system being described.
Attribute: property by which it is possible to describe Object Oriented: programming paradigm, based
an object. on the concept of object, embodying both fields and
Class: group of entities or objects which share methods.
common characteristics. Polymorphism: the possibility that a single operation
Class diagram: UML diagram for the modelling of may behave differently for different classes.
objects. State: value of the attributes of an object at a particular
Event: an occurrence. This may be the end of a moment of time.
programme, the sending of a message or a mouse click. UML (Unified Modelling Language): methodology
Inheritance: the possibility of extending pre-existing for system planning and documentation.
classes by adding or modifying components. Use case diagram: UML diagram for functional
Method: operation connected to an object which is modelling.
Conoscenze
Tecniche e strumenti per l’analisi dei requisiti di un progetto.
Tecniche e strumenti per la gestione dei requisiti di un progetto.
Architettura software a tre livelli.
Abilità
Saper analizzare e documentare i requisiti di un sistema.
Saper descrivere con apposite matrici i requisitio di un sistema.
Saper legare i requisiti di un sistema alle funzionalità che verranno realizzate.
Prerequisiti
Conoscere fasi e modelli di gestione di un ciclo di sviluppo.
Saper progettare un sistema usando tecniche e strumenti di software engineering.
Conoscere UML.
● Analista di business
Nella fase di raccolta dei requisiti intervengono vari attori. L’analista di business
Cliente è la figura di riferimento e diventa il collettore della conoscenza poiché raccoglie
i requisiti del sistema attraverso discussioni che coinvolgono clienti ed esperti del
sistema. L’aiuto dell’esperto può non essere necessario se l’analista di business ha
Esperto di esperienza del dominio cioè l’analista è anche un esperto.
Businnes
I requisiti dedotti dagli esperti del dominio costituiscono la conoscenza del
dominio, espressa in un modello di business. Questo è formato dal modello
Analista delle classi (cioè l’insieme degli oggetti che devono comporre il sistema) e un
modello dei casi d’uso. Il modello delle classi è un diagramma delle classi ad
MODELLO DI BUSINESS alto livello che identifica e mette in relazione gli oggetti del sistema, mentre il
Diagramma Casi d’Uso modello dei casi d’uso è un diagramma di caso d’uso ad alto livello che identifica
delle classi le principali funzionalità del sistema (figura 1).
Per la raccolta dei requisiti oltre ai metodi detti “tradizionali”, possono essere
figura 1 Raccolta requisiti usati altri metodi detti “moderni”.
● Metodi tradizionali
I metodi tradizionali per eccellenza per la raccolta dei requisiti sono quelli delle interviste,
dei questionari, delle osservazioni e dello studio dei documenti del business. Questi metodi
sono semplici, ma la loro efficacia non sempre è adeguata, poiché a volte i requisiti rischia-
no di essere poco chiari e di difficile implementazione.
Questionari
I questionari sono un modo efficiente per raccogliere informazioni da molti clienti in contem-
poranea. Normalmente sono usati per completare le informazioni derivate dalle interviste. Un
grosso vantaggio nell’uso dei questionari è che gli intervistati hanno più tempo per conside-
rare le risposte riflettendoci bene e possono rimanere anonimi. Uno svantaggio è invece che
chi risponde non ha l’opportunità di discutere e approfondire i quesiti e solo in alcuni casi
e in spazi molto ridotti è possibile fornire qualche chiarimento o integrazione alle risposte.
I questionari possono essere formati da:
UÊ quesiti a risposta chiusa, con domande a scelta multipla, dove chi lo compila deve sce-
gliere una o più risposte tra un insieme di risposte date. Commenti aggiuntivi possono
essere permessi per chiarire le proprie scelte;
UÊ domande a punteggio, dove è possibile esprimere la propria opinione su un’afferma-
zione. Punteggi possibili possono essere: forte accordo, accordo, neutrale, disaccordo,
forte disaccordo, e non so, oppure un numero in una scala (es. da 1 a 10) dove il valore
minimo rappresenta il disaccordo e il valore massimo l’accordo;
UÊ domande con ordinamento, dove le risposte fornite dovrebbero essere ordinate (per impor-
tanza) con numeri in sequenza, valori percentuali o simili meccanismi di ordinamento.
Nel seguito si mostra un semplice esempio di questionario per valutare la situazione di
gradimento del vecchio sistema da sostituire.
Questionario sul vecchio sistema utilizzato
Come giudica la qualità dell’attuale sistema?
❑ SCARSA ❑ ADEGUATA ❑ OTTIMA ❑ ECCESSIVA
La parte di gestione commesse è adeguata?
❑ SÌ ❑ ABBASTANZA ❑ NO
La parte di fatturazione è adeguata?
❑ SÌ ❑ ABBASTANZA ❑ NO
La parte di gestione clienti è adeguata?
❑ SÌ ❑ ABBASTANZA ❑ NO
Cosa si potrebbe migliorare?
----------------------------------------------------------------------------------------------------------------------
Quali sono gli strumenti di automazione di ufficio che normalmente usa?
Word Excel PowerPoint Access
Spesso
Poco
Quasi mai
SPAZIO LIBERO PER COMMENTI
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
● Metodi moderni
Nelle precedenti Unità formative abbiamo già esaminato alcune delle tecniche dette “moder-
ne”. Rivediamone alcune tra le principali considerandole soprattutto nell’ottica della valu-
tazione dei requisiti.
Prototipi software
Nascono per mostrare ai clienti come sarà il sistema, o solo una sua parte, al fine di valu-
tarne la reazione. Un prototipo è un sistema dimostrativo, un modello “ridotto” della solu-
zione realizzato in poco tempo con un’interfaccia grafica (GUI) simile a quella definitiva,
almeno nelle funzionalità, che simula il comportamento del sistema.
In questo modo la fattibilità e l’utilità del sistema possono essere valutate attraverso sistemi
poco costosi prima che la reale implementazione sia intrapresa, provando con costi conte-
nuti anche soluzioni alternative. Due sono i principali tipi di prototipo.
UÊ Prototipo “usa e getta”, che viene eliminato una volta che la raccolta dei requisiti è
completata. Serve per valutare subito specifiche soluzioni, o per verificare se i requisiti
proposti sono stati correttamente interpretati, in particolare in caso di richieste particolari;
UÊ Prototipo evolutivo, che viene usato anche dopo la fase di determinazione dei requisiti
per costruire il prodotto finale. In pratica il prototipo diventa il nucleo del sistema a cui
vengono apportate successive modifiche e integrazioni. Si concentra sui requisiti meglio
compresi in modo che la prima versione del prodotto possa essere fornita velocemente
(sebbene con funzionalità incomplete).
●Identificazione e classificazione
dei requisiti
Normalmente i requisiti sono espressi in linguaggio naturale con frasi molto semplici. Per
esempio: “Il sistema, su richiesta dell’operatore, stampa l’elenco delle attività da svolgere”.
In un sistema possono quindi esserci centinaia di frasi di questo tipo. Va quindi creato
uno schema di identificazione come per esempio una numerazione progressiva assolu-
ta, oppure un’organizzazione in base ai capitoli e paragrafi del documento dei requisiti
(es. 3.5.2).
La numerazione può anche essere relativa alla tipologia di requisito, facendo precedere la
numerazione sequenziale da una sigla (es. info003).
Aspetti progettuali
In questa parte vanno evidenziati tutti gli aspetti che servono per la gestione e lo sviluppo
del progetto, compresi i possibili problemi. In particolare vanno descritti:
U i problemi progettuali e i problemi ancora aperti, in particolare le difficoltà che il proget-
to potrebbe incontrare (es., requisiti che non sono presi inizialmente in considerazione
ma che potrebbero assumere in seguito un certo rilievo, oppure includere problemi
potenziali o pratiche negative che il sistema potrebbe instaurare);
U il programma preliminare dei principali compiti del progetto e l’allocazione iniziale delle
risorse umane (persone coinvolte nel progetto) e delle altre risorse (macchine, software
ecc.);
U uno strumento di gestione di progetto per produrre diagrammi standard di pianificazio-
ne, diagrammi PERT o Gantt;
U una stima preliminare dei costi di sviluppo.
Appendici
Vanno messi tutti i documenti e le informazioni utili alla comprensione dei requisiti:
U un glossario di progetto: definisce termini, acronimi e abbreviazioni usati nel documen-
to dei requisiti, importante perché interpretazioni errate della terminologia possono
causare molto danno;
U documenti e moduli usati nell’organizzazione del lavoro (modulistica aziendale):
esemplari (possibilmente compilati) dei moduli usati per svolgere il lavoro all’interno
dell’azienda e per gestire i rapporti con clienti e fornitori;
U riferimenti alle fonti usate nella preparazione del documento stesso;
U testi e pubblicazioni varie (manuali, documenti di standardizzazione ecc.), le minute
degli incontri, i memorandum e altri documenti interni utilizzati durante la raccolta dei
requisiti.
Individuazione e
Definizione Valutazione
consolidamento
requisiti alternative
Provided Function
Implementazione
Definizione
importanza delle Target Setting
Testing
Requested
Function
Per gestire questo processo utilizzeremo gli strumenti che ci vengono forniti dal QFD
(Quality Function Deployment). Si tratta di una tecnica che deriva dall’approccio alla
gestione della qualità di un’azienda (quality management).
QFD Si basa sull’uso di matrici in cui vengono messi in relazione i requisiti degli utenti, le fun-
zioni richieste e fornite e la loro importanza secondo criteri di qualità.
Nel QFD l’attenzione delle imprese si
sposta dal prodotto finito al processo
produttivo e alla progettazione. Si ● La definizione dei requisiti
parte dall’analisi delle esigenze
del cliente e dai punti di forza e di
La prima fase riguarda la definizione dei requisiti, il loro consolidamento e la definizione
debolezza dei prodotti già esistenti.
dei livelli di importanza delle Requested Function, cioè le funzioni che sono state richiete
per il sistema. Le attività da svolgere in questa fase sono:
UÊ ivâiÊ`iÊÀiµÕÃ̰
UÊ ,iÛÃiÊiÊVÃ`>iÌÊ`iÊÀiµÕÃÌ\
– ordinamento/raggruppamento dei requisiti;
– isolamento dei requisiti non pertinenti;
– consolidamento delle Requested Function.
UÊ Definizione dei livelli di importanza delle Requested Function.
Alla fine di questa fase si otterranno:
UÊ ÃÌ>ÊÀiµÕÃÌÊiÊÀÊ>>}À>vV>Ê,iµÕÀiiÌÊ>ÌÀÝ®°
UÊ «ÀÌ>â>Ê`iiÊ,iµÕiÃÌi`ÊÕVÌÊ,iµÕÀiiÌÊ>ÌÀÝ®°
In ditta sono
presenti
software per
i più svariati
Il sistema
utilizzi, sparsi
deve fornire
su diversi
una struttura
supporti (CD,
per archiviare
DVD, su share
i software
di rete). Si è
aziendali
presentata la
necessità di
effettuare una
catalogazione
Il software
deve essere
Il sistema deve
catalogato in
permettere
base a: Nome,
l’inserimento
Versione, Casa
di un software
produttrice,
nel database
Tipologia e
Licenza
Uno stesso
Il sistema deve software
consentire la può essere
catalogazione presente su
di software più CD diversi 10
presente, tra loro: i
eventualmente, suddetti vanno
su CD diversi. catalogati
singolarmente
Maschera
di input che
consente
Maschera per
l’inserimento
inserimento
di un nuovo
software
software con
i dati a esso
relativi.
REQ-1 Archivazione Il sistema deve fornire una struttura In ditta sono presenti software per i più
software per archiviare i software aziendali svariati utilizzi, sparsi su diversi supporti
(CD, DVD, su share di rete). Si è presen-
tata la necessità di effettuare una cata-
logazione
REQ-1-1 Inserimento Il sistema deve permettere l’inseri- Il software deve essere catalogato in ba-
SW in DB mento di un software nel database se a: Nome, Versione, Casa produttrice,
Tipologia e Licenza
REQ-1-1-1 Catalogazio- Il sistema deve consentire la cata- Il sistema deve consentire la cataloga-
ne di SW su logazione di software presente su zione di software presente su supporti
CD-DVD supporti ottici (CD-DVD) ottici (CD-DVD)
RF-1 Catalogazio- Il sistema deve consentire la catalo- Uno stesso software può essere presente
ne di SW su gazione di software presente, even- su più CD diversi tra loro: i suddetti van-
CD-DVD tualmente, su CD diversi no catalogati singolarmente
PF-1 Maschera in- Maschera per inserimento software Maschera di input che consente l’inseri-
serimento mento di un nuovo software con i dati a
esso relativi
REQ-1
Archivazione
software
REQ-1-1
Inserimento SW
in DB
REQ-1-1-1
Catalogazione di
SW su CD-DVD
RF-1
Catalogazione di 10
SW su CD-DVD
PF-1 Maschera
Inserimento
Una Requested Function espressa in modo corretto dovrebbe avere le seguenti caratteristiche:
UÊ iniziare con un verbo e completare la frase “Il sistema dovrebbe...” (fare, avere, fornire, ...);
UÊ identificare degli input e degli output;
UÊ identificare vincoli, come per esempio: norme, standard (STEP, ...), tecnologie, infra-
strutture, regole, vincoli di performance o di utilizzo;
UÊ avere diversi attributi:
– definizione;
– descrizione estesa;
– importanza (la media calcolata tra più utenti è compresa tra 1 e 10).
Per seguire meglio questo meccanismo seguiamo lo svolgimento di un esercizio.
esercizio guidato
REQ-1 Archivazione Il sistema deve fornire una struttura In ditta sono presenti software per i più
software per archiviare i software aziendali svariati utilizzi, sparsi su diversi supporti
(CD, DVD, su share di rete). Si è presen-
tata la necessità di effettuare una cata-
logazione
REQ-1-1 Inserimento Il sistema deve permettere l’inseri- Il software deve essere catalogato in ba-
SW in DB mento di un software nel database se a: Nome, Versione, Casa produttrice,
Tipologia e Licenza
REQ-1-1-1 Cataloga- Il sistema deve consentire la cata- Il sistema deve consentire la cataloga-
zione SW su logazione di software presente su zione di software presente su supporti
CD-DVD supporti ottici (CD-DVD) ottici (CD-DVD)
RF-1 Cataloga- Il sistema deve consentire la ca- Uno stesso software può essere presente
zione SW su talogazione di software presente, su più CD diversi tra loro: i suddetti van-
CD-DVD eventualmente, su CD diversi no catalogati singolarmente
PF-1 Maschera Maschera per inserimento software Maschera di input che consente l’inseri-
inserimento mento di un nuovo software con i dati a
esso relativi
PF-2 Maschera Maschera per collocazione softwa- Maschera che consente di associare un
collocazione re su CD software e un CD presenti nel DB. In
questo modo un software può essere as-
sociato a più CD e viceversa
RF-2 Catalogazio- Il sistema deve consentire la cata- I CD vanno catalogati in base a: Tito-
ne supporti logazione dei suddetti supporti lo, Anno di produzione e Posizione in
archivio
PF-3 Maschera Maschera per inserimento CD Consente l’inserimento di un nuovo CD
inserimento
CD
RF-3 Standardiz- Il sistema deve offrire uno strumen- Per una maggiore chiarezza, nonché
zazione to per la standardizzazione delle per un maggior ordine, è stato richie-
copertine copertine dei supporti sto uno strumento che standardizzasse
le copertine dei CD consentendone la
stampa su carta
(segue)
REQ-1-1-2 Catalogazio- Il sistema deve consentire la cata- Il sistema deve consentire la cataloga-
ne SW logazione di software presente sul zione di software presente sul server
su server server aziendale aziendale
RF-4 Catalogazio- Il sistema deve consentire la ca- Come nel caso dei CD, anche sul server
ne SW talogazione di software presen- centrale uno stesso software può esse-
su differenti te, eventualmente, in directory di- re presente in più cartelle, è necessario
directory verse catalogare le diverse copie anche per
consentirne l’eliminazione onde limitare
lo spreco di risorse in termini di spazio
su share di rete
PF-5 Maschera Maschera per inserimento software Maschera di input che consente l’inseri-
inserimento mento di un nuovo software con i dati a
software esso relativi
RF-5 Gestione File Il sistema deve consentire la ge- Per poter catalogare il software presente
System stione del File System del server sul server è necessario ricreare all’inter-
no del database la struttura delle cartel-
le contenenti i software stessi
PF-7 Maschera Maschera per inserimento direc- Consente l’inserimento di una nuova di-
inserimento tory server rectory
directory
REQ-1-2 Modifica Il sistema deve permettere la mo- Potrebbe presentarsi la necessità di mo-
dati DB difica dei dati già inseriti nel dificare i dati inseriti a causa di errori
database nel primo inserimento o per altri motivi
REQ-1-2-1 Modifica Il sistema deve permettere la mo- Devono essere modificabili i dati di un
dati SW difica dei dati dei software già in- determinato software, per esempio in se-
seriti guito all’acquisto di una licenza che non
si possedeva al momento del primo inse-
rimento nel database
RF-6 Modifica Il sistema deve permettere la mo- Devono essere modificabili i dati di un
dati SW difica dei dati dei software già in- determinato software, per esempio in se-
seriti guito all’acquisto di una licenza che non
si possedeva al momento del primo inse-
rimento nel database
PF-8 Maschera Maschera per modifica software Maschera che consente la modifica dei
modifica SW dati relativi a un software o la cancella-
zione dello stesso
REQ-1-2-2 Modifica dati Il sistema deve permettere la mo- Devono essere modificabili i dati di un
supporti difica dei dati relativi ai supporti determinato CD, per esempio qualora
già inseriti se ne acquistassero altre copie.
(segue)
REQ-1-2-2 Modifica dati Il sistema deve permettere la mo- Devono essere modificabili i dati di un
RF - 7 supporti difica dei dati relativi ai supporti determinato CD, per esempio qualora
già inseriti se ne acquistassero altre copie
REQ-1-2-3 Modifica col- Il sistema deve consentire la modi- Qualora un software venisse spostato bi-
locazione SW fica della collocazione del sogna eliminare l’associazione esistente
software (software spostato) e crearne una nuova.
RF - 8 Modifica Il sistema deve consentire la modi- Qualora un software venisse spostato bi-
collocazione fica della collocazione del softwa- sogna eliminare l’associazione esistente
SW re (software spostato) e crearne una nuova