Sei sulla pagina 1di 361

C. Iacobelli M. Ajme V. Marrone F.

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.

Redazione e impaginazione BaMa, Vaprio d’Adda (MI)


Progetto grafico Angela Garignani
Copertina Alfredo La Posta
In copertina VikaSuh@shutterstock images

Per eventuali e comunque non volute omissioni e per gli aventi diritto tutelati dalla legge, l’editore dichiara la piena disponibilità.

Per informazioni e segnalazioni:


Servizio Clienti Mondadori Education
e-mail servizioclienti.edu@mondadorieducation.it
Numero verde 800 123 931
Presentazione

La figura dell’esperto di informatica


L’informatica può essere vista sia come una disciplina scientifica che tecnologica. Nel primo
caso viene posta l’enfasi sulla logica organizzativa dell’elaboratore e sugli aspetti algoritmici e
metodologici della programmazione. Nel secondo caso l’enfasi è posta sull’uso delle tecnologie
informatiche cioè l’uso applicativo del computer.
Allora cosa è veramente l’informatica? L’informatica non è solo l’uso del computer e di Internet,
non è solo tecnologia, ma è una scienza vera e propria. L’informatica ha origine dal desiderio
dell’uomo di dare soluzioni a problemi concreti, cercando metodi e strumenti per alleviare la sua
fatica. Il computer è il tentativo di costruire una macchina a immagine del cervello umano cui
affidare i compiti più noiosi e ripetitivi.
Oggi si parla genericamente di “Information and Communication Technology - ICT” (Tecnologia
dell’Informazione e delle Comunicazioni”) evidenziando la convergenza tra informatica e tele-
comunicazioni Questo termine però ha il difetto di accentuare eccessivamente l’aspetto tecno-
logico e strumentale, a scapito dell’aspetto più concettuale. Ed è ciò che viene erroneamente
percepito non solo dal “cittadino medio” ma anche a livello mediatico e governativo.
Per questo motivo, tramite la materia “TECNOLOGIE E PROGETTAZIONE DI SISTEMI,
INFORMATICI E DI TELECOMUNICAZIONI” si vuole far acquisire allo studente, al termine del
percorso quinquennale, specifiche competenze nell’ambito del ciclo di vita del prodotto software e
dell’infrastruttura tecnologica di riferimento, declinate in termini di capacità di ideare, progettare,
produrre e inserire nel mercato componenti e servizi di settore. La preparazione dello studente è
integrata da competenze trasversali che gli consentono di leggere le problematiche dell’intera filiera.
In particolare si acquisiscono competenze che caratterizzano il profilo professionale in relazione
ai processi, ai prodotti, ai servizi con particolare riferimento agli aspetti innovativi e alla ricerca
applicata, per la realizzazione di soluzioni informatiche a sostegno delle aziende che operano
in un mercato interno e internazionale sempre più competitivo. Il profilo professionale dell’in-
dirizzo consente l’inserimento nei processi aziendali, in precisi ruoli funzionali coerenti con gli
obiettivi dell’impresa
Nella scuola superiore è però necessario fornire le opportune conoscenze di base, evidenziando
comunque quale sia lo stato attuale della tecnologia e soprattutto come questa va utilizzata. Devono
essere privilegiati gli aspetti educativi della disciplina approfondendo le conoscenze teoriche e nello
stesso tempo affrontando molti problemi concreti in modo che lo studente si abitui a cercare delle
soluzioni partendo dalle nozioni che ha appreso. In questo modo capisce meglio come funziona
un calcolatore (approfondendo così gli aspetti teorici) e questo fatto lo aiuta a risolvere meglio i
successivi problemi che gli si pongono davanti. Ma per far tutto ciò deve acquisire un metodo di
lavoro e di studio, e quindi, usando uno slogan molto diffuso, deve “imparare a imparare”.
Presentazione

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ÀÊÀïʏœ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Ê Vœ˜vˆ}ÕÀ>Ài]ʈ˜ÃÌ>>ÀiÊiÊ}iÃ̈ÀiÊÈÃÌi“ˆÊ`ˆÊi>LœÀ>∜˜iÊ`>̈ÊiÊÀïÆ
UÊ Ài`ˆ}iÀiÊÀi>∜˜ˆÊÌiV˜ˆV…iÊiÊ`œVՓi˜Ì>ÀiʏiÊ>Ì̈ۈÌDʈ˜`ˆÛˆ`Õ>ˆÊiÊ`ˆÊ}ÀÕ««œÊÀi>̈ÛiÊ>ÊÈÌÕ>‡
zioni professionali.

Struttura del corso


Il testo è organizzato in lezioni che si sviluppano per piccoli blocchi di testo e la trattazione
è arricchita da numerosissimi schemi e grafici. In questo modo, rafforzando la semplicità e la
chiarezza espositiva, si facilitano lo studio e di conseguenza i percorsi di apprendimento.
Ogni lezione ha una sua organizzazione indipendente, in modo che sia possibile scegliere se saltare
alcune lezioni ritenute troppo approfondite oppure organizzare la sequenza in modo differente.
Alla fine di ogni lezione viene proposta una verifica delle conoscenze relative all’argomento
trattato nella lezione (Verifica le tue conoscenze).
L’insieme delle lezioni afferenti a uno stesso argomento è organizzato in Unità di apprendimento.
Ogni Unità inizia evidenziando i prerequisiti e per verificarli viene fornito un breve test
(Accertamento dei prerequisiti). Sono inoltre evidenziate conoscenze, competenze e abilità che
lo studente raggiungerà alla fine dell’Unità.
La conclusione di ogni Unità è costituita da:
UÊ Õ˜>ÊȘÌiÈÊ>À̈Vœ>Ì>Ê«iÀʏi∜˜iÆ
UÊ Õ˜>ÊÃi∜˜iÊ œ“>˜`iÊ«iÀʏ½œÀ>i]ÊVœ˜Ê«œÃÈLˆˆÊ`œ“>˜`iÊ«iÀʏ½ˆ˜ÌiÀÀœ}>∜˜iÊiÊÀˆviÀˆ“i˜ÌˆÊ>iÊ
lezioni in cui gli argomenti sono svolti. On line le risposte, anche in formato MP3. Si tratta
`ˆÊ՘ÊṎiÊÃÌÀՓi˜ÌœÊ«iÀʈÊÀˆ«>ÃÜÊiʈÊÀiVÕ«iÀœÊˆ˜ÊˆÌˆ˜iÀiÆ
UÊ Õ˜Ê“œ“i˜ÌœÊ`ˆÊ«Ài«>À>∜˜iÊ>ÊVœ“«ˆÌœÊˆ˜ÊV>ÃÃiÊ­*Ài«>À>̈Ê>ÊVœ“«ˆÌœÊˆ˜ÊV>ÃÃi®]Ê«ÀiÃi˜ÌiÊ
nella maggior parte delle Unità, con un compito svolto e uno simile proposto da svolgere.
Molto ampio è l’apparato delle esercitazioni, dove possiamo trovare diverse tipologie di esercizi.
Oltre a quelli già citati, ogni lezione è corredata da numerosi esempi ed esercizi guidati. Altri
esercizi svolti e proposti si trovano inoltre nella parte on line del testo, facilmente scaricabili da
Internet.
Desideriamo ringraziare Giovanni Tarabba, per l’aiuto nella stesura dell’Unità 10.

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

Aimohy - Fotolia.com Paddler - Fotolia.com


anson tsui - Fotolia.com Pavel Losevsky - Fotolia.com
asiln - Fotolia.com picsfive - Fotolia.com
Cobalt - Fotolia.com robyerto - Fotolia.com
darren whittingham - Fotolia.com robynmac - Fotolia.com
DeVIce - Fotolia.com RTimages - Fotolia.com
Dreaming Andy - Fotolia.com S.John - Fotolia.com
HaywireMedia - Fotolia.com suricoma - iStockphoto
Joachim Wendler - Fotolia.com Taras Livyy - Fotolia.com
Kristina Shukurova- Fotolia.com TessarTheTegu - Fotolia.com
Login - Fotolia.com Thomas Jansa - Fotolia.com
Maksym Yemelyanov - Fotolia.com twixx - Fotolia.com
manley099 - iStockphoto WavebreakMediaMicro - Fotolia.com
Marek - Fotolia.com webking - iStockphoto
nabihaali - Fotolia.com Xuejun li - Fotolia.com
nasonovicons - iStockphoto Yuri Arcurs - Fotolia.com
p!xel 66 - Fotolia.com
Indice

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

verifica le tue conoscenze verifica le tue conoscenze

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 6 verifica le tue conoscenze


Gli interrupt 66

Gestione delle interruzioni 66 lezione 6
Gestione della memoria virtuale

Interrupt multipli 68 per segmentazione 90
verifica le tue conoscenze ●
Segmentazione 90
Sintesi ●
Gestione con pagine e segmenti 92
Domande per l’orale
verifica le tue conoscenze
In English, please
Indice

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

UNITÀ 4 verifica le tue conoscenze


Programmazione concorrente 113
lezione 6
lezione 1 Produttore-consumatore 132
Introduzione alla programmazione ●
Soluzione algoritmica del problema 133
concorrente 114

verifica le tue conoscenze
Concetti fondamentali 114

Processi concorrenti 115 lezione 7

Creazione ed eliminazione di processi 116 I cinque filosofi 134
● ●
Esecuzione concorrente di processi 116 Soluzione algoritmica del problema 134
verifica le tue conoscenze verifica le tue conoscenze
Indice

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

verifica le tue conoscenze Indice analitico 327


Unità
Codifica delle informazioni
1
Competenze
Sviluppare applicazioni informatiche per reti locali o servizi a distanza.
Gestire progetti secondo le procedure e gli standard previsti dai sistemi aziendali
di gestione della qualità e della sicurezza.
Gestire processi produttivi correlati a funzioni aziendali.

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.

Accertamento dei prerequisiti


1 Ci sono 7 persone (Anna, Bruno, Carla, Dario, d trovare quei numeri primi il cui prodotto è uguale
Emma, Fabrizio, Giovanna) che devono all’inverso del numero
attraversare un ponte al buio; il ponte permette
3 Completa la proporzione “spazio : x = y : secondo”.
il passaggio di sole tre persone alla volta.
Le persone hanno a disposizione una sola a x = tempo; y = orologio b x = metro; y = tempo
lanterna senza la quale è impossibile passare; c x = tempo; y = velocità d x = lunghezza; y = minuto
quando più persone attraversano il ponte 4 Quando un numero intero è pari?
assieme, il tempo di percorrenza è il massimo a Quando il resto della divisione del numero per 2
fra i tempi di percorrenza delle persone è maggiore di 0
coinvolte. I tempi di attraversamento del ponte b Quando il resto della divisione del numero per 2
sono: Anna 1 minuto, Bruno 2 minuti, Carla è uguale a 0
1 minuto, Dario 10 minuti, Emma 3 minuti, c Quando il resto della divisione del numero per 2
Fabrizio 8 minuti, Giovanna 3 minuti. Qual è il è minore di 0
tempo minimo in minuti che possono impiegare d Quando il resto della divisione del numero per 2
per passare tutti e sette al di là del ponte? è un numero con la virgola
a 15 b 17 c 18 d 20
e 22 f Nessuna delle precedenti 5 Il libro di Informatica lo scorso anno costava
E 25, quest’anno è aumentato del 4%. Quanto
2 Scomporre un numero in fattori primi significa: costerà il libro?
a trovare quei numeri primi la cui somma è uguale al a e 30 b e 29 c e 27 d e 26
numero dato
b trovare quei numeri primi per i quali il numero dato è 6 Se a < b e c > b, allora si può dire che:
divisibile
c trovare quei numeri primi divisibili per il numero dato aa<c b a>c c a=c d b>c
1
UNITÀ lezione

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”.

! Hardware è la parte “dura” di un sistema poiché è costituito da componenti di natura elettro-


nica e meccanica (tastiera, video, memoria, stampante ecc.), o comunque da parti che possono
essere “toccate”.

● 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”.

2 Unità 1 Codifica delle informazioni


● Le componenti hardware
L’elaboratore è un sistema digitale, perché opera su numeri (dal termine inglese digit che
significa “cifra”) opportunamente codificati, e non su segnali analogici (il termine “analo-
gico” indica il fatto che le informazioni sono rappresentate da segnali continui in analogia
al fenomeno fisico che rappresentano).

Tutte le informazioni all’interno dell’elaboratore sono rappresentate come insiemi di bit


(contrazione di BInary digiT), poiché le cifre usate sono quelle binarie (cioè con due soli
possibili stati: “0” e “1”).

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.

tabella 1 I multipli del byte


multipli sigla corrispondenza byte
kilobyte KB 1024 byte (circa mille byte) 103 byte
megabyte MB 1024 kbyte (circa un milione di byte) 106 byte
gigabyte GB 1024 Mbyte (circa un miliardo di byte) 109 byte
terabyte TB 1024 Gbyte 1012 byte
petabyte PB 1024 Tbyte 1015 byte
exabyte EB 1024 Pbyte 1018 byte
zettabyte ZB 1024 Ebyte 1021 byte
yottabyte YB 1024 Zbyte 1024 byte

Tramite il computer, oltre a elaborare i dati è possibile conservarli per un certo tempo e
riutilizzarli nel seguito.

verifica le tue conoscenze


1 Che cos’è un sistema? 4 Perché si dice che l’elaboratore è digitale?
5 Che cos’è un byte?
2 Che cos’è un’istruzione?
6 Quali sono le principali componenti hardware di un
3 Che cosa si intende per hardware? elaboratore?

Lezione 1 Sistemi di elaborazione 3


1
UNITÀ lezione
Il software
2
● I programmi
Come si è detto, l’elaboratore non può funzionare in modo automatico se non è stato pre-
cedentemente programmato, cioè se non gli sono stati forniti apposite istruzioni in grado
di guidarlo nelle sue attività. Questo insieme di istruzioni prende il nome di algoritmo,
cioè l’insieme dei passi che devono essere svolti, per passare da una situazione iniziale a
una situazione finale. Un algoritmo può descrivere, per esempio, i passi che devono essere
compiuti per telefonare: si alza la cornetta, si compone il numero, si attende il segnale, si
parla, si riaggancia.
Un algoritmo, per essere eseguito dall’elaboratore, deve essere scritto in un linguaggio che
sia comprensibile per la macchina: bisogna cioè esprimere l’algoritmo in un linguaggio di
programmazione.

! 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.

Come software di base riveste un ruolo di particolare importanza il Sistema Operativo,


cioè l’insieme di programmi che permette all’uomo di comunicare con la macchina con
semplici comandi (stampa, copia ecc.) e di gestire tutte le componenti hardware. Esempi
di sistemi operativi sono: Windows (nelle sue varie versioni 95, 98, NT, 2000, XP, Vista,
Windows 7 ecc.), Mac OS, Linux, Unix ecc.
Una delle componenti importanti del Sistema Operativo è la GUI (Graphical User Interface)
che è l’uso di menu, strumenti di puntamento, finestre della scrivania e delle applicazioni,
icone ecc. presenti in una GUI contribuisce a rendere più semplice ed efficace l’uso del com-
puter. Fa ancora parte del software di base quell’insieme di strumenti che permette all’uomo
di realizzare egli stesso programmi che possono essere compresi ed eseguiti dal calcolatore. Tra
questi ricordiamo gli editor, strumenti per scrivere i programmi, e i compilatori, strumenti per
tradurre i programmi dal linguaggio ad alto livello al linguaggio macchina.

● 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-

4 Unità 1 Codifica delle informazioni


mi per la gestione della fatturazione di un’azienda, quelli che permettono la prenotazione
dei voli di una compagnia aerea, il calcolo dell’orbita di una navetta spaziale, i vari tipi di
videogioco.
Nel secondo caso vi sono i programmi di uso più generale come gli strumenti per scri-
vere documenti (word processor), per archiviare dati (basi di dati), per realizzare tabelle
numeriche, prospetti e grafici (fogli elet-
tronici). Esempi di software applicativo
di uso generale sono MS Word, Adobe
Illustrator, Movie Maker, MS PowerPoint,
AutoCAD, Macromedia Director ecc.

Tutti questi programmi (dal più comples-


so Sistema Operativo al semplice pro-
gramma per calcolare la somma di due
numeri) devono essere realizzati secondo
particolari tecniche e tenendo conto di
come funziona l’hardware. Vedremo più
avanti le modalità per realizzare program-
mi di tipo applicativo e studieremo la
logica di funzionamento del software di
base per imparare a usarli al meglio.

Ci limitiamo per ora a elencare quelle che


sono considerate le fasi standard nello
sviluppo di software applicativi:
UÊÃÌÕ`ˆœÊ`ˆÊv>Ì̈LˆˆÌDÆ
UÊ«Àœ}À>““>∜˜iÆ
UÊÀiۈȜ˜iÆ
UÊ>˜>ˆÃˆÆ
UÊÌiÃÌÆ
Uʓ>˜ÕÌi˜âˆœ˜iÆ
UÊ«Àœ}iÌÌ>∜˜iÆ
Uʈ˜ÃÌ>>∜˜i°

verifica le tue conoscenze


1 Che cos’è il software? 3 Che cos’è una GUI?
2 Che differenza c’è tra software di base 4 Quali funzioni svolge il
e software applicativo? Sistema Operativo?

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ÊVˆvÀ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

Conversione da binario a decimale


Per convertire un numero da binario a decimale è necessario moltiplicare ogni cifra per la
base elevata alla sua posizione (così come illustrato precedentemente per i numeri decimali).
101 = 1 *2 + 0 *2 + 1 *2 =
0 1 2
1011100 = 0 *20 + 0 *21 + 1 *22 + 1 *23 + 1 *24 + 0 *25 +1 *26 =
1 *1 + 0 *2 + 1 *4 = 0 *1 + 0 *2 + 1 *4 + 1 *8 + 1 *16 + 0 *32 + 1 *64 =
1+0+4=5 0 + 0 + 4 + 8 +16 + 0 + 64 = 92
(101)2 = (5)10 (1011100)2 = (92)10

6 Unità 1 Codifica delle informazioni


Conversione da decimale a binario dei numeri interi
Per convertire un numero decimale in binario è necessario dividere ripetutamente il nume-
ro per due fino a raggiungere lo zero, e considerare i resti. L’insieme dei resti preso in
ordine inverso rappresenta il numero binario. 92 : 2 = 46 resto 0
46 : 2 = 23 resto 0
5:2= 2 resto 1 23 : 2 = 11 resto 1
2:2= 1 resto 0 11 : 2 = 5 resto 1
1:2= 0 resto 1 5 : 2= 2 resto 1
2 : 2= 1 resto 0
Il numero binario corrispondente a 5 è 101 1 : 2 = 0 resto 1
(5)10 = (101)2 Il numero corrispondente a 92 in binario è 1011100
(92)10 = (1011100)2

Conversione da decimale a binario dei numeri reali


Per convertire un numero reale (cioè un numero con la virgola) è necessario convertire la
parte intera con il procedimento visto precedentemente ed effettuare la conversione della
parte frazionaria procedendo nel modo seguente: si moltiplica la parte frazionaria per 2,
si prende la parte intera del risultato come prima cifra della parte frazionaria del numero
binario, si ripete la stessa operazione con la parte frazionaria del risultato finché non diven-
ta nulla o non si è raggiunto un numero sufficiente di cifre.

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.

Lezione 3 Sistemi di numerazione 7


esempio
1 1 1 1 1 1

1011 + 11011001+
10 = 101101=

1101 1 00000110

Per verificare la correttezza dell’operazione si può effettuare la prova trasformando i due


addendi e il risultato in decimale utilizzando il metodo visto in precedenza:
1011 = 1 * 1 + 1 *2 + 0 *4 + 1 *8 = 11
10 = 0 *1 + 1 *2 = 2
1101 = 1 *1 + 0 *2 + 1 *4 + 1 *8 = 13
Come si può verificare, il risultato dell’operazione in binario (1011 + 10 = 1101) è equiva-
lente al risultato ottenuto eseguendo l’operazione in decimale (11 + 2 = 13).
Per effettuare la somma tra numeri con cifre anche dopo il punto decimale si procede nello
stesso modo facendo attenzione al corretto incolonnamento degli operandi:
1 1
1 0 0.1 0 1 + 0 *20 + 0 *21 + 1 *22 + 1 *2–1 + 0 *2–2 + 1 *2–3 = 4 + 0.5 + 0.125
= 4.625
1. 1 1 0 = 1 * 20 + 1 *2–1 + 1 *2–2 = 1 + 0.5 + 0.25 = 1.75
1 1 0.0 1 1 0 *20 + 1 *21 + 1 *22 + 0 *2–1 + 1 *2–2 + 1 *2–3 = 2 + 4 + 0.25 + 0.125
= 6.375
Di fianco all’operazione è riportata la prova effettuata tramite conversione in base 10.

Sottrazione
Per la sottrazione si opererà come con il sistema decimale, lavorando sui prestiti in caso
di necessità (tabella 2).

tabella 2 Sottrazione tra 2 cifre binarie


0–0=0
1–0=1
1–1=0
0 – 1 = 1 con il prestito del valore della base (10) dalla cifra precedente

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.

8 Unità 1 Codifica delle informazioni


esempio
1010*
101=
1010
1010––
110010

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œ˜Ìi˜iÀ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

verifica le tue conoscenze


1 Che cos’è il sistema di numerazione posizionale? 3 Come si effettua la sottrazione in binario?
2 Come si converte un numero binario in decimale? 4 E la divisione?

Lezione 3 Sistemi di numerazione 9


1
UNITÀ lezione
Altri sistemi di numerazione
4
● Numerazione esadecimale
Nel sistema di numerazione in base 16 (esadecimale) tabella 1 Valore
LˆÃœ}˜>Ê Ṏˆââ>ÀiÊ £ÈÊ Ãˆ“LœˆÊ `ˆÛiÀÈÆÊ ˆ˜Ê «>À̈Vœ>ÀiÊ ÃˆÊ
delle lettere nel sistema
farà uso delle cifre da zero a nove (come nel sistema
esadecimale
decimale) e delle prime lettere maiuscole dell’alfabeto:
0123456789ABCDEF decimale esadecimale

In tale sistema i simboli da 0 a 9 hanno lo stesso valore 10 A


del sistema decimale, mentre i numeri decimali da 10 11 B
a 15 sono rappresentati dalle lettere maiuscole dell’alfa- 12 C
beto come mostrato nella tabella 1. 13 D
14 E
Conversione da esadecimale a decimale 15 F
Per convertire un numero da esadecimale in decimale
si procede come per la conversione da binario a decimale, cioè sommando ogni cifra mol-
tiplicata per la base (in questo caso 16) elevata alla sua posizione:
12B = B * 160 + 2 * 161 + 1 * 162 = 11 * 1 + 2 * 16 + 1 * 256 = 11 + 32 + 256 = 299
Il numero esadecimale 12B corrisponde al numero decimale 299 (12B)16 = (299)1 0

Conversione da decimale a esadecimale


La conversione da decimale a esadecimale avviene dividendo ripetutamente il numero per
16 fino a raggiungere lo 0, i resti vengono presi in ordine inverso.
78 : 16 = 4 resto 14 (E)
4 : 16 = 0 resto 4
Il numero esadecimale corrispondente a 78 è 4E (78)10 = (4E)16

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

10 Unità 1 Codifica delle informazioni


Anche nel caso di prestiti il meccanismo è lo stesso:

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

Conversione da ottale a decimale


Per convertire un numero da ottale a decimale si procede sommando ogni cifra moltiplicata
per la base (in questo caso 8) elevata alla sua posizione.
153 = 3 * 80 + 5 * 81 + 1 * 82 = 3 + 40 + 64 = 107
Il numero ottale 153 corrisponde in decimale a 107 (153)8 = (107)10

Conversione da decimale a ottale


La conversione da decimale a ottale avviene dividendo ripetutamente il numero per 8 fino a
raggiungere lo zero e considerando i resti presi in ordine inverso.
823 : 8 = 102 resto 7
102 : 8 = 12 resto 6
12 : 8=1 resto 4
1 : 8=0 resto 1
Il numero decimale 823 corrisponde al numero ottale 1467 (823)10 = (1467)8

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

● Considerazioni sui sistemi posizionali


Nella tabella 2 si propone la comparazione dei quattro tipi di numerazione più diffusi.
Si può notare come esista una simmetria tra i sistemi binario, ottale ed esadecimale, poiché
sono tutti basati su potenze di due (8 = 23 e 16 = 24).
Grazie a questa particolarità è possibile effettuare immediatamente la conversione dei
numeri tra le basi 2, 8 e 16.
Per trasformare un numero esadecimale in binario, si trasforma ogni singola cifra del
˜Õ“iÀœÊiÃ>`iVˆ“>iʈ˜ÊLˆ˜>ÀˆœÆÊˆÊ˜Õ“iÀˆÊVœÃŒÊœÌÌi˜ṎÊ`iۜ˜œÊiÃÃiÀiÊÀ>««ÀiÃi˜Ì>̈ʈ˜Ê{ÊLˆÌ]Ê
aggiungendo eventualmente degli zeri non significativi.
Sono necessari raggruppamenti di 4 cifre perché i gruppi devono essere costituiti dai bit
necessari per rappresentare in binario una qualsiasi cifra esadecimale. Sappiamo che le cifre
esadecimali sono 16 (da 0 a F) e quindi sono necessarie 4 cifre binarie (16 = 24).

Lezione 4 Altri sistemi di numerazione 11


tabella 2 Comparazione dei sistemi di numerazione A 5 B
1010 0101 1011
decimale binario ottale esadecimale
Per verificare la procedura descritta proviamo a fare
0 0 0 0
la conversione da esadecimale a decimale e poi da
1 1 1 1
decimale a binario:
2 10 2 2
3 11 3 3 (A5B)16= A * 162 + 5 * 161 + B * 160 = 10 * 256 + + 5
4 100 4 4
5 101 5 5 * 16 + 11 * 1 = 2560 + 80 + 11= (2651)10
6 110 6 6
7 111 7 7 Trasformiamo ora il numero decimale 2651 in binario:
8 1000 10 8
9 1001 11 9 2651 : 2 1325 resto 1
10 1010 12 A 1325 : 2 662 resto 1
11 1011 13 B 662 : 2 331 resto 0
....... ............... ....... ....... 331 : 2 165 resto 1
15 1111 17 F 165 : 2 82 resto 1
16 10000 20 10 82 : 2 41 resto 0
17 10001 21 11 41 : 2 20 resto 1
....... ............... ....... ....... 20 : 2 10 resto 0
20 10100 24 14 10 : 2 5 resto 0
21 10101 25 15
5 : 2 2 resto 1
....... ............... ....... .......
2 : 2 1 resto 0
32 100000 40 20
1 : 2 0 resto 1
33 100001 41 21
(2651)10 = (1010 0101 1011)2

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

12 Unità 1 Codifica delle informazioni


esercizio guidato 1
Testo Converti il numero (153)8 in base 10.
Risoluzione Per passare da una qualunque base (in questo caso 8) alla base 10 devi
moltiplicare le cifre del numero a partire da destra per le potenze della base (in questo caso
8) relative alla posizione che occupano, e quindi sommare.
153 = 3*80 + 5*81 + 1 * 82 =
3 + 40 + 64 = 107
Il risultato è (153)8 = (107)10

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

verifica le tue conoscenze


1 Quali sono gli altri sistemi di numerazione che si 3 Come faccio a convertire un numero ottale in uno
usano in informatica? esadecimale?
2 Quante e quali sono le cifre usate nel sistema 4 Come si effettua una somma in ottale?
esadecimale?

Lezione 4 Altri sistemi di numerazione 13


1
UNITÀ lezione
Rappresentazione dei numeri
5
● Numeri interi
I numeri interi vengono normalmente rappresentati, all’interno dell’elaboratore, in forma bina-
ria. Nella maggior parte dei casi un numero intero occupa 2 byte (integer), ma esiste anche la
possibilità di rappresentare numeri interi in 4 byte (long integer) o in un solo byte (short inte-
ger). Nella rappresentazione dei numeri interi con segno in 2 byte si riserva il bit più a sinistra
(bit più significativo) per il segno del numero stesso e si rappresenta con 0 il segno positivo e
con 1 il segno negativo (figura 1).

In 2 byte (16 bit) è possibile rappresentare


216 combinazioni diverse. Poiché un bit viene
segno
usato per il segno, sono disponibili 21 5 combi-
nazioni diverse (in questo caso numeri diversi).
Volendo rappresentare anche lo zero, il massi-
mo intero rappresentabile in 2 byte è +21 5 –1 =
figura 1 Rappresentazione di un intero 32767, mentre il minimo numero rappresenta-
bile è –32768.
Nel caso in cui si voglia rappresentare un numero superiore a 215 –1 si ha overflow, cioè
la dimensione del numero da rappresentare eccede lo spazio riservato, si perde la cifra più
significativa e quindi il numero perde il suo valore reale. Lo stesso si verifica se si vuole
rappresentare un numero inferiore a –215, in questo caso si parla di underflow.

● Numeri reali
I numeri reali possono essere rappresentati con due differenti modalità:
UÊ ˆ˜ÊۈÀ}œ>ÊvˆÃÃ>Ê­fixed point®Æ
UÊ ˆ˜ÊۈÀ}œ>ʓœLˆiÊ­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

14 Unità 1 Codifica delle informazioni


Nella rappresentazione dei numeri reali all’interno dell’elaboratore viene usata la notazione
esponenziale normalizzata in cui si impone che il punto decimale si trovi immediatamente
a sinistra della prima cifra diversa da zero del numero considerato (mantissa). L’esponente
(detto caratteristica) varierà di conseguenza.

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:

segno 1.xxxxxxxx *2n

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.

tabella 1 Rappresentazione di numero binario

virgola fissa virgola mobile normalizzata

111001 1.11001 * 25
-100.0101 -1.000101 * 22
0.01011 1.011*2-2
0.000111 1.11 * 2-4

Di un numero normalizzato viene rappresentato nell’elaboratore solamente il segno (un bit


con valore 0 se il numero è positivo 1 se è negativo), la mantissa (le cifre dopo il punto
`iVˆ“>i®Êiʏ½i뜘i˜ÌiÆÊ˜œ˜ÊÛi˜}œ˜œÊÀ>««ÀiÃi˜Ì>̈ʘjʏ>Ê«>ÀÌiʈ˜ÌiÀ>Ê­½Õ˜œÊV…iÊ«ÀiVi`iÊ
la virgola che viene detto bit nascosto) né il due che rappresenta la base in quanto sempre
uguali in tutti i numeri.

In particolare le modalità di rappresentazione sono:

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

Lezione 5 Rappresentazione dei numeri 15


UÊ doppia precisione;
vengono utilizzati 8 byte (64 bit) suddivisi nel modo seguente: il bit più a sinistra per il
segno, i successivi 11 bit per l’esponente e i rimanenti 52 bit per la 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.

Risoluzione Come primo passo trasformiamo il numero da decimale in binario, pren-


diamo la parte intera (12) e trasformiamola in binario:

12: 2 =6 resto 0
6: 2 =3 resto 0
3: 2 =1 resto 1
1: 2 =0 resto 1

(12)10 = (1100)2

procediamo ora con la parte frazionaria:

0.25 * 2 = 0.50 parte intera 0


0.50 * 2 = 1.00 parte intera 1

interrompiamo il procedimento perché la parte frazionaria è 0. Otteniamo così:


(12.25)10 = (1100.01)2
scriviamo il numero ottenuto in virgola mobile normalizzata:

–1100.01 = –1.10001 * 23

16 Unità 1 Codifica delle informazioni


per rappresentarlo in singola precisione utilizziamo 32 bit: il primo bit più a sinistra per il
segno meno (1), 8 bit per l’esponente (bias più esponente del due: 127 + 3 = 130) espresso
in binario (13010 = 100000102), i rimanenti 23 bit per la mantissa (10001):

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
 

Segno esponente mantissa

verifica le tue conoscenze


1 Come si rappresentano i numeri interi? 4 Cosa si intende per rappresentazione normalizzata?
5 Quanti byte vengono utilizzati per rappresentare
2 Che cos’è la mantissa? un numero in doppia precisione secondo lo standard
3 Come viene scritto un numero reale in virgola IEEE754?
mobile? 6 Che cos’è la costante chiamata bias?

Lezione 5 Rappresentazione dei numeri 17


1
UNITÀ lezione
Complemento a 2
6
Nell’elaborazione automatica delle informazioni, spesso si rappresentano i numeri negativi
in complemento alla base, allo scopo di minimizzare l’hardware del calcolatore e utilizzare
gli stessi circuiti per eseguire sia le somme sia le sottrazioni.

! Il complemento Me in base dieci di un numero M di n cifre è dato da:


Me = 10n – M

Per esempio il complemento in base 10 di 43 (numero di 2 cifre) è il seguente:


(43)e = 102 – 43 = 100 – 43 = 57

! In modo analogo, il complemento Me in base 2 di un numero M di n bit è dato da:


Me = 2n – M

Per scrivere il complemento in base 2 di un numero di 8 cifre si procede applicando la


formula:

10011001 numero da complementare


(10011001)e = 28 – 10011001 = 100000000 – 10011001 = 01100111

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

● Operazioni con i numeri negativi


rappresentati in complemento
Ricordiamo che nella rappresentazione di un numero in n bit, il bit più significativo (cioè
quello più a sinistra) viene usato per rappresentare il segno del numero stesso.
Per convenzione si usa 0 per il segno positivo, 1 per il segno negativo.

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

18 Unità 1 Codifica delle informazioni


dei numeri negativi. Infatti se si rappresentano i numeri negativi in complemento a 2, le
sottrazioni possono essere ricondotte a somme algebriche.
Dati 2 numeri A e B entrambi della lunghezza di n bit (segno compreso) i possibili casi di
somma algebrica sono:
Caso 1 +A +B
Caso 2 +A –B
Caso 3 –A +B
Caso 4 –A –B
Analizziamo ora i quattro casi aiutandoci con alcuni esempi in cui i numeri sono rappre-
sentati in 8 bit (7 per le cifre e 1 per il segno). Per maggiore chiarezza viene esemplificato
anche il caso di utilizzo del complemento in base 10.

Supponi che A sia maggiore di B.

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

 bit del segno

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

riporto da trascurare riporto da trascurare

Al risultato ottenuto sommando A + Be bisogna sottrarre 2n, ma questo equivale a trascurare


il riporto (overflow).

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).

Supponi che A sia minore di B.

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

bit del segno


Caso 2
R=+A–B (2)
In questo caso A è positivo e B negativo e poiché supponi A < B, il risultato sarà un nume-
ro negativo che verrà scrittto in complemento a 2. Utilizza la formula del complemento
Be"n – B per ricavare – B"Be–n sostituendo nella formula (2) ottieni:
R = + A + Be–n
– 15 =
+ 34
+ 19

+ 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

bit del segno

20 Unità 1 Codifica delle informazioni


Caso 3
R = –A + B (3)
In questo caso A è negativo e B positivo, ricordando l’ipotesi che A < B il risultato sarà un
numero positivo. Utilizza la formula del complemento per ricavare –A = Ae –2n e sostituisci
nella (3) ottenendo:
R = Ae –2n +B
– 15 +
+ 34 =
+ 19

+ 85 +o complemento di – 15 1 1 1 1 0 0 0 1 = o complemento di 00001111


+ 34 = 00001111+
119 111100010
o

riporto da trascurare riporto da trascurare

Al risultato ottenuto sommando A + Be devi sottrarre 2n, ma questo equivale a trascurare


il riporto (overflow).

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

+ 85 + o complemento di 15 1 1 1 1 0 0 0 1 + o complemento di 00001111


+ 66 = o complemento di 34 1 1 0 1 1 1 1 0 = o complemento di 00100010
151 o complemento di 49 111001111 o complemento di 00110001

riporto da trascurare

Possiamo notare come attraverso la rappresentazione dei numeri negativi in complemento a


2 e trascurando opportunamente i riporti è possibile ricondurre l’operazione di sottrazione
a una somma. Notiamo inoltre che se consideriamo la moltiplicazione fra due numeri come
sequenza di somme successive (esempio: 5 * 3 = 5 + 5 + 5) e la divisione fra due numeri
come sequenza di sottrazioni successive (esempio: 12 : 4 = 12 – 4 – 4 – 4), allora le quattro
operazioni (somma, sottrazione, moltiplicazione e divisione) possono essere realizzate facen-
do uso di un unico tipo di circuito hardware.

verifica le tue conoscenze


1 Qual è il complemento del numero 72? 3 Perché i numeri negativi vengono rappresentati in
complemento?
2 Effettuare il complementare a 2 del numero 4 Quando bisogna trascurare il riporto in un’operazione
1000111. in complemento?

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>LïV…i°

Nell’elaboratore tutte le informazioni devono essere rappresentate attraverso una sequenza


di 0 e di 1 poiché l’unità elementare di memoria dell’elaboratore (bit) è in grado di rappre-
sentare solo 0 o 1 (passaggio di corrente/non passaggio di corrente).

Così come attraverso le lettere dell’alfabeto l’uomo riesce


tabella 1 Numero di bit necessari per rappresentare i numeri
a descrivere tutte le sue riflessioni e a esprimere le sue
n. di bit simboli rappresentabili n. di simboli diversi idee, attraverso le sette note musicali riesce a comunica-
re in maniera armoniosa le sue più profonde emozioni,
1 0 2 (= 21) allo stesso modo attraverso la combinazione di 0 e 1
1 riesce a rappresentare, nella memoria di un elaboratore,
tutte le informazioni che gli interessano.
Poiché in un bit è possibile rappresentare due soli simboli
00 (0 e 1) per potere rappresentare un numero maggiore di
2 01 4 (= 22) informazioni si usano sequenze di bit (00 01 10 11 101 ...)
10
secondo la progressione riportata in tabella 1.
11
Il processo attraverso cui si fa corrispondere a una infor-
000
mazione una configurazione di bit prende il nome di
001
“codifica dell’informazione”.
010
3 011 8 (= 23)
Il problema della codifica può essere considerato anche
100
dal punto di vista inverso: quanti bit ci vogliono per
101
rappresentare M informazioni diverse? Se si hanno 4
110
informazioni diverse da rappresentare bastano 2 bit, ma
111
se ne servono 9?
…… ………… …………
Basta guardare nella tabella 1 la colonna di destra.
…………
La potenza di 2 corrispondente indicherà il numero di
………… 2n
bit necessari. Bisogna, quindi, trovare un numero n tale
n …………
che 2n ≥ M, per cui si ha bisogno di n bit.

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.

22 Unità 1 Codifica delle informazioni


● Alfanumerici
ÈÃ̜˜œÊ`ˆÛiÀÈÊ̈«ˆÊ`ˆÊVœ`ˆVˆÊ«iÀÊÀ>««ÀiÃi˜Ì>ÀiʈÊV>À>ÌÌiÀˆÆÊˆÊ«ˆÙÊ`ˆvvÕÜÊmÊ>ÌÌÕ>“i˜ÌiʈÊ
codice ASCII (American Standard Code for Information Interchange). Nella tabella ASCII
standard si trovano le cifre numeriche, le lettere maiuscole e minuscole (maiuscole e minu-
scole hanno codici ASCII differenti) la punteggiatura, i simboli aritmetici e altri simboli
($, &, %, @, # ecc.). Essendo stata concepita in America, la tabella ASCII standard non
comprende le lettere accentate (sconosciute all’ortografia inglese). Per comodità i bit ven-
gono raggruppati in byte (8 bit = 1 Byte). I primi 32 byte della tabella standard sono inoltre
riservati per segnali di controllo e funzioni varie. Nella tabella 2 vengono mostrati i
caratteri stampabili con la loro rappresentazione binaria e decimale.

tabella 2 Codifica ASCII


simbolo codifica decimale simbolo codifica decimale simbolo codifica decimale

Blank 0010 0000 32 > 0011 1110 62 _ 0101 1111 95


! 0010 0001 33 ? 0011 1111 63 ‘ 0110 0000 96
“ 0010 0010 34 @ 0100 0000 64 a 0110 0001 97
A 0100 0001 65 b 0110 0010 98
# 0010 0011 35
B 0100 0010 66 c 0110 0011 99
$ 0010 0100 36
C 0100 0011 67 d 0110 0100 100
% 0010 0101 37 D 0100 0100 68 e 0110 0101 101
& 0010 0110 38 E 0100 0101 69 f 0110 0110 102
‘ 0010 0111 39 F 0100 0110 70 g 0110 0111 103
( 0010 1000 40 G 0100 0111 71 h 0110 1000 104
) 0010 1001 41 H 0100 1000 72 i 0110 1001 105
I 0100 1001 73 j 0110 1010 106
* 0010 1010 42
J 0100 1010 74 k 0110 1011 107
+ 0010 1011 43 K 0100 1011 75 l 0110 1100 108
, 0010 1100 44 L 0100 1100 76 m 0110 1101 109
- 0010 1101 45 M 0100 1101 77 n 0110 1110 110
. 0010 1110 46 N 0100 1110 78 o 0110 1111 111
/ 0010 1111 47 O 0100 1111 79 p 0111 0000 112
P 0101 0000 80 q 0111 0001 113
0 0011 0000 48
Q 0101 0001 81 r 0111 0010 114
1 0011 0001 49
R 0101 0010 82 s 0111 0011 115
2 0011 0010 50 S 0101 0011 83 t 0111 0100 116
3 0011 0011 51 T 0101 0100 84 u 0111 0101 117
4 0011 0100 52 U 0101 0101 85 v 0111 0110 118
5 0011 0101 53 V 0101 0110 86 w 0111 0111 119
6 0011 0110 54 W 0101 0111 87 x 0111 1000 120
7 0011 0111 55 X 0101 1000 88 y 0111 1001 121
8 0011 1000 56 Y 0101 1001 89 z 0111 1010 122
9 0011 1001 57 Z 0101 1010 90 { 0111 1011 123
: 0011 1010 58 [ 0101 1011 91 | 0111 1100 124
; 0011 1011 59 \ 0101 1100 92 } 0111 1101 125
< 0011 1100 60 ] 0101 1101 93 ~ 0111 1110 126
= 0011 1101 61 ^ 0101 1110 94 0111 1111 127

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’).

Lezione 7 Codifica dei dati alfanumerici e numerici 23


zonatura digit

figura 1 Suddivisione del byte

Se si osserva attentamente la tabella 2 si comprende che è possibile confrontare due


caratteri attraverso gli operatori logici >, <, =. Infatti l’insieme degli 8 bit rappresenta nume-
ri binari confrontabili tra loro.
Per esempio, nella codifica ASCII, la lettera ‘A’ risulta minore di ‘C’ e la lettera ‘b’ risulta
maggiore di ‘Z’.

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.

Per cercare di ovviare al problema è stato creato un nuovo standard internazionale


detto Unicode, definito dalla Unicode Consortium e dalla International Organization for
Standardization (ISO 10646), che rappresenta i caratteri usando 2 byte (16 bit).

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.

Con n = 8 hai 2n = 256, mentre con n = 9 hai 2n = 512 per cui:

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

24 Unità 1 Codifica delle informazioni


● I prefissi
In tutte le discipline scientifiche in cui è necessario misurare le grandezze vengono utilizzati
particolari simboli per indicare multipli e sottomultipli dell’unità di base utilizzata. Quando si
parla di chilometri sappiamo che si intende l’unità di misura delle distanze (il metro) moltiplicato
per 1000 e, quando si parla di decigrammo, si intende dividere per 10 l’unità di peso (grammo).
Vengono normalmente utilizzati una serie di simboli standard universalmente accettati, qualun-
que sia il settore di attività (vedi tabella 3).
Anche l’informatica adotta i prefissi per indicare multipli e sottomultipli. In particolare i multipli
sono utili per descrivere le memorie, poiché le grandezze in gioco sono notevoli (l’unità di misura
in questo caso è il byte). Però nell’informatica K significa 1024 (210) anziché 1000 perché si usano
sempre potenze di 2. Vengono usati i sottomultipli per indicare grandezze molto piccole, come i
Ìi“«ˆÊ`ˆÊiÃiVÕ∜˜iÆÊ½Õ˜ˆÌDÊ`ˆÊ“ˆÃÕÀ>ÊmʈÊÃiVœ˜`œÊi]ʵՈ˜`ˆ]Ê«>À>˜`œÊ`ˆÊ՘ÊÌi“«œÊ`ˆÊiÃiVÕ∜˜iÊ`ˆÊ
un’istruzione di un nanosecondo si intende un tempo di un miliardesimo di secondo.

tabella 3 Prefissi
moltiplicatore prefisso simbolo

1000000000000 = 1012 tera T


1000000000 = 109 giga G
1000000 = 106 mega M
1000 = 103 chilo k
100 = 102 etto h
10 =10 deca da

divisore 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

verifica le tue conoscenze


1 Quante informazioni diverse si possono 3 Quanto vale K nell’informatica?
rappresentare in un byte?
2 Come si rappresenta un carattere alfanumerico? 4 Cosa indica la sigla ASCII?

Lezione 7 Codifica dei dati alfanumerici e numerici 25


1
UNITÀ lezione
Codifica delle immagini
8
●Rappresentazione
delle immagini
Le immagini possono essere rappresentate con due modalità
differenti. Se si tratta di immagini fotografiche, oppure di
disegni irregolari, allora si utilizza la tecnica “raster” o “bit-
map”. Si parla in genere di immagini in formato “BMP”. Nel
caso invece di disegni di tipo geometrico si utilizza la tecnica
“vettoriale”.

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.

Il colore può essere generato componendo i tre colori primari


rosso, verde e blu (RGB = Red, Green, Blue). A ogni colore si
associa una possibile sfumatura. Usando quindi 8 bit per ogni
d colore si possono ottenere 256 sfumature per il rosso, 256 per
il blu e 256 per il verde che, combinate insieme, danno origine
figura 1 Differenti modalità di rappresentazione
di immagini a circa 16,7 milioni di colori diversi (precisamente 16777216
colori).

26 Unità 1 Codifica delle informazioni


Le immagini sono quindi memorizzate come sequenze (più o meno lunghe) di bit. Per
poterle interpretare è necessario conoscere:
UÊ ÊiÊ`ˆ“i˜Ãˆœ˜ˆÊ`i½ˆ““>}ˆ˜iÆ
UÊ Ê>ÊÀˆÃœÕ∜˜iÊVÀœ“>̈V>ʭ՘ÊLˆÌÊ«iÀʈ““>}ˆ˜ˆÊLˆ˜>Àˆi]ÊÓ{ÊLˆÌÊ«iÀʈ““>}ˆ˜ˆÊ>ÊVœœÀˆÊiVV°®Æ
UÊ Ê>ÊÀˆÃœÕ∜˜iÊ}iœ“iÌÀˆV>ÊiëÀiÃÃ>ʈ˜Ê *Ê­dot per inch), cioè in quanti pixel viene sud-
divisa un’area di un pollice quadrato (6,4516 cm2).
Risoluzioni tipiche sono: 800 š ÊÈääÆÊ£äÓ{ʚ ÊÇÈnÆÊ£Ónäʚ 1024.
Se un’immagine viene codificata con una particolare risoluzione essa potrà essere presentata
su un dispositivo a minore risoluzione ignorando o trasformando opportunamente alcuni dei
bit che rappresentano ogni pixel.

esercizio guidato 1
Testo Quanti byte occupa un’immagine di 200 š 100 pixel in bianco e nero?

Risoluzione Conoscendo la risoluzione dell’immagine puoi trovare il numero di pixel


che la compongono: 200 š 100 = 20 000 pixel.
Inoltre, nel caso di immagini in bianco e nero basta un solo bit per codificare il colore di
ogni pixel e quindi saranno necessari 20 000 bit per memorizzare l’immagine.
Per trovare il numero di byte basta fare quindi 20 000 / 8 = 2500 byte.

esercizio guidato 2
Testo Quanti byte occupa un’immagine di 200 š 100 pixel a 256 colori?

Risoluzione Rispetto all’esercizio precedente, in questo cambia lo spazio occupato da


ciascun pixel. Sai che l’immagine è a 256 colori. Per potere rappresentare 256 configura-
zioni diverse sono necessari 8 bit, ovvero 1 byte.
L’immagine occuperà quindi 20 000 š 1 byte = 20 000 byte.

esercizio guidato 3
Testo Se un’immagine a 16,7 milioni di colori occupa 3600 byte, da quanti pixel sarà
composta?

Risoluzione 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 v16,7 milioni.
Il risultato è 24 bit, ovvero 3 byte.
Se ogni pixel richiede 3 byte e l’immagine occupa 3600 byte, sarà composta da
3600 / 3 = 1200 pixel.

● 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.

Lezione 8 Codifica delle immagini 27


La compressione di tipo lossy, invece, provoca una perdita di qualità. Infatti è possibile
ricostruire i dati originali in buona approssimazione, con la perdita di qualche dettaglio.

Il formato grafico GIF


Formato grafico compresso basato su algoritmo LZW senza alcuna perdita di qualità
(loss-free). Supporta la trasparenza dell’immagine ed è possibile definire delle animazioni
(GIF animate). È possibile utilizzare da 1 a 16 milioni di colori, ma le immagini di grandi
dimensioni e con molti colori occupano una grande quantità di memoria. Le GIF animate
consentono di realizzare animazioni di grande effetto nonostante le ridotte dimensioni
del file.

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.

figura 2 Due immagini JPEG con differenti livelli di compressione

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.

28 Unità 1 Codifica delle informazioni


esercizio guidato 5
Testo Partendo dall’esercizio precedente ipotizziamo di avere l’immagine compressa in
formato JPEG (fattore di compressione del 75%). Quante foto ci saranno in questo caso?

Risoluzione La dimensione dell’immagine in byte compressa sarà uguale alla


dimensione in byte non compressa * 25% = 2 880 000.
Numero di immagini = capacità della scheda / dimensione dell’immagine =
2 GB / 2 880 000 B = 745,65 = 745 immagini.

verifica le tue conoscenze


1 Che cos'è un pixel? 5 Quanti byte occupa un'immagine 300 100
a colori?
2 Come si codifica un’immagine?
6 Da quanti pixel è composta un'immagine in b/n che
3 Che cos'è la risoluzione di un’immagine?
occupa 2400 byte?
4 Che cosa sono e a che cosa servono i formati
di compressione?

Lezione 8 Codifica delle immagini 29


1
UNITÀ lezione
Codifica delle altre immagini
9
● Codifica vettoriale
Nella rappresentazione vettoriale vengono rappresentati gli elementi geometrici che compon-
gono l’immagine o il disegno. Ogni elemento viene rappresentato con un opportuno formato
in cui si indica il tipo di oggetto e le sue caratteristiche. Per esempio per un cerchio verrà
indicato che si tratta appunto di un cerchio, le coordinate del centro, il raggio, lo spessore e il
colore della linea, il colore dell’interno (figura 1).
I formati vettoriali più diffusi sono CGM, DWG e DXF. Per la visualizzazione di questo
tipo di immagini serve spesso il programma che lo ha generato (per esempio per i file con
estensione DXF serve Autocad), oppure è necessario utilizzare dei convertitori di formato
che permettono una visualizzazione del contenuto del file.

figura 1 Immagine vettoriale

● 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.

30 Unità 1 Codifica delle informazioni


esercizio guidato 1

Testo Un videoamatore registra un filmato con la propria fotocamera, con le seguenti


caratteristiche:
UÊ fotogramma di risoluzione pari a 1024 š ÊÈ{äÊ«ˆÝiÆ
UÊ Ó{ʓˆˆœ˜ˆÊ`ˆÊVœœÀˆÆ
UÊ 25 fotogrammi/secondo (FPS®Æ
UÊ durata totale: 3 minuti.
Si determini la quantità di memoria totale occupata dal filmato, in assenza di compressione.

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

Testo Partendo dall’esercizio precedente calcolare il fattore di compressione minimo


necessario a rappresentare il filmato compresso all’interno di un file di 10 MB.

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.

verifica le tue conoscenze


1 Che cos'è un pixel? 4 Come funziona il meccanismo di compressione
di MPEG?
2 Come si rappresenta un’immagine in movimento?
3 Come viene memorizzata un'immagine vettoriale? 5 Quanti frame sono necessari per 2 minuti di filmato?

Lezione 9 Codifica delle altre immagini 31


1
UNITÀ lezione
Codifica dei suoni
10
● Il suono
Fisicamente un suono è rappresentato come un’onda che descrive la variazione della
pressione dell’aria nel tempo (onda sonora). Graficamente un’onda sonora può essere rap-
presentata riportando sull’asse delle ascisse il tempo t e sull’asse delle ordinate il valore di
pressione istante per istante (figura 1).

figura 1 Rappresentazione dell'onda sonora

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

Il numero di campioni raccolti per ogni secondo definisce la frequenza di campionamento


che si misura in Hertz (Hz).

● Formati digitali
Esistono varie modalità di campionamento e di rappresentazione del suono. Nel seguito i
formati più diffusi.

32 Unità 1 Codifica delle informazioni


PCM
Acronimo di Pulse Code Modulation, inventato nel 1937, è tra i formati maggiormente
usati per la codifica in digitale dei suoni. Usato per CD, DVD e VoIP. La qualità della
memorizzazione è proporzionale all’occupazione di memoria, anche se esistono varie tec-
niche per ridurne l’occupazione senza perdere qualità.

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.

● Modalità di gestione dell’audio


Podcasting
Con il termine “podcast” (derivante da iPod e BroadCast) si intende un file audio (o video)
in un formato standard (in genere MP3) che viene messo a disposizione su Internet per
essere ascoltato (o visto) tramite appositi programmi.
Deriva dal termine “broadcast”, cioè una trasmissione audio ascoltabile solo nel momento
in cui viene emessa. Con l’avvento di Internet queste trasmissioni sono state memorizzate
e messe a disposizione per un ascolto in differita. L’utente può ascoltare direttamente il

Lezione 10 Codifica dei suoni 33


contenuto del file (tramite lo streaming), oppure scaricarlo e ascoltarlo in un secondo
momento tramite, per esempio, un dispositivo iPod.
Il processo di produzione e distribuzione di un podcast prende il nome di podcasting.

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?

Risoluzione La frequenza di campionamento ti dice quanti campioni di suono ven-


gono memorizzati in un secondo, 200 in questo caso. Avendo 8 secondi di suono avrai:
8 š 200 = 1600 campioni
Poiché ogni campione richiede 4 byte, il suono occuperà 1600 š 4 = 6400 byte (circa 6,4
kB).

esercizio guidato 2
Testo Un secondo di suono campionato a 512 Hz occupa 1 KB. Quanti valori distinti si
possono avere per i campioni.

Risoluzione Se il campionamento è a 512 Hz, in un secondo di suono ci sono 512


campioni.

34 Unità 1 Codifica delle informazioni


Se l’occupazione totale è di 1 kB, e cioè di 1024 bytes, ogni campione occupa:
1024 / 512 = 2 bytes, e cioè 16 bit.
Di conseguenza, per ogni campione si possono avere 216 = 65 536 valori distinti.

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.

Risoluzione Essendo il brano in formato stereo sono presenti 2 canali, ciascuno


codificato con 48 000 campioni/s e 2 B/campione. Ne consegue che il bitrate del brano è:
48 000 camp/s š 2 B/camp š 2 canali = 192 000 B/s
Moltiplicando per la durata del brano si ottiene la dimensione senza compressione:
74 min š 60 s/min š 192 000 B/s = 852 480 000 B
Applicando il fattore di compressione 10š , si ottiene la dimensione del file compresso:
M = 852 480 000 corrispondente a 10 š2e MB = 81.3 MB

verifica le tue conoscenze


1 Perché i suoni vengono campionati? 3 Perché un suono MP3 occupa poco spazio?
2 Che cos’è il podcasting? 4 Perché è utile usare lo streaming?

Lezione 10 Codifica dei suoni 35


unità

1 sintesi

lezione 1 Sistemi di elaborazione


I sistemi di elaborazione sono in grado di ricevere in ingresso dei dati e delle informa-
zioni e, grazie a un processo di elaborazione, restituire dei risultati sotto forma di dati.
Sono guidati in questa loro attività da un insieme di istruzioni chiamato programma
L’insieme delle parti “tangibili” di un sistema di elaborazione prende il nome di hardware.
Le componenti principali sono la CPU (il cuore dell’elaboratore), le memorie che permet-
tono di conservare i programmi e i dati e le periferiche che permettono di far comunicare
l’elaboratore con il mondo esterno. Tra queste troviamo le periferiche di input e di output.

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 3 Sistemi di numerazione


Nei sistemi di numerazione posizionale il valore di un numero dipende dalla posizione
occupata dalle cifre che lo compongono all’interno del numero stesso. Ogni cifra viene
moltiplicata per un’opportuna potenza della base.
Nella numerazione binaria la base utilizzata è il 2. È possibile trasformare un numero
binario in un numero decimale e viceversa. È inoltre possibile effettuare tutte le ope-
razioni aritmetiche sui numeri binari (somma, sottrazione, divisione, moltiplicazione).

lezione 4 Altri sistemi di numerazione


Esistono altri sistemi di numerazione posizionale a base 8 e 16. Mentre il sistema binario
viene usato per la rappresentazione dei dati all’interno dell’elaboratore, i sistemi ottale e
esadecimale sono utili perché più compatti rispetto al sistema binario.
Anche in questi sistemi è possibile effettuare le quattro operazioni ed esistono tecniche
particolari per convertire un numero da una base a un’altra.

lezione 5 Rappresentazione dei numeri


Se si devono rappresentare numeri interi questi vengono rappresentati come numeri
binari. I numeri reali sono invece rappresentati in virgola fissa (fixed point) o in virgola
mobile (floating point).

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.

36 Unità 1 Codifica delle informazioni


unità

lezione 7 Codifica delle informazioni


Le informazioni vengono rappresentate attraverso una sequenza di 0 e 1 poiché l’unità
elementare di memoria (bit) è in grado di rappresentare solo 0 e 1.
Le informazioni alfanumeriche sono rappresentate attraverso la codifica ASCII (o
Unicode). Le informazioni numeriche assumono una diversa rappresentazione a se-
conda che si tratti di numeri interi o reali.

lezione 8 Codifica delle immagini


Le immagini vengono rappresentate come insiemi di pixel (picture element). Possono
essere rappresentate in memoria da un bit o da più bit (fino a 36) a seconda che le im-
magini siano in bianco-nero o a colori. Inoltre in base al livello di risoluzione dell’im-
magine questa può occupare più o meno spazio in memoria.

lezione 9 Codifica delle altre immagini


I disegni tecnici vengono normalmente memorizzati in formato vettoriale, cioè vengono
memorizzati gli elementi geometrici che compongono l’immagine o il disegno. I filmati
vengono invece memorizzati come insiemi di immagini statiche. Importanti diventano
quindi le tecniche di compressione per ridurre l’occupazione di memoria.

lezione 10 Codifica dei suoni


Anche i suoni vengono trasformati in insiemi di bit. Per definire la rappresentazione il
suono viene campionato. Più è alto il campionamento, più è precisa la rappresentazione
ma aumenta anche l’occupazione di memoria. Esistono tecniche particolari che permet-
tono di memorizzare grandi quantità di suoni senza perdere qualità (per esempio MP3).

Unità 1 Codifica delle informazioni 37


unità

1 domande per l’orale

unità 1 Codifica delle informazioni


Ripasso MP3 1 Quali sono le principali componenti di un sistema di elaborazione?

➞ L1

2 Che cos’è il software?

➞ L2

3 Che cos’è un sistema di numerazione posizionale?

➞ L3

4 Cita alcuni sistemi di numerazione posizionali usati in informatica

➞ L3,L4

5 Come vengono rappresentati i numeri interi?

➞ L5

6 Perché i numeri negativi vengono rappresentati in complemento a 2?

➞ L6

7 Come vengono rappresentati i caratteri alfanumerici?

➞ L7

8 Che cos’è un pixel?

➞ L8

9 Che differenza c’è tra immagine “raster” e immagine “vettoriale”?

➞ L8,L9

10 Come si codifica un suono?

➞ L10

38 Unità 1 Codifica delle informazioni


unità
preparati al compito in classe 1
Tema proposto
1 Completa la seguente tabella di comparazione tra tipi di numerazione.
decimale binario ottale esadecimale 2 Effettua le seguenti conversioni di base.
a 11010110(2) = ..............................(10)
0 0 0 0 b 185(10) = ..............................(2)
1 1 1 1 c A5B(16) = ..............................(8)
2 10 2 2 d 153(8) = ..............................(10)
3 11 3 3 e 724(10) = ..............................(16)
4 100 4 4
3 Svolgere le seguenti operazioni binarie
5 101 5 5
con prova.
6 ............ ............ 6
a 11011011 + 1101001 =
7 ............ ............ 7
b 11110011 – 1010110 =
8 ............ ............ ............
c 111010 * 1101 =
9 ............ ............ ............
10 ............ ............ ............
d 11011 : 101 =
11 ............ ............ ............ 4 Il logo della tua scuola è un’immagine di
12 1100 ............ ............ 450 š 120 pixel a 128 colori.
13 1101 15 ............ Quanti byte occupa?
14 1110 16 ............
5 Se un’immagine a 16,7 milioni di colori
15 1111 ............ ............
occupa 2400 byte, da quanti pixel sarà
16 10000 ............ ............
composta?

Risoluzione
1 Completa la seguente tabella di comparazione tra tipi di numerazione.

decimale binario ottale esadecimale

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

Unità 1 Codifica delle informazioni 39


2 Effettua le seguenti conversioni di base.
a 11010110(2) = ..................(10)
11010110 = 0 * 20 + 1 * 21 + 1 * 22 + 0 * 23 + 1 * 24 + 0 * 25 +
1 * 26 + 1 * 27 =
0 * 1 + 1 * 2 + 1 * 4 + 0 * 8 + 1 * 16 + 0 * 32 +
1 * 64 + 1 * 128 =
0 + 2 + 4 + 0 + 16 + 0 + 64 + 128 = 214
b 185(10) = ..................(2)
185 : 2 92 resto 1
92 : 2 46 resto 0
46 : 2 23 resto 0
23 : 2 11 resto 1
11 : 2 5 resto 1
5:2 2 resto 1
2:2 1 resto 0
1:2 0 resto 1
Il numero corrispondente a 185 in binario è 10111001.
c A5B(16) = ..................(8)
A 5 B
1010 0101 1011
101 001 011 011
5 1 3 3
d 153(8) = ..................(10)
153 = 3*80 + 5*81 + 1*82 =
3 + 40 + 64 = 107

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

11011011 + 1 + 2 + 0 + 8 + 16 + 0 + 64 + 128 = 219 +


1101001 = 1 + 0 + 0 + 8 + 0 + 32 + 64 = 105 =

1010001000 + 0 + 4 + 0 + 0 + 0 + 64 + 0 + 256 = 324

b 11110011 – 1010110 =
0 10
0 1 10

11110011 – 1 + 2 + 0 + 0 + 16 + 32 + 64 + 128 = 243 –


1010110 = 0 + 2 + 4 + 0 + 16 + 0 + 64 = 86 =
10011101 1 + 0 + 4 + 8 + 16 + 0 + 0 + 128 = 157

c 111010 * 1101 =
111010 * 0 + 2 + 0 + 8 + 16 + 32 = 58 *
1101 = 1 + 0 + 4 + 8 = 13 =
11

1 111 010 174


1 0 000 00 58
111 101 0
111 010 0 + 2 + 0 + 0 + 16 + 32 + 64 + 128 + 0 + 512 = 754
1 011 110 010

40 Unità 1 Codifica delle informazioni


d 10011 : 101 =
˘˘ 27 : 5

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.

compito in classe proposto Verifica

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 ............

Unità 1 Codifica delle informazioni 41


unità

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.

Questions 5 With 8 bits 128 different configurations


can be represented. T F
1 The ASCII code is used to represent:
6 The binary number 11011010 corresponds
a videos c printable characters to 218 in decimal notation. T F
b integers d images 7 The number 315 in decimal notation
2 List the main image compression standards. corresponds to 1110001001. T F

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.

42 Unità 1 Codifica delle informazioni


Unità
Introduzione ai Sistemi Operativi
2
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 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.

Accertamento dei prerequisiti


1 Descrivi lo schema di von Neumann. 7 In un processore, la velocità è data:
2 Qual è il significato di CPU? Spiega il suo a dal clock
funzionamento. b dalla quantità di RAM
3 Il DOS è un Sistema Operativo a interfaccia c dalla grandezza dell’hard disk
grafica. V F d nessuna delle precedenti
4 Un computer può funzionare anche senza 8 Quale tra i seguenti non è un SO:
Sistema Operativo. V F a Unix
5 La fase di accensione di un computer b Windows
viene chiamata bootstrap. V F c Office
6 Windows è un sistema “Open Source”. V F d Linux
2 lezione
UNITÀ
I Sistemi Operativi
1 e la loro organizzazione

● 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ʏ½ÕÜÊ`iiÊÀˆÃœÀÃ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).

Utente 1 Utente 2 Utente 3 Utente 4

Programmi applicativi

Sistema Operativo

Hardware

figura 1 Il Sistema Operativo come interfaccia tra hardware e software

44 Unità 2 Introduzione ai Sistemi Operativi


Esso è quindi lo strato di software immediatamente superiore all’hardware che ne controlla
tutte le parti appartenenti al sistema e presenta all’utilizzatore la macchina come una mac-
china astratta, hardware più software, e non più solamente fisica.
Quindi il Sistema Operativo si colloca nel seguente schema di Computer System (figura 2).

Programmi applicativi utente

user Compilatori
mode Editor
Interprete dei comandi
programmi
di sistema
Sistema Operativo
kernel kernel
mode

Linguaggio macchina hardware


microprogramma e firmware
unità fisiche

figura 2 Schema di un Computer System

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 REGALOILLIBROALLOSTUDENTEPIáBRAVO OPPURE
s REGALOILLIBROALLOSTUDENTEPIáBRAVOININFORMATICA OPPURE
s REGALOILLIBROALLOSTUDENTEPIá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.

Ricapitolando diciamo che un Sistema Operativo:


UÊ funziona come interfaccia tra l’utente e l’hardware della macchina in modo che l’utente
non debba interagire direttamente con l’elaboratore
UÊ gestisce le risorse del sistema (CPU, memoria centrale, periferiche, informazioni)
rispettando le Politiche di gestione (figura 3).

Lezione 1 I Sistemi Operativi e la loro organizzazione 45


PROGRAMMI APPLICATIVI

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).

figura 4 Sistema Operativo DOS

46 Unità 2 Introduzione ai Sistemi Operativi


Nelle interfacce basate sull’uso di menu, l’utente non deve ricordare i nomi dei diversi
programmi che intende eseguire poiché ogni menu che appare sullo schermo include un
elenco di funzioni (o classi di funzioni) eseguibili e, per ognuna di esse, viene fornita una
breve descrizione nonché il nome del tasto da premere per richiederne l’esecuzione.
Attualmente le interfacce più diffuse sono quelle grafiche, le GUI (Grafichs User Interface),
molto semplici e particolarmente adatte per utenti inesperti. Esse sfruttano la metafora del
desktop, cioè della scrivania, su cui compaiono applicativi e programmi di uso frequente.
Grazie al mouse si possono utilizzare icone, che rappresentano gli oggetti più comuni
come: applicazioni, il cestino ecc.; barre degli strumenti: contenenti serie di pulsanti per
eseguire in modo rapido alcune operazioni; finestre che contengono applicazioni o docu-
menti e finestre di dialogo per consentire all’utente di seguire percorsi guidati e interagire
con una determinata procedura.
Il primo Sistema Operativo commerciale con interfaccia grafica è stato messo a punto per
i personal computer Macintosh della Apple negli anni Ottanta.
Oggi le interfacce grafiche sono diventate uno standard per i Sistemi Operativi dei personal
computer e sono molto utilizzate, oltre che nei Sistemi Operativi MacOS della Apple, anche
in quelli di tipo Unix e in quelli della famiglia Microsoft Windows.
I moderni Sistemi Operativi utilizzano interfacce sempre più amichevoli (user friendly),
ma se ci dovessimo trovare in difficoltà potremmo sempre consultare la guida in linea,
che ci darà indicazioni sulle principali procedure e comandi (figura 5 e figura 6).

figura 5 Sistema Operativo Windows figura 6 Sistema Operativo Linux

verifica le tue conoscenze


1 Spiega la differenza tra sistema proprietario e 4 Spiega la differenza tra un’interfaccia a linea di
sistema aperto. comando e a menu.
2 Definisci il Sistema Operativo. 5 Descrivi gli elementi caratteristici di una GUI. Su
3 Quali sono le funzioni di un Sistema Operativo? quale metafora si basano?

Lezione 1 I Sistemi Operativi e la loro organizzazione 47


2 lezione
UNITÀ
Struttura, funzionamento
2 e prestazioni di un SO

● 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.

● Struttura e modalità di funzionamento


La struttura del Sistema Operativo è basata sulle macchine virtuali, generate a partire
dall’hardware e soddisfacenti i seguenti requisiti:
UÊ ÀˆÃœÛiÀiʈÊ«ÀœLi“>Ê`i½ṎˆââœÊ`iiÊÛ>ÀˆiÊÀˆÃœÀÃiÊ`>Ê«>ÀÌiÊ`iˆÊ“œ`ՏˆÊ`iˆÊˆÛiˆÊÃÕ«i‡
riori;
UÊ “œÌˆ«ˆV>ÀiʈÊ˜Õ“iÀœÊ`iˆÊ`ˆÃ«œÃˆÌˆÛˆÊ`ˆÃ«œ˜ˆLˆˆÊˆ˜Ê“œ`œÊ`>ÊÜ``ˆÃv>ÀiÊ«ˆÙÊÀˆV…ˆiÃÌiÊ`ˆÊ
quelle che il sistema potrebbe soddisfare.

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.

48 Unità 2 Introduzione ai Sistemi Operativi


programmi utente
di spool, editor, compila
rammi tori..
prog livello 4 ..
livello 3
livello 2
livello 1
HARDWARE

ge nucleo
s ti o n ale
e memoria centr
g e s ti
one periferiche
g e s ti
one informazioni

figura 3 Modello a buccia di cipolla

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.

Lezione 2 Struttura, funzionamento e prestazioni di un SO 49


● Prestazioni di un Sistema Operativo
Il Sistema Operativo è costituito da moduli (che costituiscono il software di base) e che
devono essere eseguiti dalla CPU proprio come i programmi degli utenti (software appli-
cativo). La CPU deve allora lavorare anche per quell’utente tanto esigente che è il Sistema
Operativo per cui ogni sofisticazione del Sistema Operativo comporta un maggior lavoro
da parte della CPU. Un Sistema Operativo è tanto più efficiente quanto, a parità di confi-
gurazione hardware, servirà il maggior numero di lavori nel minor tempo.

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.

Spesso conviene definire l’efficienza operativa di un sistema con il termine di throughput,


intendendo il numero di elaborazioni di lavori completate nell’unità di tempo.

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

Il throughput è direttamente proporzionale all’efficienza dell’intero sistema elaborativo;


aumentando il throughput si aumenta l’efficienza del sistema considerato e viceversa.

Complessivamente per garantire l’efficienza del Sistema Operativo è necessario massi-


mizzare i due parametri precedenti e invece minimizzare il rapporto tra il tempo speso
dalla CPU per eseguire programmi di Sistema Operativo rispetto al tempo di lavoro
totale della CPU, cioè minimizzare:
Tcpu di SO
Tcpu totale

Significativo risulta anche il parametro di tempo di esecuzione (Tournaround Time o


TT) per un lavoro.

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.

Dato un insieme di n lavori si può parlare quindi di tempo medio di esecuzione


(Average Tournaround Time o ATT) degli n lavori e si può indicare:
n

∑ TT I
ATT = i =1

n
dove TTi sono i tempi di esecuzione degli n lavori considerati.

50 Unità 2 Introduzione ai Sistemi Operativi


● Funzioni dei moduli del SO
Il SO è un insieme di programmi che gestiscono in modo ottimizzato le risorse del sistema
di elaborazione. Per fare ciò deve:
UÊ Ìi˜iÀiÊ>}}ˆœÀ˜>Ìiʏiʈ˜vœÀ“>∜˜ˆÊÃÕʜ}˜ˆÊÀˆÃœÀÃ>Æ
UÊ ˆ˜ÌiÀ«ÀiÌ>ÀiʏiÊÛ>ÀˆiÊÀˆV…ˆiÃÌiÊ`iˆÊȘ}œˆÊ«ÀœViÃÈÆ
UÊ >ÃÃi}˜>ÀiÊ՘>ÊÀˆÃœÀÃ>Ê>Ê«ÀœViÃÜÊV…iʘiʅ>Êv>Ì̜ÊÀˆV…ˆiÃÌ>Æ
UÊ Àˆ«Ài˜`iÀiʈÊVœ˜ÌÀœœÊ`i>ÊÀˆÃœÀÃ>°

Le principali funzioni dei livelli del SO sono le seguenti:

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Ê “>˜Ìi˜iÀiÊ>}}ˆœÀ˜>̜ʏœÊÃÌ>̜Ê`iˆÊ«ÀœViÃÈÊiÊ`iÊ«ÀœViÃÜÀiÆ
UÊ >œV>Àiʏ>ÊÀˆÃœÀÃ>Ê­«ÀœViÃÜÀi®Êˆ˜ÊL>ÃiÊ>Ê՘>ÊëiVˆvˆV>Ê«œˆÌˆ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ʓ>˜Ìi˜iÀiÊ>}}ˆœÀ˜>̜ʏœÊÃÌ>̜Ê`i>ʓi“œÀˆ>]ʵÕ>ˆÊ«>À̈ÊܘœÊˆ˜ÊÕÜÊiʵÕ>ˆÊ
sono libere;
UÊ `iVˆ`iÀiÊ µÕ>˜Ì>Ê “i“œÀˆ>Ê >œV>ÀiÊ >Ê œ}˜ˆÊ «ÀœViÃÃœÊ ˆ˜Ê L>ÃiÊ >Ê Õ˜>Ê Ã«iVˆvˆV>Ê «œˆÌˆ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ʓ>˜Ìi˜iÀiÊ>}}ˆœÀ˜>̜ʏœÊÃÌ>̜Ê`iiÊ«iÀˆviÀˆV…iÆ
UÊ `iVˆ`iÀiʏiʓœ`>ˆÌDÊ`ˆÊ>ÃÃi}˜>∜˜iÊ`iiÊ«iÀˆviÀˆV…iʈ˜ÊL>ÃiÊ>Ê՘>ÊëiVˆvˆV>Ê«œˆÌˆ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Ê>Ê՘>ÊëiVˆvˆV>Ê«œˆÌˆV>Ê`ˆÊ}iÃ̈œ˜iÆ
UÊ >ÃÃi}˜>Àiʏ>ÊÀˆÃœÀÃ>Ê>Ê«ÀœViÃÜÆ
UÊ Àˆ>ÃVˆ>Àiʏ>ÊÀˆÃœÀÃ>Æ
UÊ VÀi>ÀiÊiÊV>˜Vi>ÀiÊvˆiÊiÊV>ÀÌiiÆ
UÊ «iÀ“iÌÌiÀiʏ½œ«iÀ>∜˜iÊ`ˆÊL>VŽÕ«°

verifica le tue conoscenze


1 Che cosa si intende per macchina virtuale? 4 Che cosa si intende per grado di portabilità?
2 Quali sono le principali risorse gestite dal Sistema 5 Definisci i principali parametri in base ai quali
Operativo? valutare l’efficienza di un SO.
3 Rappresenta il SO con il modello a cipolla e 6 Descrivi quali sono i compiti di uno dei gestori
descrivine i principali livelli. del SO.

Lezione 2 Struttura, funzionamento e prestazioni di un SO 51


2
UNITÀ lezione

3 Tipi di Sistemi Operativi

● 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.

Da un punto di vista dell’organizzazione interna, se invece consideriamo il modo di operare


di un Sistema Operativo relativamente all’uso della CPU e all’elaborazione dei processi la
classificazione dei SO diventa particolarmente vasta e non sempre determinabile a priori;
in prima analisi si potrebbe distinguere tra i seguenti Sistemi Operativi:
UÊ ÃˆÃÌi“ˆÊˆ˜Êmonoprogrammazione;
UÊ ÃˆÃÌi“ˆÊˆ˜Êmultiprogrammazione;
UÊ ÃˆÃÌi“ˆÊˆ˜Êtime sharing;
UÊ ÃˆÃÌi“ˆÊdistribuiti.

anche se poi, nel dettaglio, ogni SO adotta soluzioni e assume caratteristiche peculiari e
non sempre catalogabili.

Elaborazione a lotti (batch)


I dati necessari all’elaborazione sono accumulati in una memoria ausiliaria durante un certo
periodo di tempo: a una scadenza prefissata vengono elaborati tutti insieme (in un unico
lotto) dai programmi applicativi (figura 1).

Raccolta dati Elaborazione Risultati


dato 2
dato 1 Elaborazione Output

figura 1 Sistema di elaborazione a lotti

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.

52 Unità 2 Introduzione ai Sistemi Operativi


In questo modo il SO risulta semplificato perché non deve preoccuparsi né dell’interfaccia
né dell’interazione dei vari programmi che lui stesso deciderà di eseguire in tempi diversi.
I costi del SO batch sono quindi molto bassi; la CPU è sfruttata in modo estremamente
efficiente mentre i problemi nascono nell’interazione con l’I/O (collo di bottiglia di I/O) e
con la bassa efficenza in tempo reale.
L’obiettivo di questo SO è l’ottimizzazione dell’uso delle risorse.

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.

Questo tipo di elaborazione è stato reso possibile grazie all’impiego di periferiche di


Input/Output quali i videoterminali attraverso i quali l’utente può colloquiare con l’uni-
tà centrale, inviando dati e comandi e ricevendo, entro breve tempo, risposte, risultati,
messaggi.
L’uso dei terminali consente all’utente di lavorare dal proprio posto di lavoro, come se
l’unità centrale fosse solo a sua disposizione: in realtà più utenti vengono serviti riparten-
do fra di loro le risorse del sistema. Per gestire il colloquio tra CPU e terminali il Sistema
Operativo è dotato di opportune routine che prevedono l’interrogazione ciclica dei termi-
nali: a turno essi potranno inviare o ricevere messaggi (figura 2).

CPU

figura 2 Sistema interattivo

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.

Lezione 3 Tipi di Sistemi Operativi 53


Sistemi in monoprogrammazione
Sono quei sistemi che permettono l’esecuzione di un solo programma utente alla volta.
Un utente per volta chiede il caricamento e l’esecuzione del programma; tutto il sistema è
dedicato a questo lavoro e non potranno essere serviti altri utenti fino a che il precedente
non è terminato. Il throughput di CPU in questo caso è significativamente basso.
Il SO è abbastanza semplice, non ci sono problemi di competizione per l’utilizzo delle risorse.
Questo è stato il modo di operare dei primi calcolatori ed è attualmente quello usato per i
personal computer (MS-DOS).
Il Sistema Operativo deve caricare il programma in memoria centrale, inizializzare i registri
per l’esecuzione ed è responsabile delle operazioni di ingresso e uscita dei dati (operazioni
di Input/Output) (figura 3).

Sistema
Operativo

Programma
utente

figura 3 Allocazione della memoria centrale in un sistema monoprogrammato

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

figura 4 Sistema monoprogrammato

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).

54 Unità 2 Introduzione ai Sistemi Operativi


Sistema
Operativo

Programma 1

Programma 2

Programma 3

figura 5 Allocazione della memoria centrale in un sistema multiprogrammato

Nascono per aumentare la risposta in tempo reale e la possibilità di uso contemporaneo


dell’hardware, sono caratterizzati da una gestione della memoria virtuale per poter tener
traccia delle varie sessioni di lavoro contemporanee.
Quando un programma che impiega la CPU richiede un’operazione di I/O, cioè l’uso di
una periferica (disco, stampante ecc.), l’elaborazione viene sospesa in attesa che termini
l’I/O. Il processore, invece di attendere inattivo la fine dell’operazione, viene assegnato a
un altro lavoro.
L’esecuzione del sospeso (quando sarà terminata l’operazione di I/O) potrà riprendere in
un secondo momento quando il lavoro successivo termina o richiede anch’esso un’opera-
zione di I/O.
In questo modo viene eliminato ½É"ÊLœÌ̏i˜iVŽÊ­collo di bottiglia) dato che quando un
programma è in attesa di una periferica, la CPU serve un altro processo (alternanza di ese-
cuzione). Il throughput di CPU in questo caso è significativamente alto.
Dall’esterno si ha l’impressione che più programmi vengano eseguiti contemporaneamente:
in realtà, essendoci una sola CPU, un solo programma utente viene eseguito in un certo
momento.
In figura 6 è illustrato il grafico dell’utilizzo della CPU rispetto al tempo in un sistema
monoprogrammato e in figura 7 in un sistema multiprogrammato.

Impiego Impiego
periferica periferica
Lancio P1

Fine 1/0
1/0

1/0

Tempo

figura 6 Utilizzo della CPU in monoprogrammazione

Lezione 3 Tipi di Sistemi Operativi 55


1/0 P1

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

figura 7 Utilizzo della CPU in multiprogrammazione

In un sistema multiprogrammato si hanno i seguenti vantaggi:


UÊ }iÃ̈œ˜iʺVœ˜Ìi“«œÀ>˜i>»Ê`ˆÊ«ˆÙÊ«Àœ}À>““ˆÊˆ˜`ˆ«i˜`i˜ÌˆÊ«ÀiÃi˜ÌˆÊ˜i>ʓi“œÀˆ>ÊVi˜‡
trale;
UÊ “ˆ}ˆœÀiÊṎˆââ>∜˜iÊ`iiÊÀˆÃœÀÃi]ÊVœ˜Ê՘>ÊÀˆ`Õ∜˜iÊ`iˆÊÌi“«ˆÊ“œÀ̈°
D’altro canto si hanno i seguenti svantaggi:
UÊ “>}}ˆœÀiÊVœ“«iÃÈÌDÊ`iÊ-"Æ
UÊ >}œÀˆÌ“ˆÊëiVˆvˆVˆÊ«iÀʏ>Ê}iÃ̈œ˜iÊ`iiÊÀˆÃœÀÃi\ÊCPU, memoria e dispositivi di I/O.

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.

56 Unità 2 Introduzione ai Sistemi Operativi


È necessario evitare che il sistema cada nel “system overhead”, situazione nella quale la per-
centuale di utilizzo della CPU, per eseguire programmi di sistema, è troppo alta rispetto a
quella dedicata all’elaborazione dei programmi utente.
Per esempio Windows è un Sistema Operativo time-sharing monoutente, mentre Linux è
un sistema time-sharing multiutente.

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.

Sistemi dedicati e transazionali


I primi sono utilizzati per i sistemi di elaborazione che devono effettuare delle azioni ripe-
titive, come per esempio nei controlli di processi industriali.
I secondi sono sistemi interattivi che consentono solo l’accesso e la modifica di archivi di
dati, come per esempio per le applicazioni bancarie.

verifica le tue conoscenze


1 Quali sono le differenze tra eleborazione batch ed 4 Quando la CPU è gestita in time sharing?
elaborazione interattiva?
5 Descrivi gli elementi caratteristici di un “sistema
2 Descrivi quali sono le caratteristiche di una
realtime”.
elaborazione interattiva.
3 Dopo aver spiegato cosa si intende per “sistema 6 Dopo aver spiegato cosa si intende per “sistema
multiprogrammato” elencane i vantaggi. distribuito” elencane i vantaggi.

Lezione 3 Tipi di Sistemi Operativi 57


2
UNITÀ lezione

4 Gestione della CPU

● Nucleo del Sistema Operativo


La componente principale dell’elaboratore, e anche la più costosa, è la CPU (Central
Processo Processing Unit). Tutti i programmi hanno bisogno della CPU per essere eseguiti, ma que-
La nozione di processo, o task è sta è unica e quindi viene “contesa” dai vari processi in esecuzione.
emersa all’inizio degli anni ‘60 Riveste allora particolare importanza quella parte del Sistema Operativo che si occupa
insieme allo sviluppo dei primi si-
dell’assegnazione della CPU ai singoli lavori che ne richiedono l’uso. Le funzioni principali
stemi multitasking; è un’entità attiva
che rappresenta l’esecuzione delle che questi moduli devono svolgere sono:
azioni specificate dal programma; 1. mantenere aggiornato lo stato del processore (libero/occupato);
un processo in esecuzione avanza il 2. decidere a quale processo assegnare il processore quando se ne presenti la necessità;
proprio stato. Il processo è il lavoro, 3. assegnare il processore al processo (quello scelto);
o job, associato alla risorsa che ha 4. riprendere il controllo del processore quando il processo è terminato o sospeso.
richiesto e rappresenta l’evoluzione
dinamica di un programma. Pertanto
un processo è un programma dotato La ricetta di cucina descritta nel ricettario è un programma che diverrà processo quando,
del suo codice, dati, stack, program assegnate tutte le risorse (sono a disposizione tutti gli ingredienti) sarà effettivamente ese-
counter, un suo stato e molte altre guita dal processore (il cuoco).
eventuali informazioni.
Ogni elaboratore ha una propria configurazione hardware, così come ogni Sistema
Operativo ha differenti caratteristiche. Come abbiamo precedentemente detto la confi-
gurazione (hardware e software) che si trova più di frequente è quella di un sistema di
elaborazione operante in multiprogrammazione, dotato di un solo processore centrale, di
uno o più processori dedicati (canali di I/O) e delle periferiche standard (dischi, stampanti,
Programma nastri) come illustrato in figura 1.
È un insieme statico di istruzioni,
cioè un’entità passiva, che descrive >Ê}iÃ̈œ˜iÊ`iˆÊ«ÀœViÃÈÊmÊ>vvˆ`>Ì>Ê>ʵÕiˆÊ“œ`ՏˆÊ`iÊ-"ÊV…iÊvœÀ“>˜œÊˆÊ˜ÕViœÊ­ŽiÀ˜i®ÊiÊ
le azioni da compiere. che sono sempre residenti in memoria centrale.

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

figura 1 Configurazione di un sistema di elaborazione

58 Unità 2 Introduzione ai Sistemi Operativi


Fanno parte del nucleo:
UÊ lo schedulatore dei lavori: che seleziona quali lavori devono concorrere all’uso delle
risorse per poter essere eseguiti;
UÊ lo schedulatore dei processi: che decide a quale dei processi creati viene assegnata la
CPU;
Lavoro (Job)
UÊ il controllore del traffico: che controlla l’avanzamento dei processi e la gestione delle È una richiesta elementare di utilizzo
transizioni da uno stato all’altro; di una risorsa, presente all’interno di
un programma in esecuzione. Il Job
UÊ il gestore delle interruzioni: che gestisce i vari tipi di interrupt;
è l’operazione elementare della CPU.
UÊ le procedure di sincronizzazione e comunicazione tra più processi: che servono per
lo scambio di dati e informazioni.

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.

Nella figura 2 è illustrato il diagramma degli stati di un programma.


Quando un lavoro è stato proposto al sistema si trova nello stato di hold: al momento
opportuno un programma del Sistema Operativo (schedulatore dei lavori) dovrà sceglie-
re, tra tutti i programmi che si trovano in questo stato, quale portare in memoria centrale
(stato di ready) (transizione 1: hold - ready). Per poter compiere queste operazioni lo
ÃV…i`Տ>̜ÀiÊ>VVi`iÊ >>Ê ˆÃÌ>Ê `ˆÊ …œ`Ê V…iÊ Vœ˜Ìˆi˜iÊ Õ˜Ê 
Ê ­œLÊ
œ˜ÌÀœÊ œVŽ®Ê «iÀÊ œ}˜ˆÊ
programma in questo stato.

Lezione 4 Gestione della CPU 59


RUN
2 6

1 4 END
HOLD READY 3

WAIT

figura 2 Diagramma di stato di un processo

Generalmente un JCB contiene:


UÊ ½ˆ`i˜ÌˆvˆV>̈ۜÊ`iÊ«Àœ}À>““>Æ
UÊ ½œVVÕ«>∜˜iÊiëÀiÃÃ>ʈ˜ÊŽLÞÌiÆ
UÊ ½ˆ˜`ˆÀˆââœÊ`ˆÊV>ÀˆV>“i˜ÌœÊÃÕʓi“œÀˆ>Ê`ˆÊ“>ÃÃ>Æ
UÊ }ˆÊˆ`i˜ÌˆvˆV>̜ÀˆÊ`iiÊ«iÀˆviÀˆV…iÆ
UÊ ˆÊ«Õ˜Ì>̜ÀiÊ>Ê
ÊÃÕVViÃÈۜ°

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

lista HOLD lista HOLD


1° elemento 1° elemento

H L M M A
H L

lista READY lista READY


figura 3 Lista di hold e ready figura 4 Passaggio di un processo dalla lista
di hold a quella di ready

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.

60 Unità 2 Introduzione ai Sistemi Operativi


Un PCB contiene:
UÊ * ]ʏ½ˆ`i˜ÌˆvˆV>̜ÀiÊ`iÊ«ÀœViÃÜ]ÊVˆœmÊ՘ʘՓiÀœÊ«Àœ}ÀiÃÈۜÆ
UÊ ½ˆ`i˜ÌˆvˆV>̜ÀiÊ`iÊ«>`Ài]ʈÊ«Õ˜Ì>̜ÀiÊ>ÊÃ՜Ê*
Æ
UÊ ˆÊ«Õ˜Ì>̜ÀiÊ>>ʏˆÃÌ>Ê`iˆÊvˆ}ˆÆ
UÊ œÊÃÌ>̜ʈ˜ÊVՈÊÈÊÌÀœÛ>\ÊÀ՘]ÊÀi>`Þ]ÊÜ>ˆÌ]ÊoÆ
UÊ ˆÊÀi}ˆÃÌÀœÊ`ˆÊÃ>Û>Ì>}}ˆœÆ
UÊ ½ˆ˜`ˆÀˆââœÊ`ˆÊV>ÀˆV>“i˜ÌœÊˆ˜Ê“i“œÀˆ>ÊVi˜ÌÀ>iÆÊÊ
UÊ }ˆÊˆ`i˜ÌˆvˆV>̜ÀˆÊ`iiÊ«iÀˆviÀˆV…iÆ
UÊ vˆiÊ>«iÀ̈°Ê

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).

verifica le tue conoscenze


1 Quali sono le funzioni principali che deve svolgere il 4 Che cosa è un PCB? Quali sono gli elementi che
nucleo? caratterizzano il processo?
2 Quali sono e che compiti hanno i moduli 5 Quando il processo è in esecuzione quali sono gli
del nucleo? eventi che si possono verificare per farlo liberare il
3 Quali sono gli stati che un processo può assumere? processore?

Lezione 4 Gestione della CPU 61


2
UNITÀ lezione

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.

● Lo schedulatore dei lavori


La gestione di più lavori o job da parte di un SO monoprogrammato o multiprogrammato
obbliga lo stesso SO alla gestione della risorsa CPU da assegnare ai processi che via via
sono attivabili dagli utenti; in altre parole quando un utente invoca un proprio processo,
lo attiva.
Lo schedulatore dei lavori deve individuare quale lavoro può avanzare nello stato di ready
tra tutti quelli presenti nella lista dei lavori in stato di hold.
Prima di tutto bisogna verificare che siano disponibili tutte le risorse che devono essere
assegnate al lavoro e in particolare, attraverso il gestore della memoria, deve essere control-
lata la disponibilità di spazio in memoria centrale.
In questo caso esso deve fare delle scelte che possono essere basate sul limite di grado di
multiprogrammazione gestito dal SO o sul privilegio eventualmente assegnato a processi
con caratteristiche diverse.
Tra tutti i lavori che hanno queste caratteristiche bisognerà effettuare una scelta e a questo
scopo sono state definite diverse politiche:

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.

62 Unità 2 Introduzione ai Sistemi Operativi


● Lo schedulatore dei processi
Lo schedulatore dei processi si occupa di assegnare la CPU a un processo, cioè deve deci-
dere a quale processo in stato di ready assegnare il processore.
In generale ogni algoritmo di schedulazione deve soddisfare almeno le seguenti sei regole:
1. Imparzialità: ogni processo deve essere concesso equamente alla CPU.
2. Efficienza: la CPU deve essere mantenuta occupata nei valori percentuali i più alti possibili.
3. Tempo reale: gli utenti interattivi devono veder minimizzati i tempi di risposta.
4. Tournaround minimizzato: gli utenti batch devono veder minimizzati i tempi di elabo-
razione.
5. Throughput massimizzato: si deve ottenere il più alto numero di processi completati
nell’unità di tempo.
6. Fairness: si deve evitare che alcuni processi non siano mai stati, o siano troppo raramen-
te, schedulati.

>ÊVœ`>Ê`iˆÊ«ÀœViÃÈʫÀœ˜ÌˆÊVœ˜Ìˆi˜iʈÊ`iÃVÀˆÌ̜ÀˆÊ­*
]Ê*ÀœViÃÃÊ
œ˜ÌÀœÊ œVŽ®Ê`iˆÊ«ÀœViÃÈÊ
pronti (figura 1).

PCB1 PCB2 PCBn


primo

ultimo

figura 1 Coda dei processi pronti

Lo schedulatore dei processi è in grado di compiere questa funzione secondo specifiche


politiche di scheduling che si suddividono in non preemptive, se la CPU una volta asse-
gnata non può essere tolta fino a quando il processo non è terminato o richiede un’ope-
razione di I/O e preempitive se la CPU può essere tolta al processo anche quando è in
esecuzione.

Le principali politiche di scheduling non preemptive sono:


UÊ First Come - First Served (FCFS): la CPU viene assegnata al processo che si trova alla
testa della coda dei processi pronti, quindi il primo processo arrivato è il primo processo
a essere servito. Svantaggi: il tempo medio di attesa è piuttosto lungo e sono penalizzati
i processi brevi.
UÊ Shortest Job First (SJF): si assegna la CPU al processo che ha il più breve tempo di
utilizzo della CPU prima di un’operazione di I/O. Questo algoritmo rende minimo il
tempo medio di attesa ma è difficile sapere l’esatta durata della successiva sequenza, si
può solo farne una stima.
UÊ Scheduling con priorità: si associa una priorità a ogni processo e si assegna la CPU
a quello con priorità più alta. Le priorità possono essere calcolate tenedo conto sia del
tempo di esecuzione che del tempo di attesa nella coda dei ready.
Tempo di attesa  Tempo di esecuzione
Priorità =
Tempo di esecuzione
Si privilegiano i processi brevi e quelli che attendono da più tempo.

Lezione 5 Algoritmi di scheduling 63


Le principali politiche di scheduling preemptive sono:
UÊ Round Robin: il processore viene assegnato a turno, per un intervallo di tempo stabi-
lito (time slice), ai processi nell’ordine in cui questi ne hanno fatto richiesta. La coda è
gestita col metodo FIFO e quindi tutti gli inserimenti provenienti dalla coda di hold,
dalla coda di wait o quelli causati dall’esaurimento di un time slice avvengono al fondo
(figura 2).

lavori che necessitano altri time slice

C
arrivi dallo stato di hold P end
U
lista dei processi wait
arrivi dallo stato di wait

figura 2 Round Robin

UÊ Round Robin a percentuale di tempo: con la tecnica precedente i processi che


richiedono molte operazioni di I/O sono penalizzati rispetto a quelli che ne richiedo-
no di meno perché il rientro dallo stato di wait significa l’inserimento del processo al
fondo della coda. La tecnica a percentuale di tempo è una variante del Round Robin:
il processo non verrà inserito necessariamente al fondo ma la posizione di rientro
nella coda dipende dalla percentuale di tempo di CPU utilizzata. Questo significa che
se un processo lascia il processore perché richiede un I/O e quindi non ha ancora
esaurito il proprio time slice, il suo rientro nella coda non sarà più al fondo ma tanto
più avanti quanto minore è la percentuale di tempo di CPU utilizzata prima dell’in-
terruzione (figura 3).

C
P end
arrivi dallo stato di hold
U

10%
wait
80% operazione
I/O

figura 3 Round Robin a percentuale di tempo

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).

64 Unità 2 Introduzione ai Sistemi Operativi


lavori che non hanno esaurito N time slice

coda 1
C
arrivi dallo stato di hold P end
U
wait
arrivi dallo stato di wait

coda 2

lavori che hanno già esaurito N time slice

figura 4 Round Robin limitato

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.

UÊ Priorità dinamica: il Sistema Operativo modifica la priorità in base al tempo di utilizzo


della CPU: ai processi che rilasciano la CPU prima dello scadere del quanto temporale
viene aumentato il valore della priorità.

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.

verifica le tue conoscenze


1 Descrivi quali sono le principali politiche 3 Spiega la differenza tra la politica del
dello schedulatore dei lavori. “Round Robin” e quella del “Round Robin
a percentuale di tempo”.
2 Descrivi quali sono le principali politiche
di scheduling non preemptive dei processi. 4 Cosa si intende per “Overhead di Sistema”?

Lezione 5 Algoritmi di scheduling 65


2
UNITÀ lezione

6 Gli interrupt

● Gestione delle interruzioni


L’interrupt è il meccanismo mediante il quale vengono comunicati alla CPU alcuni eventi
ben precisi (un evento può essere per esempio, la scadenza di un time slice o un errore di
programma).
A seconda del tipo di interrupt verificatosi, il Sistema Operativo deve sospendere l’ese-
cuzione del programma in corso e attivare la routine specifica per la situazione che si è
verificata (figura 1).

La CPU sospende il programma in


esecuzione, esegue la routine di servizio
e poi riprende il programma.
Programma
Routine di
interrupt

Interrupt Ripartenza del programma

figura 1 Gestione dell’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

66 Unità 2 Introduzione ai Sistemi Operativi


Dovendo tenere conto del verificarsi degli interrupt il ciclo di esecuzione delle istruzioni
viene così modificato:

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.

Le componenti del registro di stato sono illustrate in figura 2 dove:


UÊ stato: è una serie di bit che fornisce informazioni sull’andamento dell’esecuzione (risul-
tato Vero o Falso dell’ultimo confronto, eventuali situazioni di overflow ...);
UÊ program counter: contiene l’indirizzo della prossima istruzione che sarà eseguita;
UÊ lunghezza: indica la lunghezza dell’istruzione eseguita che può essere 2, 4, o 6 byte.

Stato Program Lunghezza


programma counter istruzione

figura 2 Registro di stato

Per gestire un interrupt il Sistema Operativo deve quindi:


UÊ salvare il registro di stato del programma che contiene tra l’altro l’indirizzo della prima
istruzione che sarà eseguita alla ripresa del programma (il program counter)
UÊ eseguire la routine di gestione dell’interruzione;
UÊ ritornare all’esecuzione del programma sospeso riattivando il suo registro di stato.

La figura 3 evidenzia il salvataggio e il ripristino del registro di stato di un programma:


UÊ v>ÃiÊ£: il registro di stato del programma interrotto viene salvato in memoria centrale;
UÊ v>ÃiÊÓ: dalla memoria centrale è prelevato un altro registro di stato che diventa “corrente”;
UÊ v>ÃiÊÎ: viene ripreso il vecchio registro di stato per continuare l’esecuzione del pro-
gramma.

I principali tipi di interruzione sono:


UÊ Hardware interrupt: interruzione causata da malfunzionamento o guasto hardware.
UÊ Supervisor Call interrupt: chiamata asincrona da un modulo supervisore per una
richiesta di I/O.

Lezione 6 Gli interrupt 67


CPU

Registro di stato

1 3 2

Memoria
centrale

Registro di stato OLD Registro di stato NEW

figura 3 Salvataggio e ripristino del registro di stato

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.

In particolare si avrà che:


UÊ quando il processore riceve la richiesta di interruzione da una periferica, il segnale viene
sentito dal processore e dal controllore di priorità, che, a seguito di più richieste soddisfa
quella di priorità maggiore;
UÊ il processore abilita il codificatore e genera l’indirizzo parziale della periferica;
UÊ un decodificatore degli indirizzi crea, partendo dall’indirizzo parziale e da quello gene-
rato dal processore, il riferimento al vettore di interruzione;
UÊ il vettore di interruzione contiene l’indirizzo della routine di risposta che sarà forzato nel
program counter.

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

68 Unità 2 Introduzione ai Sistemi Operativi


meccanismo è detto mascheramento degli interrupt.
In figura 4 è illustrata la struttura completa del registro di stato, la maschera interrupt
indica quali interrupt possono essere accettati.

Maschera Stato Program Lunghezza


interrupt programma counter istruzione

figura 4 Struttura completa del registo di stato

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.

verifica le tue conoscenze


1 Perchè l’interrupt interrompe 3 Descrivi come si modifica il ciclo di esecuzione delle
l’esecuzione sequenziale delle istruzioni istruzioni a seguito di un’interruzione.
di un programma?
4 Descrivi il meccanismo degli interrupt multipli
2 Dopo aver spiegato cosa si intende per “interrupt” mediante le interruzioni vettorizzate.
elencane i principali tipi.
5 Descrivi il ciclo di polling.

Lezione 6 Gli interrupt 69


unità

2 sintesi

lezione 1 I Sistemi Operativi e la loro organizzazione


Il Sistema Operativo è visto come interfaccia tra l’utente e l’hardware e come gestore
di risorse (hardware e software). Possiamo avere SO proprietari e aperti. L’interfaccia è
quella parte del SO che permette all’utente di usare il computer. Le interfacce possono
essere a linea di comando, basate sull’uso dei menu e grafiche (GUI).

lezione 2 Struttura, funzionamento e prestazioni


di un SO
Il grado di portabilità di un SO indica la possibilità di utilizzarlo su macchine con
hardware diverso. Il SO si basa su macchine virtuali ed è organizzato secondo il mo-
dello a cipolla. I livelli principali sono: il nucleo, il gestore della memoria, delle peri-
feriche e delle informazioni. I principali parametri per valutare un SO sono: attività
della CPU, il throughput, e il tournaround time.

lezione 3 Tipi di Sistemi Operativi


In base a come utilizza i dati in ingresso un SO si può dividere in batch o interattivi;
mentre in base all’uso della CPU abbiamo SO monoprogrammati, multiprogrammati,
time sharing e distribuiti. Inoltre abbiamo i SO realtime, dedicati e transazionali.

lezione 4 Gestione della CPU


È svolta dal nucleo, di cui fanno parte lo schedulatore dei lavori, dei processi, il con-
trollore del traffico, il gestore delle interruzioni e le procedure di sincronizzazione e
comunicazione. Gli stati che può assumere un processo sono: hold, ready, run, wait,
i˜`°Ê"}˜ˆÊ>ۜÀœÊmÊV>À>ÌÌiÀˆââ>̜Ê`>Ê՘ÊœLÊ
œ˜ÌÀœÊ œVŽÊiʜ}˜ˆÊ«ÀœViÃÜÊ`>Ê՘Ê*ÀœViÃÃÊ

œ˜ÌÀœÊ œVް

lezione 5 Algoritmi di scheduling


Per assegnare una risorsa a un processo o per far avanzare un lavoro nella coda di ready
si utilizzano delle politiche di scheduling. Lo schedulatore dei lavori si basa sulle seguen-
ti politiche: FIFO, priorità statica e dinamica. Lo schedulatore dei processi si basa sul-
le politiche non preemptive: First Come-First Served, Shortest Job First e lo Scheduling
con priorità; e preemptive: Round Robin, Round Robin a percentuale di tempo e Round
Robine limitato.

lezione 6 Gli interrupt


È un meccanismo mediante il quale si comunica il verificarsi di un certo evento alla
CPU. I principali tipi di interrupt sono: Hardware interrupt, Supervisior Call interrupt,
Program interrupt, External interrupt e I/O interrupt. Nel caso di interrupt multipli si
possono usare i metodi delle interruzioni vettorizzate e del ciclo di polling.

70 Unità 2 Introduzione ai Sistemi Operativi


unità
domande per l’orale 2
unità 2 Introduzione ai Sistemi Operativi
Ripasso MP3
1 Introduci il concetto di Sistema Operativo spiegandone i suoi compiti.

➞ L1

2 Descrivi la struttura e il funzionamento di un Sistema Operativo.

➞ L2

3 Descrivi le principali differenze tra l’elaborazione a lotti e interattiva.

➞ L3

4 Definisci il processo e il processore.

➞ 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

7 Spiega la differenza tra la politica di schedulazione dei lavori a priorità statica e


dinamica.

➞ L5

8 Spiega quando si verificano i principali interrupt che conosci.

➞ L6

Unità 2 Introduzione ai Sistemi Operativi 71


unità

2 in English, please

Abstract
INTRODUCTION TO OPERATING SYSTEMS
/…iʜ«iÀ>̈˜}ÊÃÞÃÌi“ʈÃÊ̅iÊL>VŽLœ˜iʜ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…ÊÃ>̈ÃvˆiÃÊ`ˆÃŽÊÀiµÕiÃÌÃʈ˜Ê̅iÊÃ>“iʜÀ`iÀÊ Ž˜œÜ˜Ê>ÃÊvˆÀ“Ü>Ài]Ê>ÀiÊ«œÃÈLi°
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>`Þ]ÊLœVŽi`]Ê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Ê>ÃÊ>˜Êii“i˜Ìʜ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.

72 Unità 2 Introduzione ai Sistemi Operativi


Unità
Il Sistema Operativo come gestore
3 di risorse

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.

Accertamento dei prerequisiti


1 Che cos’è la RAM e quali funzioni svolge? 7 La CPU è costituita da:
2 Indica la differenza fra memoria di massa e a RAM e ROM
memoria centrale. b ALU e ROM
3 Indica almeno 3 tipi di unità periferiche di input c ALU e CU
o di output e riporta una breve descrizione per d ALU e RAM
ognuna di esse.
4 La quantità di RAM influenza la velocità 8 Quando si spegne il PC il contenuto della ROM:
e le prestazioni di un computer. V F a viene perso
5 L’unità di misura della RAM è il Giga Hertz. V F b rimane nella memoria ROM
6 Un processo è un programma c viene trasferito nell’hard disk
in esecuzione. V F d nessuno delle precedenti
3
UNITÀ lezione

1 Gestione della memoria centrale

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.

Si possono distinguere quattro categorie di indirizzi:


1. Indirizzi simbolici. Sono espressi in modo totalmente simbolico e non viene fatto nes-
sun riferimento alle locazioni della memoria centrale.
Questi indirizzi possono essere espressi come etichette simboliche (o label).
Lo sviluppatore non si preoccupa mai di specificare gli indirizzi di memoria lasciando
questo compito ad altri programmi, come il compilatore.
2. Indirizzi logici. Nella fase di assemblaggio gli indirizzi simbolici del codice sorgente
vengono trasformati in forma binaria ma i loro contenuti sono ancora logici cioè sono
numerici ma non contengono ancora gli indirizzi delle celle di memoria fisica in cui il
programma verrà memorizzato durante l’esecuzione.
3. Indirizzi virtuali. Sono indirizzi binari logico-virtuali e relativi ma completi di ogni
riferimento.
Anche in questo caso i riferimenti di memoria nei codici eseguibili sono riferimenti di
memoria virtuale, cioè non ancora indirizzi di memoria fisica ma contenenti tutte le
informazioni per diventare indirizzi fisici.
4. Indirizzi fisici. A questo punto gli indirizzi virtuali presenti nel file eseguibile sono
tradotti in indirizzi di memoria fisica.
L’associazione degli indirizzi virtuali in indirizzi fisici, in fase d’esecuzione è svolta
dall’unità di gestione della memoria MMU (Memory Management Unit) (figura 2).
Siccome i codici eseguibili contengono generalmente indirizzi binari relativi virtuali può
far sì che diversi programmi possano condividere lo stesso spazio di indirizzamento, per
esempio potrebbero tutti partire dall’indirizzo zero.
Naturalmente, una volta in memoria, i vari codici non possono condividere lo stesso spazio
di indirizzi. Questa situazione viene risolta da meccanismi detti di rilocazione.

74 Unità 3 Il Sistema Operativo come gestore di risorse


CPU
Disk
Memory
controller
MMU

BUS

figura 2 Posizione e funzione della MMU

● 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Ê Ìi˜iÀ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ÊÃÜ>«ÊœÕÌ]ÊVˆœmÊ>œV>ÀiÊiÊ`i>œV>Àiʓi“œÀˆ>Ê
ai processi, applicando opportuni meccanismi operativi;
UÊ }iÃ̈ÀiʈÊÀiVÕ«iÀœÊ`i>ʓi“œÀˆ>ÊVi˜ÌÀ>iʵÕ>˜`œÊ՘ʫÀœViÃÜÊÌiÀ“ˆ˜>°

verifica le tue conoscenze


1 Definisci lo spazio degli indirizzi. 3 Spiega la differenza tra rilocazione statica e dinamica.
2 Descrivi brevemente i quattro tipi di indirizzi di 4 Quali sono le principali occupazioni dei moduli del
memoria. gestore della memoria?

Lezione 1 Gestione della memoria centrale 75


3
UNITÀ lezione
Allocazione a partizioni statiche
2
● Le tecniche di allocazione
Le metodologie di allocazione della memoria consistono nei modi e nelle tecniche con cui
il SO concede e assegna memoria ai programmi.
Le tecniche di allocazione della memoria sono sostanzialmente due e dipendono dai due
concetti di rilocazione che abbiamo illustrato nella Lezione precedente: tecniche di allo-
cazione della memoria con rilocazione statica e tecniche di allocazione della memoria con
rilocazione dinamica.
Inoltre è assolutamente necessario che entrambe le tecniche di allocazione con rilocazione
possano prevedere due tipologie di allocazione fondamentali dette a loro volta allocazione
statica e allocazione dinamica.
Una tecnica di allocazione della memoria che si basa sulla rilocazione statica può essere
gestita quindi con allocazione statica o con allocazione dinamica, così come la tecnica di
allocazione della memoria che si basa sulla rilocazione dinamica può essere gestita con
allocazione statica o con allocazione dinamica.
Sostanzialmente l’allocazione statica riguarda la natura dei processi caricati in memo-
ria che sono allocati una sola volta e sono revocati dalla memoria solo al termine
Le operazioni di “swap in” avven- dell’esecuzione, mentre l’allocazione dinamica della memoria riguarda processi che in
gono da disco a memoria centrale, esecuzione possono vedersi revocata e riallocata la memoria più volte, solitamente con
mentre quelle di “swap out” da
memoria centrale a disco.
operazioni di swapping dalla memoria secondaria (swap in) e per la memoria secondaria
(swap out).

● Allocazione a singola partizione:


sistemi monoprogrammati
La gestione della memoria più semplice da analizzare è quella relativa ai sistemi mono-
programmati tipo pc con SO MS-DOS o similari, con un solo processo in esecuzione alla
volta. In memoria centrale viene caricato un solo programma utente che comunque non
può occupare tutta la memoria disponibile perché, non dimentichiamo, una porzione è
sempre riservata al Sistema Operativo.
I meccanismi hardware di supporto sono la presenza di un registro limite di protezione per
impedire che l’unico programma vada a interferire con le aree dedicate al SO. Questo
registro limite può essere settato con il valore del primo indirizzo libero per i programmi e
quindi, runtime, controllato a ogni accesso alla memoria, per verificare che ogni indirizzo
formato non sia inferiore a quel valore contenuto nel registro limite.
Questo sistema è facile da gestire ma non presenta una gestione ottimizzata delle risorse.
Infatti la CPU è poco utilizzata perché rimane inattiva tutte le volte che un processo termina o
richiede un’operazione di I/O e inoltre quando un programma ha dimensione minore rispetto
a quella disponibile, una parte di memoria centrale rimane inutilizzata (figura 1).
Al contrario, se un programma richiede più memoria di quella disponibile, esso non può
essere eseguito a meno che non si ricorra a particolari tecniche di suddivisione del program-
ma in parti indipendenti fra loro e quindi singolarmente eseguibili (tecniche di overlay).
Tali tecniche sono gestite completamente dai programmatori che all’interno dei loro pro-
getti devono indicare al SO come e quando caricare le singole parti di programma.
È il tipico esempio di molti videogiochi di avventura, in cui, terminata una fase del gioco,
è possibile cancellare parte del programma e caricare la parte che dovrà gestire la fase
successiva.

76 Unità 3 Il Sistema Operativo come gestore di risorse


● Allocazione per partizioni:
sistemi multiprogrammati
Se si vogliono avere in memoria centrale più processi in contemporanea, caso della multi-
programmazione, allora bisogna ricorrere ad altre tecniche. Infatti la memoria diventa una
risorsa condivisa.

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

figura 1 Allocazione a singola partizione figura 2 Allocazione per partizioni

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.

Lezione 2 Allocazione a partizioni statiche 77


Un accorgimento che si adotta è quello di definire partizioni di diverse categorie: piccole,
medie, grandi. In questo modo è possibile sfruttare al meglio la memoria centrale poiché
un programma “grosso” sarà allocato in una partizione grande, mentre i programmi più
piccoli saranno allocati nelle partizioni più piccole.
Il gestore della memoria centrale deve poter tenere traccia delle partizioni e del loro stato:
per questo utilizza la tabella delle partizioni che contiene queste informazioni:

tabella delle partizioni


ID dimensione indirizzo stato

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

270k area libera

figura 3 Allocazione con partizioni statiche di diverse dimensioni

78 Unità 3 Il Sistema Operativo come gestore di risorse


ID DIM IND STATO
1 50 100 PG1
2 30 150 LIBERA
3 30 180 PG2
4 10 210 PG3
5 50 220 LIBERA

figura 4 Tabella di gestione delle partizioni

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

figura 5 Frammentazione dello spazio libero

verifica le tue conoscenze


1 Spiega la differenza tra allocazione statica e 3 Quali sono gli inconveniente dell’allocazione della
dinamica. memoria a partizioni statiche?
2 Descrivi l’allocazione della memoria a singola
partizione. 4 Descrivi la tabella delle partizioni.

Lezione 2 Allocazione a partizioni statiche 79


3
UNITÀ lezione

3 Allocazione a partizioni dinamiche

● 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).

tabella delle partizioni


ID dimensione indirizzo ID-PGM

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

tabella delle aree libere


id dimensione indirizzo

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.

80 Unità 3 Il Sistema Operativo come gestore di risorse


Tabella delle partizioni
SO ID DIM IND ID-PGM
1 50 100 PG1
100k
2 30 180 PG2
PG1 3 50 210 PG3
150k 4 50 300 PG4

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

figura 1 Partizioni dinamiche

In figura 2 viene illustrata la nuova situazione quando viene allocato il programma PG5
che richiede 20k di memoria.

Tabella delle partizioni


SO ID DIM IND ID-PGM
1 50 100 PG1
100k
2 20 150 PG5
PG1 3 30 180 PG2
150k 4 50 210 PG3
PG5 5 50 300 PG4
170k
180k
PG2
210k
PG3 area libera
260k
Tabella delle aree libere
300k ID DIM IND
PG4 1 10 170
2 40 260
350k
3 20 350
370k

figura 2 Situazione della memoria dopo l’allocazione del PG5

Quando termina il programma PG1 la nuova situazione della memoria centrale e delle
tabelle è illustrata in figura 3.

Lezione 3 Allocazione a partizioni dinamiche 81


Tabella delle partizioni
SO ID DIM IND ID-PGM
1 20 150 PG5
100k
2 30 180 PG2
3 50 210 PG3
150k 4 50 300 PG4
PG5
170k
180k
PG2
210k
PG3 area libera
260k Tabella delle aree libere
ID DIM IND
300k 1 50 100
PG4 2 10 170
3 40 260
350k
4 20 350
370k

figura 3 Situazione dopo la deallocazione di PG1

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

Tabella delle partizioni


ID DIM IND ID-PGM
SO 1 50 110 PG1
2 100 175 PG2
100k
110k 3 20 285 PG3

PG1
160k
area libera

Tabella delle aree libere


PG2 ID DIM IND
1 10 100
2 15 160
275k
285k 3 10 275
PG3
305k 4 10 305
315k

figura 4 Frammentazione della memoria

82 Unità 3 Il Sistema Operativo come gestore di risorse


esiste il problema della frammentazione esterna (alle partizioni); le aree che di volta in
volta rimangono libere dalla revoca di programmi possono essere tutte così piccole da non
contenere nessun altro programma, ma contemporaneamente la loro somma può risultare
molto ampia e inutilizzata.

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:

INDIRIZZO ASSOLUTO = INDIRIZZO RELATIVO + INDIRIZZO DI PARTENZA

verifica le tue conoscenze


1 Descrivi come avviene l’allocazione della memoria 3 Descrivi la politica di assegnazione First fit.
con la tecnica delle partizioni dinamiche.
2 Illustra il problema della “frammentazione”. Spiega la 4 Che cosa si intende per “compattazione” e per
differenza tra frammentazione interna ed esterna. “rilocazione”?

Lezione 3 Allocazione a partizioni dinamiche 83


3
UNITÀ lezione

4 Allocazione non contigua

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.

tabella delle pagine


PGM-ID n. pagina n. blocco

dove:
PGM-ID = identificativo del programma
n.pagina = identificativo della pagina
n. blocco = indica il numero del blocco nel quale è memorizzata la pagina

tabella dei blocchi


n. blocco indirizzo stato

84 Unità 3 Il Sistema Operativo come gestore di risorse


dove:
n. blocco = indica il numero del blocco
indirizzo (IND.) = indica l’indirizzo di caricamento del blocco
stato = indica lo stato del blocco (libero/occupato)

In figura 1 è illustrato un esempio di memoria centrale organizzata a blocchi con le


relative tabelle.

SO PGM-ID N.PAGINA N.BLOCCO N.BLOCCO IND. STATO


1 PG1 0 2 1 1000 libero
2 PG1 PG1 1 4 2 1002 occupato
3 PG1 2 5 3 1004 libero
4 PG1 PG2 0 10 4 1006 occupato
5 PG1 PG2 1 11 5 1008 occupato
6 PG3 0 7 6 1010 libero
7 PG3 7 1012 occupato
8 8 1014 libero
9 9 1016 libero
10 PG2 10 1018 occupato
11 PG2 11 1020 occupato
12 12 1022 libero

figura 1 Memoria centrale organizzata a blocchi

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.

verifica le tue conoscenze


1 In cosa consiste l’allocazione non contigua della 3 Illustra la tecnica della “paginazione”.
memoria?
2 Illustra la struttura della “tabella delle pagine” e della 4 Qual è la situazione della frammentazione
“tabella dei blocchi”. con questo metodo?

Lezione 4 Allocazione non contigua 85


3 lezione
UNITÀ
Memoria virtuale a richiesta
5 di pagine

● 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.

Il concetto di memoria virtuale permette quindi di superare il vincolo della limitatezza


fisica della memoria centrale. Per esempio può essere possibile far girare un programma
che richiede 50K di memoria avendone a disposizione soltanto 20K. Il principio consiste
nel pensare di avere a disposizione una memoria ipotetica virtuale che si possa immaginare
teoricamente infinita.

Con tale tecnica si hanno i seguenti vantaggi:


UÊ ˜œ˜ÊV½mÊ«ˆÙʏ>ʏˆ“ˆÌ>∜˜iÊ`œÛÕÌ>Ê>>Ê`ˆ“i˜Ãˆœ˜iÊ`i>ʓi“œÀˆ>ÊvˆÃˆV>]ʵՈ˜`ˆÊ`ˆÛi˜Ì>Ê
possibile eseguire programmi di qualsiasi dimensione;
UÊ ÃˆÊ>Փi˜Ì>ʘœÌiۜ“i˜ÌiʈÊˆÛiœÊ`ˆÊ“Տ̈«Àœ}À>““>∜˜iÊ`iÊÈÃÌi“>Æ
UÊ ÃˆÊ «œÃܘœÊ ÃvÀÕÌÌ>Ài]Ê Vœ“iÊ Vœ˜Ãi}Õi˜â>]Ê ˆ˜Ê “œ`œÊ «ˆÙÊ ivvˆVˆi˜ÌiÊ ÌÕÌÌiÊ iÊ >ÌÀiÊ ÀˆÃœÀÃiÊ
dell’elaboratore.

Il concetto di memoria virtuale si basa su due principi di località:


UÊ ˆÊ«Àˆ˜Vˆ«ˆœÊ`ˆÊlocalità temporale: le locazioni di memoria usate recentemente è proba-
bile che verranno presto riutilizzate;
UÊ ˆÊ«Àˆ˜Vˆ«ˆœÊ`ˆÊlocalità spaziale: se è stata indirizzata una certa locazione di memoria, è
probabile che saranno indirizzate presto anche le locazioni a essa adiacenti.

La gestione di una memoria virtuale deve avvenire seguendo questi criteri:


UÊ ÃˆÊ`iÛiÊëiââiÌÌ>ÀiÊ՘ʫÀœ}À>““>Ê­ÌiV˜ˆV…iÊ`ˆÊ«>}ˆ˜>∜˜iÊiÊ`ˆÊÃi}“i˜Ì>∜˜i®Æ
UÊ ÃˆÊ`iÛiÊV>ÀˆV>Àiʈ˜Ê“i“œÀˆ>Ê܏œÊ>V՘ˆÊ«iââˆÊ`iÊ«Àœ}À>““>ʏ>ÃVˆ>˜`œÊˆÊÀiÃ̜ÊÃÕʓi“œ‡
ria di massa;
UÊ ÃiÊ`ÕÀ>˜Ìiʏ½iÃiVÕ∜˜iÊ`ˆÊ՘ʫÀœ}À>““>Êۈi˜iÊÀˆV…ˆiÃÌ>Ê՘>Ê«>}ˆ˜>]ʘœ˜Ê«ÀiÃi˜Ìiʈ˜Ê
memoria, si dovrà provvedere al caricamento con eventuale rimozione di un blocco
(algoritmi di rimozione della pagina).

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˜Ì>Ì>‡«>}ˆ˜>Ì>°

86 Unità 3 Il Sistema Operativo come gestore di risorse


● Gestione a richiesta di pagine
La gestione della memoria virtuale a richiesta di pagine (paginazione dinamica) utilizza le
stesse tecniche della paginazione suddividendo il programma in pagine e la memoria cen-
trale in blocchi della stessa dimensione, solo che in ogni istante non tutte le pagine hanno
associato un reale blocco fisico in memoria, cioè non tutte le pagine sono fisicamente
caricate in memoria centrale. Opportuni algoritmi del Sistema Operativo scelgono quali
pagine caricare in memoria fin dall’inizio. Se durante l’esecuzione l’istruzione da eseguire
si trova in una pagina non presente in Memoria Centrale, viene generata una “interruzione
per mancanza di pagina” (page fault) e viene richiesto al Sistema Operativo di provvedere
al suo caricamento dalla memoria di massa.

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;

tabella delle pagine


PGM-ID n. pagina indir. mm stato

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)

tabella dei blocchi


n. blocco indirizzo stato

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

Lezione 5 Memoria virtuale a richiesta di pagine 87


Quando il Sistema Operativo deve caricare una pagina in memoria centrale si possono
verificare due casi:
Caso 1: in memoria centrale ci sono blocchi liberi (e questo è facilmente desumibile dalla
tabella dei blocchi). In questo caso il Sistema Operativo deve:
UÊ >}}ˆœÀ˜>Àiʏ>ÊÌ>Li>Ê`iiÊ«>}ˆ˜i\ʏœÊÃÌ>̜Ê`i>Ê«>}ˆ˜>ÊmÊ«œÃ̜Ê>ʣʭV>ÀˆV>Ì>ʈ˜Ê“i“œÀˆ>Ê
centrale);
UÊ >}}ˆœÀ˜>Àiʏ>ÊÌ>Li>Ê`iˆÊLœVV…ˆÊ­«iÀʈÊLœVVœÊÃViÌœ\ÊÃÌ>̜ÊrʜVVÕ«>̜®Æ
UÊ ˆ˜ÃiÀˆÀiÊ՘>ÊÀˆ}>ʘi>ÊÌ>Li>Ê`ˆÊ“>««>ÊV…iʈ˜`ˆV>ʈ˜ÊµÕ>iÊLœVVœÊmÊÃÌ>Ì>ÊV>ÀˆV>Ì>ʏ>Ê«>}ˆ˜>
UÊ V>ÀˆV>ÀiÊivviÌ̈Û>“i˜Ìiʏ>Ê«>}ˆ˜>Ê`>>ʓi“œÀˆ>Ê`ˆÊ“>ÃÃ>Ê>>ʓi“œÀˆ>ÊVi˜ÌÀ>iÊ­µÕiÃÌ>Ê
operazione si chiama swap in).

Caso 2: in memoria centrale non ci sono blocchi liberi.


In questo caso, prima di caricare la pagina e quindi poter effettuare tutte le operazioni del
punto precedente, il Sistema Operativo deve scegliere, tra tutte le pagine presenti in memo-
ria centrale quale trasferire in memoria di massa per liberare un blocco (questa operazione
si chiama swap out). Per scegliere quale sarà la pagina “vittima”, il Sistema Operativo deve
seguire una politica di gestione definita negli “algoritmi di rimpiazzamento” che hanno
notevole importanza per l’efficienza del sistema.
Dato che le operazioni di swap comportano dei trasferimenti di pagine da memoria di
massa a memoria centrale e viceversa, sono molto costose in termini di tempo perché
interessano le periferiche che operano in tempi ben più lunghi rispetto all’unità centrale. È
quindi opportuno scegliere come pagina “vittima” una che, presumibilmente, non servirà
per lungo tempo.

● 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.

88 Unità 3 Il Sistema Operativo come gestore di risorse


● Svantaggi
Gli svantaggi della gestione della memoria tramite richiesta di pagina sono i seguenti:
UÊ ÃˆVVœ“iÊ«iÀʜ}˜ˆÊˆ˜`ˆÀˆââœÊ}i˜iÀ>̜ÊmʘiViÃÃ>ÀˆœÊ>VVi`iÀiÊ>>ÊÌ>Li>Ê`iiÊ«>}ˆ˜iÊ«iÀÊ
il calcolo dell’indirizzo fisico, i tempi di accesso per ogni indirizzo sono praticamente
raddoppiati rispetto a una gestione senza paginazione;
UÊ Õ˜½iVViÃÈÛ>ʜVVÕ«>∜˜iÊ`ˆÊ“i“œÀˆ>Ê`>Ê«>ÀÌiÊ`iiÊÌ>Li>Ê`iiÊ«>}ˆ˜iÆÊ
UÊ Ãiʏ>ÊÃViÌ>Ê`i>Ê«>}ˆ˜>ʘœ˜ÊmÊv>ÌÌ>ʈ˜Ê“œ`œÊœVՏ>̜ʫœÌÀiLLiÊÃÕVVi`iÀiÊV…iʜ}˜ˆÊ«>}ˆ˜>Ê
caricata generi un page fault, causando un tipico problema di trashing.

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.

verifica le tue conoscenze


1 Che cosa si intende per swap in e swap out ? In che il Sistema Operativo deve memorizzare un’ulteriore
modo il Sistema Operativo riduce le operazioni di informazione: quale?
swap out?
3 In che cosa consiste il fenomeno del trashing?
2 Quando è richiamato l’algoritmo LRU? Quale pagina è
scelta come vittima? Per implementare tale algoritmo 4 Definisci il Working Set.

Lezione 5 Memoria virtuale a richiesta di pagine 89


3 lezione
UNITÀ
Gestione della memoria virtuale
6 per segmentazione

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
.......................
.......................

figura 1 Segmentazione di un programma

La corrispondenza fra indirizzo relativo e locazioni fisiche di memoria centrale (indirizzo


assoluto) è stabilita attraverso l’indicazione del segmento. Ogni indirizzo relativo è formato
da due parti: numero del segmento e numero di byte all’interno del segmento (displacement)
(figura 2).
Quando è richiesta l’esecuzione di un programma inizialmente viene caricato in memoria
centrale solo il segmento che contiene il programma principale (MAIN). Ogni volta che

90 Unità 3 Il Sistema Operativo come gestore di risorse


NUMERO DISPLACEMENT
SEGMENTO

figura 2 Indirizzo relativo

durante l’esecuzione viene fatto riferimento a un sottoprogramma o a una struttura dati


contenuti in un altro segmento, questo viene caricato dalla memoria di massa alla memoria
centrale (dynamic loading) e in questo momento avviene il collegamento con il segmento
che lo ha richiamato (dynamic linking).

Tramite la tabella dei segmenti il gestore della memoria conosce, in ogni istante, la situazione
dei segmenti del programma in esecuzione:

tabella dei segmenti


n. segm. dimensione stato indirizzo

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.

In figura 3 è rappresentata una possibile situazione quando è in esecuzione il program-


ma PGM1 suddiviso in 3 segmenti.
I vantaggi principali della gestione con la segmentazione sono i seguenti:
UÊ iˆ“ˆ˜>Ê >Ê vÀ>““i˜Ì>∜˜iÊ “ÕœÛi˜`œÊ ˆÊ Ãi}“i˜ÌˆÊ ˆ˜Ê >ÀiiÊ `i>Ê `ˆ“i˜Ãˆœ˜iÊ iÃ>ÌÌ>]Ê ÃˆÊ
elimina il problema dei frammenti inutilizzabili, grazie anche al compattamento perio-
dico;
UÊ «iÀ“iÌÌiÊ >Ê VÀiÃVˆÌ>Ê `ˆ˜>“ˆV>Ê `iÊ Ãi}“i˜Ìœ\Ê ˜iÊ V>ÃœÊ ˆ˜Ê VÕˆÊ ˆÊ Ãi}“i˜ÌœÊ ÃÕLˆÃV>Ê `iiÊ
modifiche di dimensione, non si presentano problemi poiché la dimensione del segmen-
to non è definita a priori, contrariamente alla paginazione;
UÊ v>VˆˆÌ>ʏ>ÊVœ˜`ˆÛˆÃˆœ˜iÊ`iˆÊÃi}“i˜Ìˆ\ʏ>ÊÃÕ``ˆÛˆÃˆœ˜iÊ`iÊ«Àœ}À>““>Êmʏœ}ˆV>Êiʘœ˜ÊvˆÃˆV>Ê
è quindi possibile consentire la condivisione di alcuni segmenti che contengono funzio-
ni che possono essere utili a più programmi;
UÊ ˆÊVœ˜ÌÀœœÊ`i}ˆÊ>VViÃÈÊmÊ«ˆÙÊÀˆ}œÀœÃœ\ʏ½>VViÃÜÊ>ʜ}˜ˆÊÃi}“i˜ÌœÊmÊVœ˜ÌÀœ>̜Æ
UÊ ˆÊˆ˜Žˆ˜}ÊiʈÊœ>`ˆ˜}ÊܘœÊ`ˆ˜>“ˆVˆ\ʈʫÀœ}À>““ˆÊۜÕ“ˆ˜œÃˆÊiÊVœ“«iÃÈʫœÃܘœÊiÃÃiÀiÊ
composti da centinaia di procedure e funzioni distinte. Poiché è costoso linkarle e cari-

Lezione 6 Gestione della memoria virtuale per segmentazione 91


SPAZIO DEGLI INDIRIZZI
PROGRAMMA PGM1 MEMORIA CENTRALE

SO
SEGMENTO 1

180k

SEGMENTO 2
280k

300k

340k
SEGMENTO 3

Tabella dei segmenti


N. DIM. STATO IND.
1 100 1 180
2 150 0 /
3 40 1 300

figura 3 Processo di modellizzazione

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ÊÌiV˜ˆV…iÊ«iÀÊÀˆ`ÕÀÀiʈÊÃi}“i˜ÌÊv>ՏÌÊܘœÊ«ˆÙÊVœ“«iÃÃiÊ`i½iµÕˆÛ>i˜Ìiʘi>Ê}iÃ̈œ‡
ne paginata.

● Gestione con pagine e segmenti


Si può usare una tecnica combinata fra pagine e segmenti che permette di ridurre alcuni
degli inconvenienti presenti nelle due tecniche considerate separatamente.
Le due tecniche si possono combinare considerando i segmenti composti da più pagine e
invece di pensare a un segmento come a un singolo blocco di memoria, lo si suddivide
logicamente in pagine di dimensioni prefissate. La memoria è divisa in blocchi aventi la
stessa dimensione delle pagine.

92 Unità 3 Il Sistema Operativo come gestore di risorse


SPAZIO DEGLI INDIRIZZI MEMORIA CENTRALE
PROGRAMMA PRG1
PAGINA 1
SO
PAGINA 2
SEGMENTO 1

PAGINA 4
PAGINA 1
PAGINA 2

SEGMENTO 2

figura 4 Gestione combinata pagine e segmenti

In figura 4 è mostrato un esempio di gestione combinata fra pagine e segmenti.


La corrispondenza fra indirizzo relativo e locazioni fisiche di memoria centrale (indirizzo
assoluto) è stabilita attraverso l’indicazione del segmento, del numero di pagine all’interno
del segmento e dal numero di byte all’interno della pagina, come illustrato in figura 5.
Inoltre il Sistema Operativo deve gestire due tipi diversi di interruzione che possono
avvenire: mancanza del segmento in memoria (segment fault) e mancanza di pagina (page
fault).
I vantaggi e gli svantaggi sono insieme, quelli della paginazione e della segmentazione.
Il meccanismo della segmentazione paginata è abbastanza efficiente e flessibile con un
buon livello di protezione degli accessi ma è piuttosto gravosa la gestione da parte del SO.
Come particolare svantaggio si ha la ricomparsa della frammentazione.

INDIRIZZO
NUMERO NUMERO
SEGMENTO PAGINA DISPLACEMENT

figura 5 Calcolo degli indirizzi assoluti

verifica le tue conoscenze


1 Qual è la differenza tra la paginazione e la 3 Quali sono i principali problemi che la gestione della
segmentazione? memoria con la segmentazione presenta?
2 Illustra la gestione virtuale segmentata. 4 Illustra la gestione virtuale segmentata-paginata.

Lezione 6 Gestione della memoria virtuale per segmentazione 93


3
UNITÀ lezione

7 Gestione delle periferiche

● Collegamento fra CPU e periferiche


Il collegamento fra unità centrale e periferiche avviene tramite interfacce nei casi più sem-
plici o tramite elaboratori di canale nei casi più complessi.
Nei sistemi di elaborazione l’accesso ai dispositivi periferici avviene tramite i “device driver”
cioè attraverso dei moduli software che fanno da interfaccia fra il SO e i dispositivi.
Ogni dispositivo periferico ha il suo device driver. Nei sistemi multiprogrammati può capi-
tare che più processi richiedano di accedere a uno stesso dispositivo o che tale dispositivo
non sia disponibile al momento della richiesta. I device driver, presenti in ogni SO non sono
concepiti per risolvere tali problemi. Un SO deve quindi prevedere una serie di moduli sof-
tware, affiancati ai device driver, per implementare una politica di gestione delle periferiche.

● 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.

94 Unità 3 Il Sistema Operativo come gestore di risorse


Per controllare queste attività all’interfaccia è associata una unità di controllo il cui compito
è quello di:
UÊ }i˜iÀ>ÀiʈÊÃi}˜>ˆÊ`ˆÊVœ˜ÌÀœœÊV…iÊÃiÀۜ˜œÊ>Êv>ÀÊv՘∜˜>Àiʏ>Ê«iÀˆviÀˆV>Ê­«iÀÊ՘>ÊÃÌ>“‡
pante, per esempio, per far avanzare la carta o spostare il carrello);
UÊ “i“œÀˆââ>ÀiʏœÊÃÌ>̜Ê`i>Ê«iÀˆviÀˆV>Ê­ˆLiÀœÉœVVÕ«>̜®Æ
UÊ }i˜iÀ>ÀiʈÊÃi}˜>ˆÊ`ˆÊˆ˜ÌiÀÀÕ∜˜iÊ«iÀÊ>ÛÛiÀ̈Àiʏ>Ê
*1ÊV…iʏ>Ê«iÀˆviÀˆV>ʅ>ÊVœ˜VÕÜʏ>Ê
sua operazione;
UÊ Vœ˜ÌÀœ>ÀiÊ V…iÊ ˆÊ ÌÀ>ÃviÀˆ“i˜ÌœÊ `iiÊ ˆ˜vœÀ“>∜˜ˆÊ `>>Ê «iÀˆviÀˆV>Ê >½Õ˜ˆÌDÊ Vi˜ÌÀ>iÊ iÊ
viceversa avvenga senza errori (figura 2).

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

figura 2 Collegamento tramite interfaccia

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.

Affinché l’elaboratore di canale sia in grado di eseguire in modo autonomo le operazioni di


I/O è necessario che la CPU gli comunichi alcune informazioni e precisamente:

UÊ il tipo di operazione da svolgere (input oppure output);


UÊ l’indirizzo di memoria centrale dal quale iniziare il trasferimento dei dati;
UÊ l’ordine di esecuzione (istruzione SIO: Start Input Output);
UÊ l’indirizzo dell’unità periferica gestita dal canale e sulla quale avverrà l’operazione.

Lezione 7 Gestione delle periferiche 95


Nei centri di medie e grandi dimensioni dove è elevato il numero di periferiche da con-
trollare, per aumentare l’efficienza del sistema, un canale può controllare più periferiche,
e nello stesso momento una periferica può essere gestita da diversi canali (figura 3).

canale1 unità disco1

unità nastro1

CPU canale2

unità disco2

canale3
unità nastro2

figura 3 Collegamento tra CPU e canali

In un sistema organizzato come in figura 3 se l’unità disco2 impegna il canale3, l’unità


nastro2 può eseguire la sua operazione utilizzando il canale1.

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˜ÌˆvˆV>̈ۜʫiÀˆviÀˆV>Æ
UÊ ÃÌ>̜Ê`i>Ê«iÀˆviÀˆV>Ê­ˆLiÀœÉœVVÕ«>̜®Æ
UÊ ˆÃÌ>Ê`i}ˆÊˆ`i˜ÌˆvˆV>̈ۈÊ`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˜ÌˆvˆV>̈ۜÊ`iÊV>˜>iÆ
UÊ ÃÌ>̜Ê`iÊV>˜>iÊ­ˆLiÀœÉœVVÕ«>̜®Æ
UÊ ˆÃÌ>Ê`i}ˆÊˆ`i˜ÌˆvˆV>̈ۈÊ`iiÊ«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.

96 Unità 3 Il Sistema Operativo come gestore di risorse


Al momento di una richiesta di operazione di I/O il Device Management deve scegliere
il percorso da effettuare individuando un canale libero collegato alla periferica richiesta,
aggiornare i descrittori di canale e di periferica e attivare l’operazione di trasferimento con
l’istruzione Start Input Output. Al termine dell’operazione l’elaboratore di canale invia
una richiesta di interruzione alla CPU. La routine di gestione di questa interruzione deve
prevedere, fra l’altro, l’aggiornamento dei descrittori (stato del canale nella CCB = ‘libero’,
stato della periferica nella UCB = ‘libero’).

verifica le tue conoscenze


1 Quali sono le funzioni del Device Management? 3 Quali sono le componenti del descrittore
di canale?
2 Quali sono le componenti del descrittore
di periferica? 4 Quali sono i compiti dell’unità di controllo?

Lezione 7 Gestione delle periferiche 97


3 lezione
UNITÀ
Tecniche per la gestione
8 delle periferiche

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.

98 Unità 3 Il Sistema Operativo come gestore di risorse


Il processo ha la sensazione di avere a disposizione un dispositivo dedicato e si comporta
come se stesse trasferendo i dati direttamente a una periferica reale.
L’operazione di scrittura sulla stampante corrisponde a un’operazione di scrittura sul disco
che, essendo una periferica condivisa, può essere ripartita fra i vari processi. Quando termi-
na il processo che ha utilizzato la periferica virtuale, tutte le informazioni presenti sul disco
possono essere trasferite, senza interruzione, sul periferico reale. La tecnica di associazione
fra periferici virtuale e periferici reali viene chiamata tecnica di SPOOLÊ ­SimultaneousÊ
PeripheralÊOperation OnÊLine) o spooling; il periferico virtuale è detto disco di SPOOL.

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

figura 1 Uso di dispositivi virtuali

verifica le tue conoscenze


1 Illustra la gestione con il metodo dei dispositivi 3 Illustra la gestione con il metodo dei dispositivi
dedicati. virtuali.
2 Illustra la gestione con il metodo dei dispositivi 4 Spiega come avviene l’utilizzo dell’area di SPOOL.
condivisi.

Lezione 8 Tecniche per la gestione delle periferiche 99


3
UNITÀ lezione

9 Gestione delle informazioni

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Ê ÌÕÌÌˆÊ ˆÊ vˆiÊ «ÀiÃi˜ÌˆÊ ÃՏ>Ê “i“œÀˆ>Ê `ˆÊ “>ÃÃ>Ê Ṏˆââ>˜`œÊ œ««œÀÌ՘iÊ Ì>LiiÊ
memorizzate sulla memoria di massa stessa;
UÊ >ÃÃi}˜>Àiʏ½ÕÜÊ`ˆÊ՘ÊvˆiÊvœÀ˜i˜`œÊ>}ˆÊÕÌi˜ÌˆÊ“iVV>˜ˆÃ“ˆÊ`ˆÊ«ÀœÌi∜˜iÊÃՏ½>VViÃÜÆ
UÊ }iÃ̈Àiʈ˜Ê“œ`œÊœÌ̈“>iʏœÊë>∜Ê`ˆÃ«œ˜ˆLˆiÊÃՏ>ʓ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).

Interfaccia del file system

file system virtuale

FS locale 1 FS locale 2 FS locale i FS remoto

PR3 1
DISCO DISCO 2 DISCO i RETE

figura 1 File system virtuale

100 Unità 3 Il Sistema Operativo come gestore di risorse


● Directory
Per catalogare i file presenti sulla memoria di massa, il file system utilizza un file (file directory)
memorizzato anch’esso sulla memoria di massa in una posizione fissa e conosciuta al Sistema
Operativo (normalmente sulla traccia 0), che contiene le informazioni riguardanti tutti i
file presenti sul supporto. Per ogni file viene inserito un record nella directory che contiene
queste informazioni:

ID-file lung. rec. n. rec. indirizzo accesso creazione modifica

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

Solo la directory simbolica è caricata in memoria centrale: attraverso l’identificativo (ID)


sono reperite tutte le informazioni presenti nella directory di base.

In un grosso sistema di elaborazione, in cui possono essere presenti numerosi archivi,


la directory può richiedere molta memoria: per questo si tiene in memoria centrale una

Lezione 9 Gestione delle informazioni 101


versione ridotta, contenente solo le voci per i file usati dai processi in esecuzione. Le voci
della directory allocata in memoria di massa sono portate nella tabella dei file aperti con
l’operazione di apertura del file (open) e vengono cancellate dalla memoria centrale quando
il file non serve più (close).

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 1 SOTTODIRECTORY N FILE 1

SOTTODIRECTORY

FILE 2 FILE N

figura 2 Struttura ad albero delle directory

● 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

102 Unità 3 Il Sistema Operativo come gestore di risorse


gli stipendi dei dipendenti di un’azienda: solo un utente responsabile potrà avere l’accesso
in scrittura per modificare lo stipendio dei dipendenti, tutti gli altri utenti avranno solo
l’accesso in lettura o addirittura accesso vietato.

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:

utente1 utente2 utente3 utente4

FILE1 R R R R
FILE2 R/W R/W N R
FILE3 R/W R R/W R

Nella matrice R = solo lettura, R/W =lettura e scrittura, N = accesso negato

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.

verifica le tue conoscenze


1 Quali sono le funzioni del file system? 3 Spiega come vengono usate le directory.
2 Elenca e descrivi i principali moduli del file system. 4 Descrivi i principali meccanismi di protezione dei file.

Lezione 9 Gestione delle informazioni 103


3
UNITÀ lezione

10 Allocazione dello spazio su disco

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Ê`ˆÊLœVVœ è il numero di record logici contenuti in un record fisico.
I record di un file possono essere (figura 1):
UÊ ÃLœVV>̈ se ogni record fisico contiene un solo record logico (fattore di blocco = 1);
UÊ LœVV>̈ se ogni record fisico contiene più di un record logico (fattore di blocco > 1)
UÊ “Տ̈LœVVœ se occorrono più record fisici per memorizzare un record logico (fattore di
blocco minore di < 1).

A) RECORD 1 RECORD 2 RECORD 3

GAP GAP GAP

B) RECORD 1 RECORD 2 RECORD 3 RECORD 4

GAP GAP

C) RECORD 1 RECORD 1

GAP GAP
A) record sbloccati B) record bloccati C) record multiblocco

figura 1 Tipi di record di un file

● 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.

104 Unità 3 Il Sistema Operativo come gestore di risorse


Nella FAT per ogni file sono memorizzati il settore di partenza, la dimensione in byte e
altre informazioni che possono variare da un file system a un altro.
Esistono varie versioni di FAT e in base a quanti bit sono allocati per numerare i blocchi
del disco si avrà: FAT12, FAT16, FAT32. Un’unità FAT può essere divisa in quattro aree:
area riservata, tabella di allocazione dei file, directory radice e area dei file.
Il file system quando effettua le operazioni di lettura, scrittura, cancellazione e inserimento 6
di un file modifica o aggiunge una riga nella FAT.
La FAT viene memorizzata dal Sistema Operativo su disco e, durante l’elaborazione, viene 5 10
trasferita nella RAM.
8

● 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

figura 3 Allocazione per indice

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

i blocchi 1,2,4,8,9,10,11 sono liberi

Lezione 10 Allocazione dello spazio su disco 105


●Politiche per la gestione
delle operazioni di I/O su disco
Le due misure più significative delle prestazioni di un disco sono:
Il tempo d’accesso TI/O = TSEEK + TLATENZA + TTRASFERMENTO, dove
UÊ /SEEK è il tempo di ricerca, cioè il tempo necessario affinché il braccio sposti le testine
sulla traccia contenente il blocco desiderato;
UÊ /LATENZA è la latenza di rotazione, cioè il tempo necessario perché il disco ruoti finché il
settore richiesto si trovi sotto la testina;
UÊ /TRASFERMENTO è il tempo necessario per la lettura o scrittura del blocco.
L’ampiezza di banda cioè il numero totale di byte trasferiti diviso il tempo totale di tra-
sferimento.
Se le richieste di operazioni di lettura e scrittura sul disco non possono essere soddisfatte
subito, vengono messe in una coda relativa al dispositivo e verranno schedulate.
Per mezzo dello scheduling delle richieste di I/O è possibile migliorare sia il tempo di
accesso sia l’ampiezza di banda.
Esistono diversi tipi di politiche di scheduling:
UÊ FCFS (First Come First Served): si servono le richieste in ordine di arrivo senza ottimiz-
zazioni. Garantisce equità tra processi ma non una buona velocità di servizio.
Per esempio se le richieste di accesso pervenute coinvolgono rispettivamente le seguenti
tracce: 100 170 25 122 15 130 77 81, e la testina si trova sulla traccia 52,
si avrà la sitazione di figura 4:

15 25 52 77 81 100 122 130 170

figura 4 Scheduling FCFS

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.

15 25 52 77 81 100 122 130 170

figura 5 Scheduling SSTF

106 Unità 3 Il Sistema Operativo come gestore di risorse


UÊ SCAN (scheduling per scansione o dell’ascensore): il braccio dell’unità parte da un estre-
mo del disco e si sposta nell’estremo opposto servendo tutte le richieste fino a che rag-
giunge l’altro estremo o fino a esaurimento delle richieste, dopodichè riparte invertendo
la marcia. Questa politica non è ottimale e non è omogenea nel rispondere alle richieste
poiché quando la testina raggiunge un estremo inverte la rotta servendo ancora i cilindri
appena serviti mentre le richieste all’estremo opposto devono attendere più tempo. Con
questo algoritmo si avrà, per l’esempio precedente la situazione di figura 6.

15 25 52 77 81 100 122 130 170

figura 6 Scheduling SCAN

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.

15 25 52 77 81 100 122 130 170

figura 7 Scheduling C-SCAN

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.

verifica le tue conoscenze


1 Spiega come avviene l’allocazione a blocchi 3 Descrivi la politica di scheduling SSTF.
concatenati. 4 Descrivi la politica di scheduling C-SCAN.
2 Spiega come avviene l’allocazione per indici. 5 Descrivi la politica di scheduling FCFS.

Lezione 10 Allocazione dello spazio su disco 107


unità

3 sintesi

lezione 1 Gestione della memoria centrale


Lo spazio degli indirizzi di un programma in memoria centrale formata dalla zona dati
e zona istruzioni. Gli indirizzi si suddividono in quattro categorie: indirizzi simbolici,
logici, virtuali e fisici. La traduzione da indirizzi virtuali in fisici si dice rilocazione, che
può essere statica o dinamica. I moduli del Sistema Operativo della gestione della me-
moria è detto Memory Management.

lezione 2 Allocazione a partizioni statiche


La metodologia di allocazione della memoria può essere statica o dinamica. Nei sistemi
monoprogrammati si usa l’allocazione a singola partizione, mentre nei sistemi multipro-
grammati un primo metodo è quello delle partizioni statiche; metodo che presenta lo
svantaggio della frammentazione interna, cioè parte della singola partizione inutilizzabile.

lezione 3 Allocazione a partizioni dinamiche


Uno dei metodi usati è quello delle partizioni dinamiche, che non generano frammenta-
zione interna ma esterna. Per ridurre il problema il gestore può usare una delle seguen-
ti politiche: First Fit, Best Fit. Ma per eliminare la frammentazione si può ricorrere alla
compattazione, possibile solo se i programmi sono rilocabili.

lezione 4 Allocazione non contigua


Un’ulteriore possibilità di allocazione della memoria è quella non contigua, come la pa-
ginazione. Con la paginazione la memoria è suddivisa in blocchi, tutti della stessa di-
mensione, e lo spazio degli indirizzi fisici di un programma in pagine. Si elimina così il
fenomeno della frammentazione.

lezione 5 Memoria virtuale a richiesta di pagine


La memoria virtuale usa come supporto alla memoria centrale, la memoria di massa do-
ve sono parcheggiati le parti di lavori che non devono essere eseguite. La gestione della
memoria virtuale può essere fatta con la paginazione suddividendo tutto il programma
in pagine e la memoria centrale in blocchi. Se sono necessari molti rimpiazzamenti di
pagine (pagefault) si ha il fenomeno del trashing. Gli algoritmi di rimpiazzamento più
usati sono: FIFO, LRU e NRU.

108 Unità 3 Il Sistema Operativo come gestore di risorse


unità

lezione 6 Gestione della memoria virtuale per


segmentazione
Nella memoria virtuale basata sulla segmentazione il programma viene diviso in por-
zioni, dette segmenti in base a un criterio logico. Con tale metodo si hanno i seguenti
vantaggi: elimina la frammentazione, permette la crescita dinamica del segmento, faci-
lita la condivisione dei segmenti, il controllo degli accessi è più rigoroso, il linking e il
loading sono dinamici. Si può anche usare la combinazione tra paginazione e segmen-
tazione che presenta i vantaggi sia della paginazione che della segmentazione.

lezione 7 Gestione delle periferiche


Il collegamento fra unità centrale e periferiche avviene tramite interfacce ed elaboratori
di canale. Nei sistemi di elaborazione l’accesso ai dispositivi periferici avviene tramite
i “device driver” cioè attraverso dei moduli software che fanno da interfaccia fra il SO
e i dispositivi, e tramite politiche di gestione delle periferiche. La gestione delle perife-
riche è svolta dal Device Manager che utilizza due descrittori: Unit Control Block e il
Channel Control Block.

lezione 8 Tecniche per la gestione delle periferiche


In base alle caratteristiche hardware delle periferiche, esse possono essere assegnate ai
processi secondo le seguenti modalità: dedicato, condiviso e virtuale. La tecnica di as-
sociazione fra periferici virtuali e periferici reali viene chiamata tecnica di spooling e il
periferico virtuale è detto disco di SPOOL.

lezione 9 Gestione delle informazioni


L’insieme dei programmi del Sistema Operativo preposto alla gestione delle informazioni
memorizzate sulle memorie di massa costituisce il file system, che consente all’utente
di utilizzare gli archivi memorizzati su memoria di massa senza preoccuparsi dell’effet-
tiva modalità di memorizzazione. Un generico file system può essere composto dai se-
guenti moduli software: file system simbolico, di base, logico e fisico. Per catalogare i
file presenti sulla memoria di massa si usano le directory.

lezione 10 Allocazione dello spazio su disco


Le due misure più significative delle prestazioni di un disco sono: il tempo di acces-
so e l’ampiezza di banda. I principali tipi di politiche di scheduling sono: First Come
First Served, Shortest Seek Time First, SCAN (scheduling per scansione), C-SCAN (per
scansione circolare).

Unità 3 Il Sistema Operativo come gestore di risorse 109


unità

3 domande per l’orale

unità 3 Il Sistema Operativo come gestore della memoria


Ripasso MP3
1 Analizza i quattro tipi di indirizzi di un programma.

➞ L1

2 Descrivi la tecnica dell’allocazione della memoria a partizioni statiche.

➞ L2

3 Confronta le politiche di assegnazione della memoria First Fit e Best Fit.

➞ L3

4 Descrivi la tecnica dell’allocazione della memoria paginata.

➞ L4

5 Descrivi la gestione della memoria virtuale a richiesta di pagine.

➞ 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

9 Spiega il ruolo delle directory simbolica e di base.

➞ L9

10 Anche basandoti su di un esempio, descrivi la politica di scheduling SCAN.

➞ L10

110 Unità 3 Il Sistema Operativo come gestore di risorse


unità
in English, please 3
Abstract
THE OPERATING SYSTEM AS MEMORY MANAGEMENT
Main memory has a limited capacity: if several programmes need to be resident in
memory, the operating system needs to use special techniques to be able to share the
memory among the demands made on it.
The techniques most commonly used in monoprogramming and multiprogramming
are: partition, page based and techniques using the virtual memory.
There are various ways of connecting the CPU and peripheral devices, interfaces
and channel-connected processors and there are various management techniques
depending on whether the peripherals devices are dedicated, shared or virtual.
An operating system aims to resolve the problems that a computer needs to tackle
in order to manage the information stored in mass memories, such as the filing and
protection of files, the allocation of files to supports and the assignment of free space.

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

Unità 3 Il Sistema Operativo come gestore di risorse 111


unità

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.

112 Unità 3 Il Sistema Operativo come gestore di risorse


Unità
Programmazione concorrente
4
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 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.

Accertamento dei prerequisiti


1 Elenca le principali transizioni tra i vari stati che 6 Nello stato di ready il processo possiede la CPU.
può assumere un processo, specificando quando V F
si verificano.
7 Un processo è un programma in esecuzione.
2 Indica le principali risorse di un sistema V F
informatico.
8 Il PID è l’identificatore di un programma.
3 Sintetizza il concetto di multiprogrammazione. V F
4 Descrivi i compiti del nucleo, come gestore di 9 Se durante l’esecuzione il processo richiede una
processi. operazione di I/O, esso viene portato nello stato
di wait. V F
5 Lo schedulatore dei processi decide a quale dei
processi viene assegnato il programma. 10 Il time slice è la quantità di tempo assegnato
V F a un processo. V F
4 lezione
UNITÀ
Introduzione alla programmazione
1 concorrente

● 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.

Il termine programmazione concorrente indica l’insieme di tecniche e strumenti impiegati


per descrivere il comportamento di più attività o processi che si intende far eseguire con-
temporaneamente in un sistema di calcolo.

A tale scopo ricordiamo alcuni concetti fondamentali già esposti in precedenza.


Programma: è un insieme statico di istruzioni, cioè un’entità passiva, che descrive le azioni
da compiere.
Processo: è un’entità attiva che rappresenta l’esecuzione delle azioni specificate dal pro-
gramma; un processo in esecuzione avanza il proprio stato.
Processore: è un dispositivo che consente l’evoluzione e il completamento di un processo
(la CPU). In multiprogrammazione ogni utente ha l’impressione di lavorare con un suo
processore virtuale.
Thread: è un segmento di istruzioni di un processo in esecuzione. Un processo è un insie-
me di thread che rappresentano il suo codice eseguibile. Un processo è composto come
minimo da un thread, ma normalmente a ogni processo ne vengono associati più di uno
in base alle capacità di avanzamento concorrente di ciascuno.
Risorse del sistema: è un qualsiasi elemento hardware o software che viene usato da un
processo e che ne condiziona la creazione o l’avanzamento.

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).

Naturalmente il Sistema Operativo (SO) deve prevedere:


UÊ Õ˜Ê}iÃ̜ÀiÊ`i>ÊÀˆÃœÀÃ>Æ
UÊ Õ˜Ê«ÀœÌœVœœÊ`ˆÊ>VViÃÜÊ>>ÊÀˆÃœÀÃ>\
– richiesta e ottenimento della risorsa;
– utilizzo della risorsa;
– rilascio della risorsa.
I programmi si possono classificare in sequenziali e concorrenti: nel primo caso, l’esecuzio-
ne di un programma dà luogo a un singolo processo, infatti svolge una sola istruzione alla
volta sulla base di un programma sequenziale; nel secondo caso, dà luogo a più processi

114 Unità 4 Programmazione concorrente


che competono tra loro per l’uso delle risorse del sistema, infatti vengono eseguite più
istruzioni contemporaneamente.
Da un punto di vista funzionale non vi è differenza tra i due tipi di programmazione: tutto
ciò che può essere realizzato da un programma concorrente può anche essere realizzato da
un programma sequenziale. Dal punto di vista della produttività, invece, i programmi con-
correnti sono, solitamente, più efficienti di quelli sequenziali, specialmente su macchine
dotate di più processori.
Oltre a originare più processi, i programmi concorrenti devono fare in modo che i vari
processi si sincronizzino tra loro in modo corretto.
Abbiamo quindi una serie di buone motivazioni per effettuare una programmazione con-
corrente:
UÊ “ˆ}ˆœÀ>Àiʏ>ÊVœ“«Ài˜Ãˆœ˜iÊ`ˆÊ՘Ê-"ÊV…iÊ}iÃ̈ÃViÊ«ˆÙÊ>Ì̈ۈÌDÊ«>À>iiÆ
UÊ ÃvÀÕÌÌ>ÀiʏiÊ«ÀiÃÌ>∜˜ˆÊœÌÌi˜ˆLˆˆÊ`>Ê>ÀV…ˆÌiÌÌÕÀiʓՏ̈‡«ÀœViÃÜÀÆ
UÊ “ˆ}ˆœÀ>ÀiÊ >Ê }iÃ̈œ˜iÊ `ˆÊ >««ˆV>∜˜ˆÊ Vœ“i\Ê ÃiÀÛiÀ]Ê ÀœLœÌˆV>]Ê }ˆœV…ˆÊ iÊ Ãˆ“Տ>∜˜ˆÊ `ˆÊ
attività concorrenti.

● 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

figura 2 Comunicazione tra processi

Si ha quindi la necessità di meccanismi e politiche che permettano ai processi di scambiarsi


informazioni per poter lavorare in modo cooperativo al fine di trasferire e condividere in-
formazioni.

Lezione 1 Introduzione alla programmazione concorrente 115


Alcuni esempi sono:
UÊ processi cooperanti;
UÊ client-Server;
UÊ compilatore-assemblatore-loader;
UÊ produttore-consumatore.

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.

● Creazione ed eliminazione di processi


Le chiamate di sistema per la creazione dinamica di processi differiscono per quanto riguar-
da lo spazio degli indirizzi e, in generale, per i diritti d’accesso del nuovo processo alle varie
risorse del sistema. Il loro uso dipende dalla tipologia del Sistema Operativo da realizzare.
Un processo padre è un processo che ha creato uno o più processi figli; ogni processo può
creare molti processi figli ma può avere solo un processo padre.
Quando l’esecuzione di un processo incontra un punto in cui può essere eseguito un altro
processo in maniera parallela, il SO esegue la primitiva fork e genera un processo “figlio”
che avanzerà indipendentemente dal padre. Il processo padre controlla il completamento
del processo figlio con la primitiva join (figura 3).
Nel caso più semplice, il processo figlio condivide le risorse che possiede il processo padre.
Fork e kill sono primitive per la cre-
azione e la terminazione di processi. Per eseguire una fork il nucleo preleva, dai parametri associati alla chiamata, le informazio-
ni necessarie (per esempio, il nome del nuovo processo e l’indirizzo della prima istruzione
da eseguire) e crea un nuovo processo che pone nello stato di pronto.
Esistono altre chiamate di sistema come la elimina processo (kill), che consente di elimi-
nare processi esistenti.

Processo P1 padre Processo P2 figlio

Inizio Inizio
….. ….
Fork ….
P2 ….
….. fine
…..
Join
P2
…..
fine

figura 3 Creazione e controllo di un processo figlio

Il processo padre continua la sua esecuzione fino a quando incontra la primitiva join attra-
verso la quale verifica la conclusione del processo figlio.

● Esecuzione concorrente di processi


I processi (come per esempio il padre e il figlio) possono essere eseguiti in parallelo. Il
parallelismo può essere reale in presenza di più processori (multiprocessing) o virtuale
per effetto della multiprogrammazione.
Comunque quando due processi sono eseguiti in parallelo devono per forza cooperare, se
devono scambiarsi dei dati, o competere, se richiedono l’uso di risorse comuni che non
possono essere usate contemporaneamente.

116 Unità 4 Programmazione concorrente


Per poter cooperare, i processi concorrenti devono:
UÊ Vœ“Õ˜ˆV>ÀiÆÊ
UÊ Ãˆ˜VÀœ˜ˆââ>ÀȰ
Per comunicazione intendiamo lo scambio di messaggi tra processi, come per esempio nei Sistema distribuito
sistemi distribuiti. Insieme di computer indipendenti
Per sincronizzazione intendiamo due processi che interagiscono per la soluzione di un che comunicano e possono coope-
rare per risolvere i problemi.
problema. Per esempio, un primo thread aggiorna le assenze di uno studente e un secondo
I Sistemi Operativi distribuiti
thread le stampa. Naturalmente i due thread devono essere sincronizzati per evitare, che a vengono qundi utilizzati quando più
causa dell’interazione tra i due thread sia fornito un output errato. calcolatori sono collegati tra loro
tramite una rete di comunicazione
In base al numero di processori fisici disponibili e al numero di processi esistenti, si hanno
e si vuole ottimizzare l’utilizzo delle
due modalità per farli avanzare in modo concorrente: risorse evitando che esse risiedano
UÊ ˆ˜ÌiÀi>ۈ˜}Æ in una macchina sola.
UÊ œÛiÀ>««ˆ˜}°
Se i tempi delle elaborazioni di due processi concorrenti sono completamente disgiun-
ti, si dice che il sistema avanza in interleaving, se invece i tempi delle elaborazioni di
due processi concorrenti si accavallano, si dice che il sistema avanza in overlapping
(figura 4).

PR 2

PR 1

overlapping interleaving Tempo


di CPU

figura 4 Avanzamento in overlapping e in interleaving

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.

verifica le tue conoscenze


1 Spiega la differenza tra programma, processo e thread. 4 Spiega cosa si intende con il termine cooperare e
competere.
2 Dopo aver definito il termine “risorsa”, spiega la
differenza tra quelle prerilasciabili e non.
5 Spiega la differenza tra interleaving e overlapping.
3 Quali sono i motivi che giustificano la
programmazione concorrente? 6 Quando e come vengono utilizzati i SO distribuiti?

Lezione 1 Introduzione alla programmazione concorrente 117


4
UNITÀ lezione

2 La concorrenza nella realtà

● I processi concorrenti nella realtà


Nella realtà ogni individuo effettua azioni in modo concorrente ad altri individui. Per
esempio, nel caso di un team di lavoro, più persone devono collaborare per raggiungere
obiettivi comuni e, in qualche caso può accadere che un’azione debba terminare prima che
ne inizi un’altra. Gli obiettivi si raggiungono solo se i vari componenti del team collabo-
rano tra loro.
In generale si deve:
UÊ «ˆ>˜ˆvˆV>ÀiʏiÊÛ>ÀˆiÊv>ÈÊ`ˆÊ>ۜÀœÆ
UÊ VœœÀ`ˆ˜>ÀiʏiÊ>Ì̈ۈÌDÊ`iˆÊVœ“«œ˜i˜ÌˆÊ`iÊÌi>“Æ
UÊ «Ài`ˆÃ«œÀÀiʏiÊÀˆÃœÀÃiʘiViÃÃ>ÀˆiÆ
UÊ iۈÌ>ÀiÊVœ˜vˆÌ̈ʫiÀʏ½>VViÃÜÊ>ÊiÛi˜ÌÕ>ˆÊÀˆÃœÀÃiÊVœ˜`ˆÛˆÃi°
In base alle considerazioni fatte è possibile effettuare un parallelo tra il mondo reale e un
sistema di elaborazione (figura 1).

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

figura 1 Parallelo tra mondo reale e sistema di elaborazione

118 Unità 4 Programmazione concorrente


● Analogia con il mondo reale
Se consideriamo il caso reale della costruzione di un modellino si può effettuare un paral-
lelo tra il mondo reale e un sistema di elaborazione (tabella 1).

tabella 1 Confronto tra mondo reale e sistema di elaborazione


mondo reale sistema di elaborazione
istruzioni da seguire PROGRAMMA
pezzi, viti, colla, vernice RISORSE
modellista PROCESSORE
costruzione del modello PROCESSO

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

Sfruttando queste semplici analogie si possono individuare facilmente alcune proprietà


delle risorse:

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).

verifica le tue conoscenze


1 Che cosa devono fare i componeti di un team? 3 Quali sono le proprietà delle risorse?
2 Esegui un’analogia tra mondo reale e sistema 4 Fai un esempio di risorsa consumabile e
di elaborazione. condivisibile.

Lezione 2 La concorrenza nella realtà 119


4 lezione
UNITÀ
Sincronizzazione tra processi
3 concorrenti

I sistemi multiprocessori, dotati cioè di più unità di elaborazione centrale realizzano la


vera programmazione concorrente in quanto l’esecuzione dei processi è realmente con-
temporanea. Nel caso di sistemi dotati di una sola unità di elaborazione centrale, che viene
assegnata per quantità di tempo fisse o variabili ai vari processi, la contemporaneità è vista
come possibilità che, a un determinato istante, più processi abbiano iniziato e non ancora
terminato la propria esecuzione.
Uno dei principali campi di applicazione della programmazione concorrente è costituito
dalla realizzazione dei Sistemi Operativi. Compito del Sistema Operativo è l’assegnazione
delle risorse hardware del sistema (unità di elaborazione centrale, memoria, dispositivi di
ingresso-uscita) ai vari processi utente, con l’obiettivo di un efficiente utilizzo delle risorse.
Per consentire l’esecuzione contemporanea di più programmi utente, le attività del Sistema
Operativo devono essere eseguite in modo concorrente; esse interagiscono sia indiretta-
mente nell’uso delle risorse, sia direttamente scambiando informazioni relative allo stato
delle risorse e dei programmi utente.
È possibile classificare le modalità di interazione tra processi in base a quanto essi sono
“consapevoli” uno della presenza dell’altro.
Possono esistere infatti processi totalmente “ignari” uno dell’altro, cioè processi indipen-
denti non progettati per lavorare insieme e sebbene siano indipendenti, vivano in un
ambiente comune
Per interagire i processi che competono per le stesse risorse devono sincronizzarsi nella
loro utilizzazione, sarà compito del Sistema Operativo gestire questa competizione, fornen-
do meccanismi di sincronizzazione.
Più processi interferiscono fra loro se necessitano di usufruire della stessa risorsa.
Race condition L’interferenza causa errori abbastanza gravi perché dipendenti dalla sequenza di interlea-
ving effettivamente eseguita.
Sono tutte le situazioni in cui più
processi operano su una risorsa
UÊ ½œÀ`ˆ˜iÊVœ˜ÊVՈÊÈÊ>VVi`iÊ>Ê՘>ÊÀˆÃœÀÃ>ÊVœ˜`ˆÛˆÃ>Êmʈ“«œÀÌ>˜ÌiÊ«iÀV…j]ʘiÊV>ÜÊ`ˆÊ`>̈Ê
comune. condivisi determina la consistenza dei dati (race condition).
UÊ >ÊVœ˜`ˆâˆœ˜iʈ“«œ˜iÊV…iÊ՘Ê܏œÊ«ÀœViÃÜÊ>>ÊۜÌ>ʫբʓœ`ˆvˆVÀiʈÊ`>̈°
Il Sistema Operativo deve quindi gestire questa condizione garantendo che:
UÊ ÛˆÊÈ>ʓÕÌÕ>ÊiÃVÕȜ˜i]ʘiÊÃi˜ÃœÊV…iÊÃiÊ՘ʫÀœViÃÜÊÃÌ>ÊṎˆââ>˜`œÊ՘>ÊÀˆÃœÀÃ>ʘiÃÃ՘Ê
altro processo può appropriarsene;
UÊ Õ˜Ê«ÀœViÃÜÊV…iÊۜ}ˆ>Ê>VVi`iÀiÊ>Ê՘>ÊÀˆÃœÀÃ>Ê`iLL>Ê>ÌÌi˜`iÀiÊ՘ÊÌi“«œÊvˆ˜ˆÌœÆ
UÊ ˜œ˜ÊÈÊÛiÀˆvˆV…ˆÊ>ÊVœ˜`ˆâˆœ˜iÊ`ˆÊÃÌ>œ\ÊVˆœmÊV…iÊ՘ʫÀœViÃÜÊÈÊLœVV…ˆÊˆ˜Ê>ÌÌiÃ>Ê`ˆÊ՘>Ê
risorsa che non potrà ottenere.

● 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

120 Unità 4 Programmazione concorrente


ciascuno in modo esclusivo; per esempio, un archivio di dati anagrafici che non può essere
letto da un processo mentre viene modificato da un altro che ne aggiorna i dati.
Il secondo tipo di interazione tra processi concorrenti si ha quando i processi cooperano
per svolgere uno specifico compito e tale cooperazione prevede lo scambio di informazioni
tra processi.
Per esempio, si può considerare il caso di due processi P1 e P2 che si scambiano informazioni
tramite un’area di memoria comune, per esempio un buffer. Il processo P1 in modo ciclico
produce un’informazione e la inserisce nel buffer; mentre il processo P2, sempre ciclicamen-
te, preleva l’informazione dal buffer per poterla utilizzare. Naturalmente affinché il sistema
funzioni correttamente occorre che il prelievo sia sempre preceduto dall’inserimento.

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.

Per ottenere un corretto funzionamento di un sistema di processi concorrenti interagenti


occorre quindi introdurre vincoli sull’ordine con cui sono eseguite le loro operazioni; cioè
i processi devono essere sincronizzati. In caso contrario si possono verificare problemi 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Ê “œ`ˆvˆV>̈]Ê
possano essere visti da un altro:
UÊ ÃV>“LˆœÊ`ˆÊ“iÃÃ>}}ˆÊ«iÀÊv>ÀÊÌÊV…iÊ՘ʫÀœViÃÜʫœÃÃ>ÊÌÀ>ÓiÌÌiÀiʈ˜vœÀ“>∜˜ˆÊ>Ê՘Ê>ÌÀœ°

● Mutua esclusione Mutua esclusione è il procedimento


di sincronizzazione fra processi.
Il problema della mutua esclusione tra processi concorrenti si ha quando necessariamente
un solo processo alla volta può avere accesso a un insieme di risorse comuni (figura 1).

Processo P1 Processo P2
………….. ………….
Codice P1 Codice P2
………….. ………….

Sezione critica P1 Sezione critica P2

…………. ………….
Codice P1 Codice P2
…………. ………….

Risorsa R

figura 1 Accesso a una risorsa condivisa

Lezione 3 Sincronizzazione tra processi concorrenti 121


Dati due processi P1 e P2 e una risorsa R, si deve garantire che:
UÊ ˆ˜Êœ}˜ˆÊˆÃÌ>˜ÌiÊ,ÊÈ>ʏˆLiÀ>ʜ««ÕÀiÊÀˆÃՏ̈Ê>ÃÃi}˜>Ì>Ê>Ê՘œÊ܏œÊÌÀ>Ê*1 e P2 (mutua esclu-
sione)
UÊ Vˆ>ÃV՘œÊ`iˆÊ`ÕiÊ«ÀœViÃÈʈ˜ÊiÃiVÕ∜˜iÊ`iLL>ÊÃi“«ÀiÊ«œÌiÀʜÌÌi˜iÀiʏ½ÕÜÊ`i>ÊÀˆÃœÀÃ>°Ê

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
…….. ……..

Inserimento(y): inizio Prelievo(): inizio


top=top+1; prelievo=stack[top];
stack[top]=y top=top-1
fine fine
……. ……..

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:

tempo di esecuzione processo istruzione


t0 P1 top=top+1
t1 P2 prelievo=stack[top]
t2 P2 top=top-1
t3 P1 stack[top]=y

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.

122 Unità 4 Programmazione concorrente


Per esempio nel gioco degli scacchi quando il re muovendo finisce sotto scacco e non
può muovere altri pezzi si verifica una situazione di stallo e la partita viene dichiarata
patta.
Naturalmente questa condizione, che è definitiva, è da evitare. Nei sistemi informatici il
deadlock è un problema che coinvolge tutti i processi che utilizzano un certo insieme di
risorse, se ne può uscire solo con metodi “distruttivi”, mediante l’uccisione dei processi
o riavviando la macchina.

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.

Riassumendo quanto visto sui processi si possono avere le seguenti situazioni:

tipo di processo relazione esistente tipo di meccanismo problemi verificatisi


processi con cooperazione comunicazione deadlock
conoscenza diretta (comunicazione) starvation

processi con cooperazione sincronizzazione mutua esclusione


conoscenza indiretta (condivisione) deadlock
starvation

processi ignari competizione sincronizzazione mutua esclusione


deadlock
starvation

verifica le tue conoscenze


1 Cosa si intende per processi ignari e consapevoli? 4 Che cos’è la mutua esclusione?
2 Cosa si intende per processi disgiunti e interagenti? 5 Definisci il deadlock.
3 Che cos’è la sezione critica? 6 Definisci la starvation.

Lezione 3 Sincronizzazione tra processi concorrenti 123


4 lezione
UNITÀ
Realizzazione della mutua
4 esclusione

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Ê Õ˜Êˆ˜Ãˆi“iÊ`ˆÊˆÃÌÀÕ∜˜ˆÊV…iÊ«ÀiVi`œ˜œÊ>ÊÃi∜˜iÊVÀˆÌˆV>Æ
UÊ Õ˜Êˆ˜Ãˆi“iÊ`ˆÊˆÃÌÀÕ∜˜ˆÊ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).

● Semafori e primitive di sincronizzazione


Semaforo
Nel 1968 E.W. Dijkstra ha proposto due primitive che permettono la soluzione di qualsiasi
È un dato astratto usato da un SO problema di interazione fra processi. Le due primitive wait e signal ricevono come parame-
multitasking per sincronizzare gli
tro un intero non negativo S detto semaforo.
accessi a risorse condivise.
Il valore uguale a 0 di S corrisponde al semaforo rosso, mentre un valore maggiore di zero
corrisponde al verde.
Un semaforo è quindi una variabile intera non negativa (s v 0) con valore iniziale s0 v 0.
Alla variabile è associata una lista di attesa Qs nella quale sono posti i descrittori dei pro-
cessi che attendono dal semaforo l’autorizzazione a procedere.
Un semaforo può anche essere di tipo binario, cioè è una variabile binaria. Esso è del tutto
paragonabile a un intero che può valere solo 1 oppure 0. Molto spesso un semaforo binario
assume il nome di Mutex, dato che è l’oggetto che viene utilizzato per risolvere il problema
della mutua esclusione.
Nella letteratura relativa alla pro- La modifica di un semaforo binario (passaggio da 0 a 1 e viceversa) deve essere ottenuta
grammazione concorrente si trovano invocando le primitive di wait e signal. Ricordiamo che un semaforo binario viene sempre
P e V per indicare le primitive wait inizializzato a 1 dal Sistema Operativo.
e signal; esse furono introdotte da
L’acquisizione e il rilascio di risorse in mutua esclusione può quindi avvenire attraverso un
Dijkstra e rappresentano le iniziali
delle parole olandesi (proberen = semaforo associato alla risorsa (SR):
testare e verhogen = incrementare). I processi possono quindi accedere al semaforo tramite le due primitive wait(s) e signal(s)
in questo modo:
INIZIO

WAIT (SR)

USO DI R

SIGNAL (SR)

FINE

124 Unità 4 Programmazione concorrente


Nell’acquisizione delle risorse si verifica il seguente problema: si devono effettuare due
operazioni, una per controllare lo stato del semaforo e l’altra per porre il semaforo nello
stato di occupato. Siccome queste due operazioni sono separate si potrebbe verificare la
seguente sequenza di interleaving:
UÊ Õ˜Ê«ÀœViÃÜÊ*1 controlla lo stato della risorsa e la trova libera e prima che possa occu-
parla;
UÊ Õ˜Ê «ÀœViÃÃœÊ *2 controlla lo stato della INIZIO
risorsa e la trova libera; INIZIO
UÊ ˆÊ«ÀœViÃÜÊ*2 occupa quindi la risorsa;
UÊ >˜V…iʈÊ«ÀœViÃÜÊ*1 occupa la risorsa.
Le due operazioni devono quindi esse- SR = LIBERO USO DI R SR o LIBERO
NO
re eseguite in modo indivisibile, cioè la

sequenza delle due istruzioni deve essere
eseguita in mutua esclusione. SR o OCCUPATO FINE
Si deve quindi rendere mutuamente esclu-
sivo o l’uso della risorsa R o l’accesso alla
risorsa R. ACQUISIZIONE FINE
(WAIT) RILASCIO (SIGNAL)
Vediamo a lato qualche strategia di soluzione.

● Operazioni lock(x) e unlock(x)


Si possono usare due istruzioni lock( ) e unlock( ) che rendono indivisibile la sequenza di ope-
razioni, la lock realizza le funzioni della wait mentre la unlock realizza le funzioni della signal.
La loro implementazione sarà la seguente:

LOCK(X): inizio UNLOCK(X): inizio


ripeti finché x=1; x:=1
x:=0 fine
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

La soluzione al problema della mutua esclusione tramite le operazioni di lock(x) e


unlock(x) presenta il problema dell’attesa attiva; cioè un processo che non può accedere
alla sua sezione critica tiene occupato il suo processore eseguendo ripetutamente la sequen-
za di istruzioni con la quale verifica lo stato dell’indicatore.

Lezione 4 Realizzazione della mutua esclusione 125


● Attesa attiva
L’attesa attiva conduce a elevati abbassamenti di prestazioni; per esempio se uno scheduler
ha in stato di Pronto dieci processi con altrettante sezioni critiche (SC), il primo processo
che entra in sezione critica obbligherà gli altri nove ad altrettante attese attive, abbassando
le prestazioni dell’intero sistema a 1/10 del totale.
Inoltre l’attesa attiva può portare a situazioni ancora peggiori: cioè dove il processo di sche-
dulazione di un SO preveda il cambio di contesto in base a priorità assegnate ai processi
concorrenti.

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ÃÈ]ʓœ`ˆvˆV>˜`œÊ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).

126 Unità 4 Programmazione concorrente


La TestAndSet è quindi un’istruzione macchina (dunque con comportamento atomico garan-
tito dall’hardware) che consente di testare e modificare una variabile in modo indivisibile. La
sua implementazione necessita di una particolare interfaccia verso la memoria. Il processore
deve poter avvisare l’interfaccia circa l’intenzione di compiere più cicli di accesso alla memo-
ria senza rilasciarne il controllo, anche in presenza di un sistema multiprocessore.
<richiesta>: LOCK(X): inizio
cicla inizio
TestAndSet(X);
se (X era 1) exit; // aspetta il verde
<ritardo>
fine
//qui il semaforo è già a rosso
fine

<rilascio>: UNLOCK(X): inizio


Set(X); // poni il semaforo a verde
fine

●Soluzione al problema della mutua


esclusione
Abbiamo visto come con le primitive di gestione dei semafori possiamo risolvere il pro-
blema della mutua esclusione. Supponiamo per esempio di considerare due processi Q1
e Q2 che concorrano a una stessa risorsa R, per garantire la sincronizzazione, dopo aver
inizializzato il semaforo a 1, è sufficiente implementare le seguenti porzioni di codice.

Programma Concorrente Mutua Esclusione;

Var SR: semaforo;


Q1_pid, Q2_pid: identificatori dei processi;
inizio
INIZ_SEM(SR,1); osi inizializza il semaforo associato alla risorsa
coinizio Q1 || Q2 cofine; osi richiamano i processi Q1 e Q2
fine
Procedura Concorrente Q1 Procedura Concorrente Q2
inizio … inizio …
P(SR); P(SR);
<sezione critica di Q1 <sezione critica di Q2
rispetto ad R> rispetto ad R>
V(SR); V(SR);
… …
fine fine

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.

verifica le tue conoscenze


1 Descrivi, con uno pseudocodice le operazioni di lock 4 Che cos’è un semaforo?
e unlock. 5 Descrivi, con uno pseudocodice le primitiva di wait e signal.
2 Descrivi il fenomeno dell’attesa attiva. 6 Descrivi le operazioni di lock e unlock con
3 Cosa si intende per TestAndSet? la TestAndSet.

Lezione 4 Realizzazione della mutua esclusione 127


4
UNITÀ lezione

5 Il problema dello stallo

● 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

Prendendo in considerazione un sistema informatico se R1 e R2 sono due risorse e P1 e P2


due processi che devono accedere sia a R1 che a R2, per poter terminare il programma sia
P1 che P2 avranno bisogno di entrambe le risorse ma, se il Sistema Operativo assegna R1 a
P1 , e R2 a P2 i due processi saranno bloccati in un’attesa circolare. Infatti R1 è posseduta
da P1 ma serve anche a P2 che non potrà terminare e viceversa. I due processi sono in una
situazione di stallo.

posseduta
R1 P1
richiede

richiede

posseduta
P2 R2

figura 2 Lo stallo

Si dice che i processi P1 e P2 sono in deadlock, cioè in stallo (figura 2).

128 Unità 4 Programmazione concorrente


Tale situazione è una condizione da evitare ed è definitiva. Nei sistemi reali, se ne può
uscire solo con metodi “distruttivi”, cioè uccidendo i processi o riavviando la macchina.
Questo è un problema fondamentale che deve affrontare un Sistema Operativo relativa-
mente al controllo delle sezioni critiche, cioè quelle parti di codice che contengono delle
azioni indivisibili e in cui le risorse richieste vengono rilasciate solo a fine esecuzione.
Lo stallo si verificare nelle seguenti situazioni:
UÊ mutua esclusione: nelle zone critiche le risorse vengono rilasciate solo a fine lavoro e
una risorsa non condivisibile deve essere utilizzata da un solo processo alla volta;
UÊ superamento della molteplicità di una risorsa;
UÊ allocazione parziale: il processo non impegna, all’inizio del blocco critico, tutte le
risorse di cui avrà bisogno ma le richiederà man mano che serviranno;
UÊ impossibilità di prerilascio forzato: il sistema non é abilitato a sottrarre forzatamente
la risorsa al processo;
UÊ attesa circolare: esiste una lista di processi ognuno dei quali è in attesa di acquisire una
risorsa che è in possesso di un altro processo.

● Gestione del problema dello stallo


La gestione dello stallo può avvenire in diversi modi:

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.

Lezione 5 Il problema dello stallo 129


I problemi principali di questo metodo sono che:

UÊ ˆÊ«ÀœViÃÈÊ`iۜ˜œÊëiVˆvˆV>À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.

2. Riconoscimento e risoluzione dello stallo: si analizza il grafo di allocazione delle


risorse per rilevare eventuali stalli in atto e si mettono in azione tecniche di risoluzione,
come per esempio un recupero dello stato del sistema prima dello stallo.

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.

La prevenzione dello stallo si effettua con le seguenti tecniche:

a) Allocazione globale delle risorse: le risorse necessarie a un processo gli vengono


assegnate tutte insieme solo quando sono tutte libere; in caso contrario il sistema resta
in attesa. In questo caso si ha come svantaggio che qualche processo che ha urgenza
di una risorsa possa restare in attesa molto tempo e si possano avere anche dei grandi
rallentamenti nell’esecuzione di un processo.

b) Allocazione gerarchica delle risorse: si considerano le risorse in ordine gerarchico. Se


un processo possiede una risorsa di un certo livello, può acquisire solo risorse di livello
superiore. Se deve acquisire una risorsa di livello inferiore, deve prima rilasciare quella
che possiede e richiederla successivamente.

● Algoritmo del banchiere


Con questo algoritmo si considera il caso in cui si gestisca una sola tipologia di risorse
indivisibili come, per esempio: pagine di memoria, stampanti, denaro ecc.
Viene usata la seguente metafora: il banchiere, che è il gestore della risorsa, concede presti-
ti, che sono le risorse, ai propri clienti, che sono i processi. Anche in questo caso è evidente
l’analogia tra il mondo reale e il mondo
informatico.

L’algoritmo deve osservare le seguenti


regole:

UÊʜ}˜ˆÊ Vˆi˜ÌiÊ `ˆV…ˆ>À>Ê ˆ˜Ê >˜ÌˆVˆ«œÊ ˆÊ «Àœ‡


prio fido;
UÊʏ>Ê V>ÃÃ>Ê ˆ˜ˆâˆ>iÊ `i>Ê L>˜V>Ê mÊ V>«>ViÊ `ˆÊ
coprire il massimo fido;
UÊʈÊVˆi˜ÌˆÊÈʈ“«i}˜>˜œÊ>ÊÀiÃ̈ÌՈÀiʈÊ«Ài‡
stito in un tempo finito, ma possono aver
bisogno di raggiungere il tetto del fido
prima di cominciare a farlo;
UÊʈÊL>˜V…ˆiÀiʫբÊÌi“«œÀ>˜i>“i˜ÌiÊÀˆvˆÕ‡
tare un prestito se ritiene che in seguito
alla concessione potrebbe non riuscire
a garantire in un tempo finito il fido di
tutti i clienti.

130 Unità 4 Programmazione concorrente


Facciamo qualche esempio:
Esempio 1

BANCHIERE 1 prestito attuale fido potenziale richiesta


CLIENTE A 8 10 2
CLIENTE B 4 8 4
CLIENTE C 3 6 3

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

BANCHIERE 2 prestito attuale fido potenziale richiesta


CLIENTE A 10 10 0
CLIENTE B 4 8 4
CLIENTE C 3 6 3

CASSA = 0

Il cliente A, da questo momento in poi può solo restituire.


Esempio 3

BANCHIERE 3 prestito attuale fido potenziale richiesta


CLIENTE A 8 10 2
CLIENTE B 4 8 4
CLIENTE C 3 6 3

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

verifica le tue conoscenze


1 Che cos’è lo stallo? 4 Descrivi cosa vuole dire prevenzione dello stallo.
2 Quando si verifica lo stallo? 5 Con quali tipi di allocazione si previene lo stallo?
3 Descrivi cosa vuole dire fuga dallo stallo. 6 Descrivi l’algoritmo del Banchiere.

Lezione 5 Il problema dello stallo 131


4
UNITÀ lezione

6 Produttore-consumatore

Il problema del produttore-consumatore è un problema di accesso a una risorsa limitata


(buffer limitato), è il classico esempio di sincronizzazione tra processi. Il problema descrive
due processi, un processo produttore e uno consumatore, che condividono un buffer comu-
Buffer è un’area di memoria usata ne, di dimensione finita. Il compito del produttore è quello di generare dati e depositarli
per contenere temporaneamente nel buffer; mentre contemporaneamente, il consumatore utilizzerà i dati prodotti, prele-
Input e Output. vandoli di volta in volta dal buffer. Il problema consiste nel sincronizzare i due processi in
modo che il produttore non depositi nuovi dati se il buffer è pieno e che il consumatore
non prelevi dati se il buffer è vuoto (figura 1).

Processo Processo
BUFFER
Produttore Consumatore

figura 1 Uso del buffer

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Ê Õ˜Ê`>̜Êۈi˜iʏ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.

132 Unità 4 Programmazione concorrente


● Soluzione algoritmica del problema
Analizzando il problema si ha quindi la seguente situazione:
UÊ Inizialmente deposita = 0 q blocca il consumatore
preleva = 1 q da via libera al produttore
UÊ Il produttore:
– se preleva = 1 allora WAIT: preleva = preleva–1
“deposita un dato nel buffer”
SIGNAL: deposita = deposita+1
– se preleva = 0 allora blocca il produttore (lo mette in coda)
UÊ Il consumatore:
– se deposita = 1 allora WAIT: deposita = deposita–1
“preleva il dato dal buffer”
SIGNAL: preleva =preleva+1
– se deposita = 0 blocca il consumatore (lo mette in coda)
Un possibile esempio in pseudo codifica è il seguente:
programma concorrente PROD_CONS
tipo messaggio=…
var M: messaggio
DEPOSITA, PRENOTA: semaforo_binario
inizio
INIZ_SEM(PRELEVA,1)
INIZ_SEM(DEPOSITA,0)
coinizio
PROD || CONS <richiama il produttore e il consumatore>
cofine
fine
procedura concorrente PROD
inizio
ripeti inizio
P(PRELEVA)
BUFFER o M <produci un messaggio in M>
V(DEPOSITA)
fine
finché finito
fine
procedura concorrente CONS
inizio
ripeti inizio
P(DEPOSITA)
M o BUFFER <consuma il messaggio in M>
V(PRELEVA)
fine
finché finito
fine

La soluzione che abbiamo esaminato finisce con la perfetta alternanza di produzione e


consumazione. Infatti il consumatore non può consumare fino a quando il produttore non
produce e il produttore non può produrre fino a quando il consumatore non consuma.
A meno che i tempi di produzione e consumazione non siano esattamente gli stessi, entrambi i
processi passano del tempo sospesi uno in attesa dell’altro. Ciò implica che su di una macchina
multi-processore non si possa utilizzare completamente la capacità di elaborazione disponibile.

verifica le tue conoscenze


1 Quando, nello schema del produttore-consumatore si 3 Quali sono e come vengono usati i semafori nel
verifica lo stallo? problema del produttore-consumatore?
2 Descrivi la precedura produttore-consumatore. 4 Quale problema si verifica in questo tipo di gestione?

Lezione 6 Produttore-consumatore 133


4
UNITÀ lezione

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

figura 1 Tavola dei 5 filosofi

Un filosofo può essere nei seguenti stati:


UÊ «i˜Ã>\ʘœ˜Êˆ˜ÌiÀ>}ˆÃViÊVœ˜Ê˜ˆi˜ÌiÊiʘiÃÃ՘œÆ
UÊ “>˜}ˆ>\ÊÌi˜Ì>Ê`ˆÊ«Ài˜`iÀiʏiÊvœÀV…iÌÌiÊ>>ÊÃÕ>Ê`iÃÌÀ>ÊiÊ>>ÊÃÕ>ÊȘˆÃÌÀ>°

Si può pensare che ogni filosofo segua un protocollo di questo tipo:

ciclo
“pensa”;
“impossessati delle due forchette”;
“mangia”;
“rilascia le due forchette”;
fine

● Soluzione algoritmica del problema


Per la soluzione si può utilizzare un array di 5 semafori associati alle forchette. Sia i filosofi
che le forchette sono numerati da 0 a 4. La forchetta a sinistra del filosofo i ha numero i,
quella alla sua destra (i+1)%5. Per le forchette viene usata una variabile condivisa:

134 Unità 4 Programmazione concorrente


var F: array condiviso[0..4] di semaforo

programma concorrente CINQUE_FILOSOFI


tipo filosofo = procedura concorrente (I: 0..4)
inizio /* … */ fine
var A, B, C, D, E: filosofo
J: 0..4
F: array condiviso[0..4] di semaforo
inizio
per J o 0 a 4 fai INIZ_SEM(F[J],1)
coinizio A(0) || B(1) || C(2) || D(3) || E(4) cofine <sezione critica>
fine

procedura concorrente filosofo


inizio ciclo
<<pensa>>
P(F[i]); o prende la forchetta di sx
P(F[(i+1) % 5]) o prende la forchetta di dx
<<mangia>> sez. critic
V(F[(i+1) % 5]) o lascia la forchetta di dx
V(F[i]) o lascia la forchetta di sx
fine

Questa soluzione è semplice ma ammette il deadlock. Infatti, se tutti e cinque i filosofi


fanno il tentativo di prendere le forchette simultaneamente, tutti otterranno la forchetta
sinistra e si bloccheranno per l’indisponibilità di quella destra. Il blocco in questo caso è
critico e definitivo.
Si può cercare di eliminare il problema usando un solo semaforo binario:

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.

verifica le tue conoscenze


1 Quali strutture sono usate nel problema dei Cinque 3 Quali sono gli inconvenienti della soluzione senza
filosofi? deadlock?
2 Quando, nello schema dei Cinque filosofi, si verifica 4 Come si evita lo stallo?
lo stallo?

Lezione 7 I cinque filosofi 135


4 lezione
UNITÀ
Sincronizzazione attraverso
8 scambio di messaggi

La sincronizzazione attraverso lo scambio dei messaggi fa riferimento a un sistema distri-


buito in cui i processi risiedono su elaboratori diversi tramite un canale di comunicazione,
e sono in grado di scambiarsi messaggi.
Lo scambio di messaggi, o message-passing, si basa su due operazioni fondamentali:
UÊ send (destinatario, messaggio);
UÊ receive (mittente, messaggio).

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.

I messaggi possono avere tempi elevati di trasmissione. In più si possono danneggiare,


perdere o risultare duplicati. Tali problematiche sono solitamente affrontate dai protocolli
utilizzati.

● 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.

Per esempio, utilizzando la comunicazione diretta il problema del produttore-consuma-


tore può essere risolto nel seguente modo.

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.

136 Unità 4 Programmazione concorrente


Pensando che il canale di comunicazione abbia capacità limitata bisogna interrompere il
processo che ha chiamato la send per far in modo che rimanga bloccato fino a che il rice-
vente non sia pronto e per evitare che riceva un nuovo messaggio senza avere consumato
quello precedente.

Per quanto riguarda la sincronizzazione, si possono avere i seguenti casi:


UÊ Ãˆ>ʏ>Êsend che la receive sono bloccanti;
UÊ >Êsend non è bloccante mentre la receive è bloccante;
UÊ Ãˆ>ʏ>Êsend che la receive non sono bloccanti.

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.

Il modello di comunicazione indiretta prevede invece la possibilità che più processi


inviino messaggi che possano essere ricevuti da più destinatari. In questo caso i messaggi
vengono inviati o ricevuti mediante una mailbox:
UÊ send (nome_mailbox, messaggio);
UÊ receive (nome_mailbox, messaggio).

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.

Mediante lo scambio di messaggi si può gestire la mutua esclusione. A tal scopo si


introduce una mailbox con un solo messaggio vuoto, il token, che viene utilizzato per la
sincronizzazione. Di volta in volta tutti i processi che vogliono accedere alla risorsa devono
prima effettuare una receive bloccante sulla mailbox per ottenere il token; solo dopo potran-
no entrare in sezione critica, al termine della quale il token verrà rilasciato eseguendo una
send sulla mailbox.

verifica le tue conoscenze


1 Quando si applica la sincronizzazione attraverso lo 4 Quali casi di sincronizzazione si verificano?
scambio di messaggi?
5 In cosa consiste il modello di comunicazione
2 In cosa consistono le primitive send e receive? indiretta?
3 Utilizzando la comunicazione diretta come può essere 6 Come viene gestita la mutua esclusione?
risolto il problema del produttore-consumatore?

Lezione 8 Sincronizzazione attraverso scambio di messaggi 137


unità

4 sintesi

lezione 1 Introduzione alla programmazione


concorrente
Elementi fondamentali della programmazione concorrente sono: i processi, i thread e le
risorse. In particolare le risorse possono essere prerilasciabili o non prerilasciabili. Un
processo padre può creare uno o più processi figli mediante la fork. I processi possono
essere eseguiti in parallelo, e in tal caso devono per forza cooperare, se devono scam-
biarsi dei dati. Devono invece competere se richiedono l’uso di risorse comuni che non
possono essere usate contemporaneamente.

lezione 2 La concorrenza nella realtà


Nella realtà ogni individuo effettua azioni in modo concorrente ad altri individui. Si
possono trovare analogie con il mondo reale sia per quanto riguarda i processi sia per
le risorse. Sfruttando queste semplici analogie si possono individuare una serie di pro-
prietà delle risorse. Le risorse possono essere: consumabili o non consumabili, condivi-
sibili o non condivisibili, sottraibili.

lezione 3 Sincronizzazione tra processi concorrenti


La programmazione concorrente racchiude tutte le tecniche e gli strumenti usati per
descrivere il comportamento di più processi impegnati a eseguire contemporaneamente
un sistema di calcolo. I processi possono essere “consapevoli” uno della presenza dell’al-
tro, o totalmente “ignari” uno dell’altro. Per interagire, i processi, che competono per
le stesse risorse, devono sincronizzarsi nella loro utilizzazione.
Il problema della mutua esclusione tra processi concorrenti si ha quando necessaria-
mente un solo processo alla volta può avere accesso a un insieme di risorse comuni.

lezione 4 Realizzazione della mutua esclusione


La soluzione al problema della mutua esclusione può avvenire mediante l’uso di due
operazioni atomiche (non interrompibili) chiamate lock(x) e unlock(x); questa solu-
zione può presentare alcuni gravi problemi come quello dell’attesa attiva e dell’accesso
non seriale. Però può anche avvenire tramite l’uso di un’istruzione macchina TestAndSet
che consenta di testare e modificare una variabile in modo indivisibile oppure mediante
l’uso di due primitive wait e signal che operi su di un parametro; un intero non negati-
vo S detto semaforo.

lezione 5 Il problema dello stallo


La mutua esclusione permette di risolvere il problema della non interferenza, ma può
causare il blocco permanente dei processi, cioè lo stallo. Lo stallo si verifica nelle se-
guenti situazioni: mutua esclusione; superamento della molteplicità di una risorsa; al-
locazione parziale; impossibilità di prerilascio forzato; attesa circolare. La gestione del-

138 Unità 4 Programmazione concorrente


unità

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.

lezione 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. Per fare ciò devono
possedere due forchette. Per le forchette viene usata una variabile condivisa, per esem-
pio un array di 5 semafori. In questa soluzione si può verificare una situazione di stallo.

lezione 8 Sincronizzazione attraverso scambio


di messaggi
Lo scambio di messaggi o, message-passing, si basa su due operazioni fondamentali: la
send (destinatario, messaggio) per mandare i messaggi e la receive (mittente, messaggio)
per riceverli. La comunicazione può essere diretta o indiretta. Nel caso indiretto si ha
una mailbox dove depositare i messaggi. Mediante lo scambio di messaggi si può anche
gestire la mutua esclusione.

Unità 4 Programmazione concorrente 139


unità

4 domande per l’orale

unità 4 Programmazione concorrente


Ripasso MP3
1 Spiega come avviene la creazione di processi.

➞ L1

2 Cosa implica l’esecuzione concorrente di processi?

➞ L1

3 Illustra le principali proprietà delle risorse.

➞ L2

4 Illustra il fenomeno della competizione e della collaborazione.

➞ L3

5 Spiega il meccanismo della mutua esclusione.

➞ L4

6 Con quali metodi si realizza la mutua esclusione?

➞ L4

7 Come si risolve il problema dell’attesa attiva con l’uso dei semafori?

➞ L4

8 Quando si verifica lo stallo?

➞ L5

9 Descrivi le tecniche di prevenzione dello stallo.

➞ L5

10 Descrivi il problema del produttore-consumatore.

➞ L6

11 Descrivi il problema dei cinque filosofi.

➞ L7

12 Illustra il modello dello scambio di messaggi.

➞ L8

140 Unità 4 Programmazione concorrente


unità
in English, please 4
Abstract
CONCURRENT PROGRAMMING

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?

2 What does synchronization between processes mean?

3 Describe the lock and unlock functions?

4 Describe the problem of deadlock.

5 What is a semaphore?

6 Explain the use of the mailbox in message passing.

7 Indicate if the following are true or false


a The basic TestAndSet instruction resolves the problem of mutual exclusion T F

b The basic TestAndSet instruction resolves the problem of deadlock T F

c A semaphore is a simple Boolean operation T F

d The wait state is eliminated by suspending the process T F

8 Which of the following statements about deadlock management is false?


One may back off from the deadlock
The deadlock may be destroyed
The deadlock may be anticipated
The deadlock may be identified

Unità 4 Programmazione concorrente 141


unità

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.

Semaphore: a programming language primitive that enables mutual exclusion to


be achieved. Unlike monitors, the code to do this ends up distributed throughout a
programme making it difficult to maintain and prone to errors.

Shared variables: data that lives in a memory location that can be updated by more
than one process/ thread at a time.

Suspended: a process is suspended if it has become non-executable, for example


while waiting for an I/O request to be satisfied.

142 Unità 4 Programmazione concorrente


Unità
Interazione con il Sistema
5 Operativo

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.

Accertamento dei prerequisiti


1 Descrivi le principali funzioni di un file system. 7 Un file system memorizza i file sulle
2 Descrivi il meccanismo di protezione di un file. memorie di massa. V F
3 Quali sono i principali costrutti di controllo che 8 Directory simbolica e di base non sono
conosci? collegate. V F
4 Da quali moduli software è composto un file 9 Nell’interfaccia grafica si comunica
system? mediante il prompt. V F
5 Una directory è un insieme di file. V F
10 L’interfaccia è quella parte del SO
6 La tabella delle directory è divisa in directory che permette all’utente di utilizzare
simbolica e reale. V F il computer. V F
5 lezione
UNITÀ
Il Sistema Operativo
1 come interfaccia

● 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œ˜ÌÀœœÊۈi˜iÊ`>̜Ê>Ê-"Ê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À‡"˜Ê-ivÊ/iÃÌ®\ÊVˆœmʈÊÌ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…ˆ˜>°

144 Unità 5 Interazione con il Sistema Operativo


Inoltre, all’avvio del sistema si vedono molte scritte, sempre le stesse, scorrere. Tale sequen-
za viene detta boot sequence ed è solitamente definita staticamente.
Come prima cosa, il boot loader carica l’immagine del kernel, definita nella configurazione
in memoria e dopo indica alla CPU di eseguire il kernel. Quando il kernel è caricato ed è
nello stato di esecuzione, inizializza la struttura del kernel e i task e avvia il processo init,
che si assicura che tutti i file system siano disponibili.
Su Linux sono presenti vari LœœÌœ>`iÀ]ÊÌÀ>ʈʵÕ>ˆÊ"]Ê,1 ÊiÊœ>`ˆ˜°Ê"Ê­˜ÕÝÊ
">`iÀ]ÊVˆœmÊV>ÀˆV>̜ÀiÊ`ˆÊˆ˜ÕÝ®ÊmÊ՘ÊLœœÌœ>`iÀʓœÌœÊ`ˆvvÕܰÊ,1 ÊmÊ«ˆÙÊÀiVi˜ÌiÊ`ˆÊ
LILO e Loadlin non è un vero e proprio bootloader, in quanto viene usato per caricare
Linux da Windows (una volta avviato Windows, è possibile lanciare il comando Loadlin
per caricare Linux).
Nel caso di Linux quando si esegue il boot viene caricato il kernel, il quale manda in ese-
cuzione il processo sched che gestisce tutti i processi e quindi, vista la sua importanza, ha
massima priorità ed è sempre residente in memoria. È infatti il processo sched che crea il
processo init, con PID 1, che avvierà gli altri processi in base al file /etc/inittab che contiene
le indicazioni dei processi da avviare.
Init avvierà tutti i processi che si occupano della gestione del sistema e dei terminali. Tali
processi sono detti demoni, cioè programmi eseguiti continuativamente in background, e
gestiscono le richieste di servizi fatte al Sistema Operativo (gestione della stampa, schedu- Demoni
lazione dei lavori ecc.).
Programmi che vengono avviati au-
Solitamente init avvia il sistema in modalità monoutente in cui viene abilitato solo il super- tomaticamente all’avvio del sistema.
user e in cui si effettua la configurazione e la manutenzione del sistema.

● 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).

figura 1 Interfaccia di Windows

Lezione 1 Il Sistema Operativo come interfaccia 145


UÊ CLI (Command Line Interface) che utilizza una linea di comando per poter digitare
comandi veri e propri (figura 2). In questo caso l’interfaccia fra il SO e l’utente è
costituita da una serie di comandi digitati su un terminale e messaggi che il SO invia
al terminale. I comandi possono essere immessi in modo interattivo o letti da file,
cioè in modalità batch. Essi vengono letti e interpretati da un interprete dei comandi.
Sicuramente con questa interfaccia il sistema risulta meno accattivante ma, viene privi-
legiato un maggiore controllo sull’esecuzione del programma.

figura 2 Interfaccia CLI DOS

In realtà, i due tipi di interfacce su Linux convivono e sono separati.

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.

● Confronto tra GUI e CLI


Gli utenti non molto esperti possono sentirsi a disagio con un’interfaccia a riga di comando
e rassicurati da un’interfaccia grafica, ma i vantaggi e gli svantaggi sono presenti in ciascuna
interfaccia. Al fine di determinare quella che è più adatta per il nostro uso, illustriamo i
principali vantaggi e svantaggi di ciascuna delle interfacce (tabella 1).

146 Unità 5 Interazione con il Sistema Operativo


tabella 1 Confronto tra GUI e CLI
argomento GUI CLI
facilità d’uso Nonostante un’iniziale difficoltà a usare il mouse Essa risulta più difficile da navigare e gestire a
per utilizzare una GUI, la maggior parte degli causa della memorizzazione dei vari comandi.
utenti trova questa interfaccia molto più amiche-
vole rispetto a un’interfaccia a riga di comando.

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.

verifica le tue conoscenze


1 Come si attiva il Sistema Operativo? 3 Secondo quali modalità si può interagire con il
Sistema Operativo?
2 Che cos’è il BIOS? 4 Confronta le principali caratteristiche della GUI e della CLI.

Lezione 1 Il Sistema Operativo come interfaccia 147


5
UNITÀ lezione

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ÃÌœÊ “œÌˆÛœÊ ۈi˜iÊ Vœ˜Ãˆ`iÀ>ÌœÊ Vœ“iÊ ºˆÊ -ˆÃÌi“>Ê
"«iÀ>̈ۜÊ՘ˆÛiÀÃ>i»°Ê>ÊÃÕ>ʈ˜ÃÌ>>∜˜iÊmÊ`ˆÃ«œ˜ˆLˆiÊÈ>ʈ˜Ê“œ`>ˆÌ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.

148 Unità 5 Interazione con il Sistema Operativo


UÊ Slackware\ÊmÊ܏ˆÌ>“i˜ÌiÊۈÃÌ>ÊVœ“iʏ>Ê`ˆÃÌÀˆLÕ∜˜iÊ«ˆÙʺ«ÕÀ>»Ê`>Ê«Õ˜ÌœÊ`ˆÊۈÃÌ>Ê`i}ˆÊ
standard GNU Linux.
UÊ SUSE: è una distribuzione molto nota in Europea e viene usata prevalentemente a livello
aziendale ma anche dall’utente desktop.
UÊ Ubuntu: è una distribuzione basata sull’ambiente desktop GNOME e l’interfaccia uten-
te Unity. I suoi punti di forza sono sicuramente un’interfaccia semplice e intuitiva ma
completa e potente, un ottimo riconoscimento e supporto dell’hardware, un vasto parco
software costantemente aggiornato. Quindi questa distribuzione risulta molto sempli-
ce da utilizzare, ma decisamente completa e funzionale. La versione desktop la rende
particolarmente adatta a un utente medio, per soddisfare esigenze come: navigazione in
Internet, gestione dei documenti e immagini, attività di svago.

● 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ÃÈ]ÊVˆœmʈʫÀœViÃÈʓՏ̈«ˆÊ«œÃܘœÊÕÃ>ÀiÊ
la stessa memoria per funzionare;
UÊ «ÀiÛi`iÊ՘>ʓi“œÀˆ>Ê՘ˆvˆV>Ì>Ê«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Ê>ÊvˆiÊÃÞÃÌi“Ê`ˆÛiÀÈÆ
UÊ ÃÕ««œÀÌ>Ê`ˆÛiÀÃiÊÌ>Ã̈iÀiʈ˜ÌiÀ˜>∜˜>ˆÆ
UÊ ÃÕ««œÀÌ>Ê՘½>“«ˆ>Ê}>““>Ê`ˆÊ«ÀœÌœVœˆÊ`ˆÊÀiÌiÊ­/
*É*]Ê-*]Ê***ÊiVV°®Æ
UÊ ÌÕÌ̜ʈÊVœ`ˆViÊÜÀ}i˜ÌiÊmÊ`ˆÃ«œ˜ˆLˆi]Ê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.

Lezione 2 Linux 149


Una volta introdotto il nome, dopo aver premuto invio il sistema ci chiederà anche una
password:

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.

● Il file system di Linux


Un sistema Linux non fa distinzioni tra un file e una directory visto che una directory è
solo un file che contiene nomi di altri file. Programmi, servizi, testi, immagini, e così via,
sono tutti file. Le periferiche in generale sono considerate come file, esistono anche file
speciali come pipe e socket.
Per gestire tutti quei file in modo ordinato si può pensarli in una struttura a forma di albero nel
disco fisso in cui i rami principali contengono altri rami e le estremità hanno le foglie, cioè i file.
Per quel che riguarda il file system, in un sistema Linux l’utente non deve avere cono-
scenza delle caratteristiche della macchina, in quanto la gestione della macchina è riservata
all’amministratore del sistema.
˜ÊµÕiÃ̜Ê̈«œÊ`ˆÊÈÃÌi“ˆÊ>½ÕÌi˜ÌiÊۈi˜iÊ«ÀiÃi˜Ì>̜Ê՘Ê՘ˆVœÊº`ˆÃ«œÃˆÌˆÛœ»]ÊVœ“iÊvœÃÃiÊ՘Ê
unico disco, dove alcune sottodirectoryÊ`ˆÊµÕiÃ̜ʺ`ˆÃ«œÃˆÌˆÛœ»ÊܘœÊ}ˆÊ>ÌÀˆÊ`ˆÃ«œÃˆÌˆÛˆÊvˆÃˆVˆ°Ê
La connessione e disconnessione dei dispositivi dalle directory viene fatta dall’amministra-
tore di sistema con specifici comandi.
Ogni sistema Linux ha una serie di directory che vengono usate in maniera standard. In
genere in ogni sistema troveremo queste directory, indipendentemente dalla distribuzione,
e avranno lo stesso scopo.

Per quanto riguarda la gestione dei file, si hanno le seguenti differenze fondamentali di
Linux rispetto a Windows:
UÊ ˆÊ˜œ“ˆÊ`iˆÊvˆiÊ«œÃܘœÊÀ>}}ˆÕ˜}iÀiʏ>ʏ՘}…iââ>ʓ>Ãȓ>Ê`ˆÊÓxxÊV>À>ÌÌiÀˆÆ
Per poter lanciare un programma,
UÊ ˆÊV>À>ÌÌiÀiÊ`ˆÊÃi«>À>∜˜iÊ`iiÊ`ˆÀiV̜ÀÞÊmʈÊV>À>ÌÌiÀiʺɻÊ>˜âˆV…jʈÊV>À>ÌÌiÀiʺM»Æ
occorre avere permessi di esecuzione UÊ ˆ˜ÕÝÊ`ˆÃ̈˜}ÕiÊÌÀ>ʏiÌÌiÀiʓˆ˜ÕÃVœiÊiʓ>ˆÕÃVœi]Ê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ʺ°»Ê˜œ˜Ê…>Ê՘ÊÈ}˜ˆvˆV>̜ʫ>À̈Vœ>Ài]ÊۈÃ̜ÊV…iʈÊ̈«œÊ`ˆÊvˆiʘœ˜Ê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ˆÊvˆiÊmÊëiÃÜÊṎiÊ«iÀÊ`iÌiÀ“ˆ˜>ÀiʈÊ̈«œÊ`ˆÊvˆi]ʓ>ʘœ˜Ê…>ÊÈ}˜ˆvˆV>̜Ê
vincolante per il Sistema Operativo;
UÊ ˆÊvˆiÊiʏiÊ`ˆÀiV̜ÀÞʅ>˜˜œÊ՘ʫÀœ«ÀˆiÌ>Àˆœ]ÊVˆœmʏ½ÕÌi˜ÌiÊV…iʏˆÊ…>ÊVÀi>̈ÊiÊ՘Ê}ÀÕ««œÊ`ˆÊ
appartenenza;
UÊ ˆÊvˆiÊ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ÊvˆiÊ­iʏ½>““ˆ˜ˆÃÌÀ>̜ÀiÊ`ˆÊÈÃÌi“>®Ê«Õ¢Ê“œ`ˆvˆV>ÀiʈʫiÀ“iÃÈÊ`ˆÊ
un file.

150 Unità 5 Interazione con il Sistema Operativo


● Sistema di protezione dei file
Siccome Linux è un sistema multiuser il sistema di protezione dei file deve essere tale da
garantire la sicurezza delle attività di tutti gli utenti e del sistema stesso. Si avranno quindi
i seguenti permessi (tabella 1):

tabella 1 Permessi dei file


numero ottale permesso descrizione
0 --- nessuna autorizzazione
1 --x esecuzione
2 -w- scrittura
3 -wr scrittura e lettura
4 r-- lettura
5 r-x lettura ed esecuzione
6 rw- lettura e scrittura
7 rwx lettura, scrittura ed esecuzione

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.

Esistono due tipi di partizioni principali in un sistema Linux:


UÊ partizione dati: normali dati del sistema Linux, compresa la partizione di root contenente
tutti i dati per avviare e far funzionare il sistema;
UÊ partizione swap: espansione della memoria fisica del computer, memoria extra su disco
rigido.

verifica le tue conoscenze


1 Che cosa garantisce una licenza Open 3 Descrivi brevemente le caratteristiche di almeno due
Source? distribuzioni di Linux.
2 Illustra qualche caratteristica significativa 4 Illustra almeno tre caratteristiche della gestione dei
di Linux. file in Linux.

Lezione 2 Linux 151


5
UNITÀ lezione

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ÊÈ}˜ˆvˆV>ʺ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.

In ogni caso, è importante avere


una buona conoscenza di entram-
be perché ci aiuta a capire meglio
come funziona il computer e ci per-
mette di ottimizzare il suo utilizzo.

Per la maggior parte degli utenti


figura 1 GUI di Linux non c’è bisogno di digitare i coman-
di in una shell, proprio perché con

152 Unità 5 Interazione con il Sistema Operativo


l’evoluzione dei Sistemi Operativi e la creazione di molti nuovi strumenti basati su GUI,
la shell è diventata sempre meno necessaria per eseguire la maggior parte delle attività.
Ma premesso ciò, la shell è un ambiente molto potente e attraverso di essa si possono
fare molte cose. Gli utenti di Linux più professionali trovano la shell molto potente e
indispensabile, quindi l’introduzione almeno all’uso della shell di base è molto utile.

Infatti l’interfaccia testuale di Linux è strettamente integrata con la GUI e, a differenza


di Windows, spesso deve essere utilizzata per alcune operazioni. Anche se questo può
sembrare un difetto di Linux in realtà è un grande pregio. In modo particolare se ci
riferiamo alla flessibilità e alla configurabilità completa di Linux rispetto a Windows.
Come svantaggio c’è la difficoltà, per gli utenti di Linux alle prime armi, di scontrarsi
con un’interfaccia sconosciuta e anche se è presente in Windows (il prompt dei comandi
in DOS) loro probabilmente non la hanno mai usata. Man mano che si utilizza la CLI
di Linux ci si rende conto che molti comandi sono logici e intuitivi e che con il tempo
diventerà tutto più facile. Inoltre molti degli utenti di Linux hanno una vera passione
per le CLI e addirittura arrivano a preferire l’utilizzo dell’interfaccia testuale a quella
grafica.
In Linux sono disponibili diverse shell, tra cui (tabella 1):

tabella 1 Tipi di shell


nome shell sviluppata da osservazioni
BOURNE SH Steven Bourne è stata la prima shell scritta

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

BASH (Bourne Brian Fox e Chet è la shell di default di Linux e comprende le


Again SHell) Ramery caratteristiche delle shell più famose (Bourne, C,
Korn) più novità specifiche

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.

● I comandi base della shell


I comandi che si impartiscono alla shell possono essere considerati come composti da tre
parti, cioè dal nome del comando, più alcune opzioni (precedute sempre da un trattino)
e uno o più argomenti. Questa suddivisione è molto utile per capire come funzionano i
comandi: cambiando un’opzione o l’argomento, uno stesso comando può far cose molto
differenti.
Ê Vœ“>˜`ˆÊ «œÃܘœÊ iÃÃiÀiÊ ÃVÀˆÌÌˆÊ >˜V…iÊ ÃÕÊ «ˆÙÊ Àˆ}…i]Ê `ˆ}ˆÌ>˜`œÊ ˆÊ V>À>ÌÌiÀiÊ ºÊ MÊ »Ê «Àˆ“>Ê
dell’invio, e per indicare l’attesa del completamento di un comando viene visualizzato un
prompt diverso. Inoltre si possono avere anche più comandi sulla stessa riga separandoli
Vœ˜ÊÕ˜ÊºÊÆ»°
Per avere informazioni sui comandi possiamo utilizzare il comando man, il quale accederà
a tutti i comandi presenti sul manuale. Per ogni comando si avrà il formato, le opzioni, i
comandi correlati, esempi e così via. Per uscire dal manuale si deve digitare q.

Lezione 3 La shell 153


La shell fornisce la possibilità di editing della riga di comando. Per esempio premendo Tab,
dopo aver scritto poche lettere si può avere il completamento automatico del comando.
Inoltre è possibile gestire la storia dei comandi, con la freccia in su si risale nella lista dei
comandi digitati e si può modificare un singolo comando.
I comandi della shell possono essere gestiti direttamente dal processo shell, siamo nel
caso di comandi interni, oppure richiedono l’esecuzione di un file eseguibile, quelli
esterni.
Gli alias servono per eseguire dei comandi complessi utilizzando stringhe semplificate.
Come dice il nome, gli alias vengono definiti sulla base di comandi preesistenti e ne sosti-
Alias dà all’utente la possibilità di
tuiscono solo il nome (o l’intera stringa). Per creare un alias per un comando si usa alias
rinominare un comando.
nuovonome = comando. Al riavvio del computer l’alias verrà però cancellato. Per evitare
che questo venga cancellato, occorre editare un file nascosto di sistema che si trova nella
cartella dell’utente ed è chiamato .bashrc, il comando digitato in precedenza dal termi-
nale dovrà essere riscritto su tale file. Se volete rimuovere l’alias basta invece utilizzare il
comando unalias.
Ricordiamo che molti comandi per essere eseguiti necessitano dei privilegi di amministra-
tore (utente root) per fare ciò è necessario sapere quale distribuzione stiamo usando; infatti
ÃiÊÃ̈>“œÊÕÃ>˜`œÊ1L՘ÌÕÉÕL՘ÌÕÉ8ÕL՘ÌÕʜVVœÀÀiÊ>˜Ìi«œÀÀiÊ>ˆÊVœ“>˜`ˆÊsudo, se si usa
una qualsiasi altra distribuzione bisogna loggarsi come root.

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.

● Gli script di shell


Col termine shell script si indicano generalmente file di comandi del Sistema Operativo,
scritti nel linguaggio di shell, in modo tale da risultare veri e propri programmi. Sono
principalmente usati per semplificare operazioni ripetitive, per rimpiazzare con un unico
Gli script di shell sono file di comandi comando più comandi da eseguirsi insieme, per automatizzare l’installazione di altri pro-
del Sistema Operativo. grammi, come la ricompilazione del kernel, la ricompilazione del compilatore C ecc., o per
scrivere semplici applicazioni interattive. Uno shell script si può creare come un semplice
file, usando un qualsiasi editor di testi.
Uno script di shell è come un file batch di MS-DOS, ma è più potente.
Abbiamo quindi una grande quantità di motivazioni per scrivere uno script di shell:
UÊ «Õ¢Ê«Ài˜`iÀiʈ˜Êˆ˜«ÕÌ]Ê`>ÊÕÌi˜Ìi]ÊvˆiÊiÊۈÃÕ>ˆââ>ÀˆÊÃՏœÊÃV…iÀ“œÆÊ
UÊ mÊṎiÊ«iÀÊVÀi>ÀiʈʘœÃÌÀˆÊVœ“>˜`ˆÆÊ
UÊ v>ÊÀˆÃ«>À“ˆ>ÀiʓœÌœÊ`ˆÊÌi“«œÆÊ
UÊ ÃiÀÛiÊ«iÀÊ>Õ̜“>̈ââ>ÀiÊ>V՘ˆÊVœ“«ˆÌˆÊ`ˆÊۈÌ>ʵ՜̈`ˆ>˜>Ê`ˆÊœ}}ˆÆ
UÊ ÃiÀÛiÊ«iÀÊ>Õ̜“>̈ââ>Àiʏ½>““ˆ˜ˆÃÌÀ>∜˜iÊ`ˆÊ«>ÀÌiÊ`iÊÈÃÌi“>°

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

154 Unità 5 Interazione con il Sistema Operativo


o del programma da eseguire (gli spazi sono permessi), usando un path name assoluto.
Generalmente si possono avere fino a 32 caratteri, forse di più su alcuni sistemi e si può
includere qualche opzione.

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

mentre per la shell C:

# ! /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.

verifica le tue conoscenze


1 Che cosa si intende per shell? 3 Descrivi brevemente qualche comando di Linux.
2 Quali sono le principali shell che conosci? 4 Che cos’è uno script di shell?

Lezione 3 La shell 155


5 lezione
UNITÀ
La gestione di directory
4 e file in Linux

● 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Ê vˆiʘœÀ“>ˆ\ÊÃiµÕi˜â>ÊVœ˜Ìˆ˜Õ>Ê`ˆÊV>À>ÌÌiÀˆÊV…iÊÌiÀ“ˆ˜>˜œÊVœ˜Ê՘ʓ>ÀV>̜ÀiÊ`ˆÊvˆ˜iÊvˆiÆ
UÊ directory: file che raggruppano altri file;
UÊ vˆiÊëiVˆ>ˆ\ÊV…iÊÀ>««ÀiÃi˜Ì>˜œÊˆÊ`ˆÃ«œÃˆÌˆÛˆÊ`ˆÊ˜«ÕÌÉ"ÕÌ«Õ̰

Tutte le informazioni su di un file sono memorizzate in un elemento, i-node (index node),


di una tabella. Questo elemento contiene le seguenti informazioni: tipo di file, dimensione
in byte, permessi, tipo di collegamento, id del proprietario e del gruppo ecc.).

L’organizzazione dei file viene fatta in modo gerarchico. La radice, chiamata root, è una
`ˆÀiV̜ÀÞÊiÊÈʈ˜`ˆV>ÊVœ˜ÊˆÊȓLœœÊɰ

Per indicare la posizione di un file o di una directory all’interno di un Sistema Operativo


Pathname si usano i percorsi, questi possono essere sia assoluti sia relativi. I primi (pathname asso-
luti) utilizzano come riferimento la directory principale del Sistema Operativo, quindi nel
È un percorso per identificare in un
modo univoco un file o una directory.
V>ÃœÊ `ˆÊ  1Ɉ˜ÕÝÊ >Ê À>`ˆViÊ É°Ê Ê ÃiVœ˜`ˆÊ ­pathname relativi), invece, si riferiscono alla
posizione corrente dell’utente.

˜œÌÀiÊ>V՘ˆÊV>À>ÌÌiÀˆÊ…>˜˜œÊ՘ÊÈ}˜ˆvˆV>̜ÊëiVˆ>i]ʈÊȘ}œœÊ«Õ˜ÌœÊº°»Êˆ˜`ˆV>ʏ>Ê`ˆÀiV̜ÀÞÊ
VœÀÀi˜Ìi]Ê`Õiʫ՘̈ÊÃÕVViÃÈۈʺ°°»Êˆ˜`ˆV>˜œÊ>ÊV>ÀÌi>ÊV…iÊVœ˜Ìˆi˜iʵÕi>ʘi>ʵÕ>iÊÈÊm]Ê
VˆœmʈÊ«>`À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):

tabella 1 Directory predefinite


directory contenuto
/bin comuni programmi condivisi dal sistema, dall’amministratore di sistema
e dagli utenti
/boot file di avvio e del kernel. File richiesti da Lilo
/dev file contenenti i riferimenti all’hardware periferico
/mnt directory usata per il montaggio delle periferiche
/etc file di configurazione di sistema e script di inizializzazione
/home directory home (personale) dei singoli utenti
/lib file di libreria per tutti i tipi di programmi necessari al sistema e agli utenti
/proc file system virtuale contenente informazioni sulle risorse di sistema
/root directory home dell’utente amministratore
/sbin file eseguibili utilizzati dal sistema e dall’amministratore di sistema
/tmp spazio temporaneo usato dal sistema, ripulito a ogni riavvio
/usr programmi, librerie, documentazione (manuale in linea)
/var file variabili e temporanei creati dagli utenti

156 Unità 5 Interazione con il Sistema Operativo


● Operazioni comuni sulle directory
Muoversi fra le directory
Il comando cd (change directory) permette di muoversi fra le directory; il suo utilizzo è molto
semplice, per accedere a una directory contenuta nella cartella in cui siamo digiteremo:

cd Directory

Volendosi spostare direttamente in una sua sottodirectory (anche infiniti livelli di sottodi-
rectory, non c’è un limite) basta scrivere:

cd Directory/ Sottodirectory1/ Sottodirectory2/

Visualizzare il contenuto di una directory


Il comando ls (list) serve per visualizzare il contenuto di una directory, cioè listare i file:

ls

restituirà il contenuto (directory, file e link) della directory in cui ci troviamo.


Ma ls ci può fornire molte più informazioni; associando al comando una o più delle sue
opzioni è possibile avere molti più dettagli.
Alcune tra le principali opzioni sono:
-l nell’elenco sono presenti informazioni aggiuntive;
-d esamina le directory senza elencarne il contenuto;
-a richiede un elenco completo, compresi i file invisibili;
-t ordina l’elenco in base alla data e ora dell’ultima modifica fatta;
-u ordina l’elenco in base alla data e ora dell’ultimo accesso.

Creare una directory


Il comando mkdir (make directory) serve per creare una directory, il suo uso più elementare è:
Directory
mkdir Directory È un file che contiene l’elenco dei file
o altre directory.
Per poter creare la cartella bisogna avere il permesso di scrittura nella directory padre.

Cancellare una directory


Il comando rmdir (remove directory) serve per cancellare una directory con tutto il suo
contenuto:

rmdir Directory

Il comando rm (remove) serve per cancellare una directory, ma solo se è vuota:

rm Directory

È inoltre disponibile il comando pwd (print working directory) che visualizza il nome della
directory corrente.

● Operazioni comuni sui file


Prima di vedere quali sono i principali comandi di manipolazione dei file dobbiamo ricor-
dare che per formare i nomi dei file si possono usare alcuni metacaratteri i quali sono
interpretati in modo particolare dalla shell:
* indica un gruppo di caratteri qualsiasi;
? indica un carattere qualsiasi;
[] racchiudono una lista di caratteri da considerare in alternativa.

Lezione 4 La gestione di directory e file in Linux 157


Copiare un file
Il comando cp (copy) viene usato per copiare file (comprese le directory), il suo uso più
elementare è:

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

Se la destinazione non è una directory il file viene rinominato.

File Le principali opzioni sono:


-i chiede una conferma per la sovrascrittura nel caso in cui nella destinazione esista già
Archivio, ovvero unità di memoria
logica.
un file (o directory) con quel nome;
-v stampa il nome di ogni file prima di spostarlo.

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

158 Unità 5 Interazione con il Sistema Operativo


Stampare un file
Il comando lpr serve per stampare uno o più file, il suo uso più elementare è:

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.

Cambiare i permessi ai file


Abbiamo già visto come in Linux i permessi su un file possono essere di tre tipi: r per la
lettura, w per la scrittura e x per l’esecuzione.
Inoltre essi possono essere assegnati principalmente a tre soggetti:
UÊ «Àœ«ÀˆiÌ>ÀˆœÊ`iÊvˆiÊ­user);
UÊ }ÀÕ««œÊœÃÈ>Ê}ˆÊÕÌi˜ÌˆÊ`iœÊÃÌiÃÜÊ}ÀÕ««œÊ`iÊ«Àœ«ÀˆiÌ>ÀˆœÊ­group);
UÊ >ÌÀˆÊ­others).

Il comando chmod serve per cambiare i permessi, il suo uso è:

chmod valore file

dove il valore dei permessi può essere espresso in due modi:


UÊ Vœ˜Ê˜Õ“iÀœÊœÌÌ>iÆ
UÊ Vœ˜ÊV>À>ÌÌiÀˆÊ­Õ]}]œ]>]À]Ü]Ý®°

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Ì>ÀˆœÊ­>Ê«Àˆ“>ÊVˆvÀ>®Æ
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 NESSUNPERMESSO VALORE0;
s PERMESSOLETTURA VALORE4;
Utilizzando i caratteri si seguiranno delle semplici regole:
s PERMESSOSCRITTURA VALORE2;
UÊ u identifica il proprietario (user); s PERMESSOESECUZIONE 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Ê Ãˆ“LœˆVœÊ­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

verifica le tue conoscenze


1 Che cosa si intende per case sensitive? 3 Descrivi almeno un’operazione sui file.
2 Descrivi almeno un’operazione sulle directory. 4 Come funziona il sistema di permessi in Linux?

Lezione 4 La gestione di directory e file in Linux 159


5 lezione
UNITÀ
Gestione dell’I/O: ridirezione,
5 filtri e pipe

●Lo standard input e lo standard


output
Molti comandi Linux leggono l’input, che viene dato da tastiera, come file o altro attri-
buto del comando e scrivono l’output, che appare sullo schermo. La tastiera costituisce il
dispositivo di standard input (stdin) e lo schermo o la singola finestra di terminale è invece
il dispositivo di standard output (stdout). Esiste inoltre lo standard error (stderr) che per-
mette di visualizzare i messaggi di errore, normalmente a video.
In Linux queste impostazioni di base non devono necessariamente essere applicate. Per
esempio lo standard output di un server molto usato in un grande ambiente di lavoro può
essere una stampante.
In generale si avrà la seguente situazione:
UÊ Ãiʘœ˜Êۈi˜iÊëiVˆvˆV>̜Ê>V՘ÊvˆiÊ`ˆÊˆ˜«ÕÌ]ʈÊ«Àœ}À>““>Ê«Ài˜`iʈÊÃ՜ʈ˜«ÕÌÊ`>Êstdin;
UÊ `ˆÀˆ}iʏ>ÊÃÕ>ÊÕÃVˆÌ>ʘœÀ“>“i˜ÌiÊ>Êstdout;
UÊ `ˆÀˆ}iʵÕ>Ãˆ>ÈʓiÃÃ>}}ˆœÊ`ˆÊiÀÀœÀiÊ>Êstderr.
Ogni flusso tra programma e file viene individuato, all’interno di un processo, da un descrit-
tore di file, cioè da un numero intero. Allo standard input è associato il descrittore 0, allo
standard output 1 e allo standard error 2.
Ciò ci permette di ridirigere in modo permanente uno dei flussi standard usando il suo
descrittore.

● Gli operatori di ridirezione


Si possono ridirigere i flussi standard su file mediante specifici operatori di ridirezione.

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œ˜`œÊ>Êvˆi°

comando > file


comando >> file

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.

cat fileprimo > filenuovo


cat filesecondo >> filenuovo

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

160 Unità 5 Interazione con il Sistema Operativo


Ridirezione dell’input
Questa operazione permette di considerare il file indicato come standard di input, cioè di
leggere i dati dal file e non dalla tastiera.
>ÊÀˆ`ˆÀi∜˜iÊ`i½ˆ˜«ÕÌÊۈi˜iÊv>ÌÌ>ÊVœ˜ÊˆÊVœ“>˜`œÊº<»Ê­Ãˆ“LœœÊ`ˆÊ“ˆ˜œÀi®°

comando < file

Se invece consideriamo il comando:

comando < file


righe di input
……….
……….
……….
etichetta

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:

comando < ingresso > uscita

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 >&.

(comando > uscita) >& errore

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:

Grep ‘^f’ file

selezionerà le righe che cominciano per f

Lezione 5 iÃ̈œ˜iÊ`i½É"\ÊÀˆ`ˆÀi∜˜i]ÊvˆÌÀˆÊiÊ«ˆ«i 161


UÊ head: il comando (head –n file) visualizza le prime n righe di un file o di standard input,
inviandole in standard output: n indica il numero di righe, dieci di default.
UÊ more: il comando (more file) visualizza i file di testo e lo standard output una pagina
alla volta. Visualizza le prime 23 righe del file, premendo invio si ha la riga successiva e
premendo la barra spaziatrice le 23 successive.
UÊ pr: il comando (pr file) formatta il testo con le caratteristiche desiderate, pronto per la
stampa.
Prevede una serie di opzioni, tra cui le seguenti:
-k produce l’output su k colonne;
-d indica una doppia interlinea;
-ln definisce la lunghezza della pagina di n linee (lunghezza di default 66 linee).
UÊ sort: il comando (sort file) ordina le righe di un file di testo e scrive le righe ordinate
nello standard output. È possibile specificare l’algoritmo di ordinamento, che per default
è alfabetico.
Prevede una serie di opzioni, tra cui le seguenti:
-o specifica il nome del file di output;
-u elimina le ripetizioni;
-n richiede l’ordinamento numerico;
-f non tiene conto di minuscole e maiuscole.
UÊ tail: il comando (tail -n file) visualizza le ultime n righe di un file, il numero di righe di
default è dieci. Esiste anche l’opzione +n con la quale la tail estrae le righe a partire dalla
riga n.
UÊ wc: il comando (wc file) visualizza il numero di byte, parole e righe presenti in un file
di testo.
Prevede una serie di opzioni, tra cui le seguenti:
-l per contare solo le linee;
-w per contare solo le parole;
-c per contare solo i caratteri.

ÈÃ̜˜œ]Ê ˆ˜œÌÀ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ʓœ`ˆvˆV>ÀiÊ՘ÊvˆiʓœÌœÊ}À>˜`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»ÊVˆœmʏ>Ê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ÃÃ>ÀˆœÊVœi}>À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ʏ½œÕÌ«ÕÌʈ˜Ê՘ÊvˆiÊ`ˆÊÌiÃ̜ÊVœ˜ÊˆÊVœ“>˜`œ]Êls > ls.txt, per poi visualizzarlo con
un editor di testo;

162 Unità 5 Interazione con il Sistema Operativo


UÊ ÕÃ>Àiʏ>Êpipe e ridirigere l’output direttamente a un visualizzatore di testo come more in
modo da scorrere il file.

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:

‘ls | sort | lpr’

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œ“>˜`œ\

grep Pipe file | grep -v Filtri

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.

I processi lanciati da una pipeline sono attivi contemporaneamente e sono sincronizzati


tra di loro, per esempio le due grep dell’esempio precedente saranno perfettamente sin-
cronizzate.

verifica le tue conoscenze


1 Che cosa si intende per standard input e per 3 Descrivi la ridirezione dell’input.
standard output?
4 Che cos’è la pipe e a cosa serve?
2 Dopo aver spiegato cosa si intende per filtro, descrivi
almeno un filtro di Linux.

Lezione 5 iÃ̈œ˜iÊ`i½É"\ÊÀˆ`ˆÀi∜˜i]ÊvˆÌÀˆÊiÊ«ˆ«i 163


5
UNITÀ lezione

6 Uso delle variabili

Avete ormai imparato che durante l’esecuzione di un comando o in generale nell’esecuzio-


ne di un programma, può essere necessario utilizzare delle variabili per assegnare dei valori
temporanei; queste variabili devono esistere per tutto il tempo di esistenza della shell.
Ricordiamo che le variabili sono delle parole o delle stringhe di testo che il computer usa
per contenere e rappresentare dei dati. Le variabili possono essere semplici o di ambiente.

● Variabili semplici di shell


Le variabili semplici indicano dati di vario tipo e si possono memorizzare dei valori nella
shell creando variabili mediante un’assegnazione, cioè per creare una variabile basterà darle
un’etichetta e assegnarle il valore con la seguente sintassi
nome_variabile=valore (senza lasciare spazi tra i caratteri)
Per esempio con v=7, definiremo una variabile v che contiene il dato numerico 7.
Nel caso il valore dovesse contenere degli spazi vuoti si dovrà ricorrere ai doppi apici,
come segue:
frase= “mi chiamo Pippo”
Per i nomi delle variabili di solito si usano lettere maiuscole. Inoltre è possibile utilizzare il
comando let per assegnare a una variabile il risultato di un’operazione aritmetica.
Per esempio se M e N sono due variabili alle quali è assegnato un valore numerico allora si
può assegnare alla variabile DIFFERENZA il risultato della loro sottrazione:
let DIFFERENZA=M–N
Per poter vedere tutte le variabili impostate nella shell basterà digitare il comando set,
mentre per rimuovere una variabile si utilizzerà il comando unset seguito dal nome della
Il comando echo variabile, per esempio:
Il comando echo ci serve per stam-
unset inutile
pare a video qualcosa. In questo ca-
so, vogliamo stampare a schermo il Il valore delle variabili può essere usato nei comandi successivi facendovi riferimento con
contenuto della variabile v e quindi, la seguente sintassi:
siccome è una variabile, dovrà essere
preceduta dal carattere $. Tutte le f6, 
variabili devono essere richiamate in
Il simbolo di $ prima del nome della variabile informa la shell di sostituire il nome della
questo modo. Infatti se digitassimo
semplicemente echo v otterremmo variabile con il corrispondente valore.
come output solo v, infatti in questo Per esempio se vogliamo richiamare la variabile v dobbiamo digitare: echo $v, così l’output sarà 7.
modo stiamo chiedendo al computer Le variabili di shell sono visibili solo nella shell in cui sono dichiarate, mentre non sono
di stampare a video la lettera v e non visibili in altre shell aperte o nei processi lanciati dalla shell.
la variabile v.

● 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.

164 Unità 5 Interazione con il Sistema Operativo


In un secondo tempo si possono modificare assegnando un nuovo valore.
Le variabili create o modificate hanno validità solo nella sessione, per poterle riutilizzare
esse devono essere inserite nei file di configurazione.
Alcune variabili
Si può ottenere l’elenco di tutte le variabili d’ambiente con il comando env.
d’ambiente
La shell permette di definire mediante lo strumento delle variabili d’ambiente alcuni parametri
che influenzano il comportamento dei vari programmi. Questa serie di variabili standard con- Alcune di queste variabili sono:
HOME: il valore di questa variabile è
tengono le informazioni relative agli account del computer e le impostazioni dell’ambiente di
quella della home-directory dell’utente;
lavoro. Queste variabili si differenziano dalle precedenti perché la loro modifica comporta una PATH: contiene la lista dei nomi
modifica delle impostazioni dell’account. I valori assegnati a queste variabili sono delle stringhe. delle directory dove la shell, dopo
l’inserimento di un comando, cerca
il programma da eseguire;
● Le espansioni con il simbolo $ SHELL: shell standard dell’utente;
DISPLAY: definisce lo schermo sul
Si parla di espansione o sostituzione quando la shell sostituisce dei simboli con dei valori quale un programma X-Window apri-
rà le proprie finestre;
associati. Il simbolo $ è utilizzato nell’espansione di una variabile in modo da poter sosti- TERM: definisce le sequenze di co-
tuire al nome della variabile il corrispondente valore ($VARIABILE). mandi che saranno usate per coman-
Con il $ si può anche avere l’espansione di parametro, sostituzione di comando o espan- dare il terminale che state usando;
sione aritmetica. PS1: prompt della shell;
Nell’espansione di parametro il nome del parametro o il simbolo per essere espanso può PWD: contiene il nome della directory.
essere racchiuso tra parentesi graffe, che sono opzionali, ma servono a proteggere la variabile.
>ÊvœÀ“>Ê`ˆÊL>ÃiÊ`i½ië>˜Ãˆœ˜iÊ`iˆÊ«>À>“iÌÀˆÊmʺfÊO«>À>“iÌÀœP»°ÊÊÛ>œÀiÊ`iÊº«>À>“iÌÀœ»Ê
ۈi˜iÊ ÃœÃ̈ÌՈ̜°Ê iÊ «>Ài˜ÌiÃˆÊ }À>vviÊ Ãœ˜œÊ ÀˆV…ˆiÃÌiÊ µÕ>˜`œÊ º«>À>“iÌÀœ»Ê mÊ Õ˜Ê «>À>“iÌÀœÊ
«œÃˆâˆœ˜>iÊVœ˜Ê«ˆÙÊ`ˆÊ՘>ÊVˆvÀ>]ʜʵÕ>˜`œÊº«>À>“iÌÀœ»ÊmÊÃi}Ո̜Ê`>Ê՘ÊV>À>ÌÌiÀiÊV…iʘœ˜Ê
deve essere interpretato come parte del suo nome.
-iʈÊ«Àˆ“œÊV>À>ÌÌiÀiÊ`iÊº«>À>“iÌÀœ»ÊmÊ՘ʫ՘̜ÊiÃV>“>̈ۜ]ʏ>ÊÅiÊL>ÅÊṎˆââ>ʈÊÛ>œÀiÊ
`i>ÊÛ>Àˆ>Lˆiʈ˜`ˆÛˆ`Õ>Ì>Ê`>ÊÀiÃ̜Ê`iÊºparametro»ÊVœ“iʘœ“iÊ`i>ÊÛ>Àˆ>Lˆi°Ê+ÕiÃÌ>ÊÛ>Àˆ>‡
bile è poi ampliata e il suo valore viene utilizzato nel resto della sostituzione, al posto del
Û>œÀiÊ`iÊº«>À>“iÌÀœ»ÊÃÌiÃܰÊ+ÕiÃ̜ʫÀœVi`ˆ“i˜ÌœÊÈÊV…ˆ>“>Êespansione indiretta.
La sostituzione di comando permette di sostituire il comando stesso con il suo output. La
sostituzione di comando si verifica quando un comando è racchiuso tra parentesi tonde in
questo modo:
$ (Comando)
La sostituzione di comando può avvenire anche racchiudendo il comando tra i simboli `, cioè:
`Comando`
La sostituzione di comando vale per qualsiasi comando, anche per le pipeline, ma se il
comando non dà output non viene sostituito nulla.
Per esempio:
Le sostituzioni aritmetiche possono
cat $(ls *.txt) essere nidificate. Vengono utilizzati
numeri interi a 32 bit senza controllo
visualizza tutti i file di testo della directory corrente.
su errori di overflow ma con la segna-
Con la sostituzione di comando si assegna a una variabile il risultato di un comando. lazione di divisioni per zero.
Un’espansione aritmetica permette la valutazione di un’espressione aritmetica e la sostitu- Per usare numeri ottali si devono far
precedere da O, mentre per usare
zione con il risultato. Il formato per l’espansione aritmetica è:
gli esadecimali si fanno precedere
$ ((ESPRESSIONE)) da Ox.

verifica le tue conoscenze


1 Che cosa si intende per variabile di shell e per 3 Elenca e descrivi almeno due variabili
variabile d’ambiente? d’ambiente.
2 A che cosa serve il comando echo? 4 Descrivi come avviene la sostituzione di comando.

Lezione 6 Uso delle variabili 165


5
UNITÀ lezione

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ÊۈÈLˆiÆ
UÊ ˜œ˜ÊÃۜ}iʘiViÃÃ>Àˆ>“i˜ÌiÊ՘ʏ>ۜÀœÆ
UÊ `iÛiÊiÃÃiÀiÊÀˆṎˆââ>Lˆi°

● Costruzione di uno script


Per ogni script da scrivere si devono seguire quattro regole fondamentali:
1. Tutti gli script iniziano con la seguente riga:

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:

166 Unità 5 Interazione con il Sistema Operativo


PATH=$PATH:$HOME
e infine basta scrivere il nome dello script creato:
Oppure un’alternativa per eseguire
mioprompt> stampa-home
uno script, dopo averlo editato, è
quella di rendere eseguibile il file
che lo contiene con:
● Manutenzione degli script chmod +x stampa-home

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

Il debug degli script


Quando lo script crea problemi si deve stabilire esattamente cosa porti lo script a sbagliare,
e bash fornisce estese funzionalità per la caccia agli errori.
La shell bash mette a disposizione diverse opzioni per la riga di comando che possono
essere applicate agli script e ne aiutano il debug:
-n verifica gli errori di sintassi senza dover eseguire realmente lo script;
-uÊÊÊ Ê«iÀ“iÌÌiʏ>ÊÃÕ>ÊiÃiVÕ∜˜iÊۈÃÕ>ˆââ>˜`œ]Ê«iÀ¢]ʈÊ“iÃÃ>}}ˆœÊ`½iÀÀœÀiʺunbound varia-
ble»Êœ}˜ˆÊۜÌ>ÊV…iÊÈÊViÀV>Ê`ˆÊÕÃ>ÀiÊ՘>ÊÛ>Àˆ>Lˆiʘœ˜Ê`ˆV…ˆ>À>Ì>Æ In alternativa è anche possibile
specificare tali modalità nello script
-v visualizza ogni comando prima della sua esecuzione;
stesso, aggiungendo le opzioni che
-x visualizza il risultato di ogni comando, ma in modo abbreviato. ci interessano nella dichiarazione di
Il tracciamento di ogni comando più i suoi argomenti vengono stampati nella periferica shell nella prima linea, combinando,
predefinita per l’emissione dei dati (standard output) dopo che i comandi sono stati espansi se vogliamo, le opzioni:
ma prima della loro esecuzione. #!/bin/bash –xv
Si può inoltre utilizzare il comando set, si possono far eseguire in modalità normale quelle Si può poi aggiungere il comando
parti dello script di cui siete certi che non abbiano errori e potete mostrare le informazioni echo per visualizzare i messaggi a
per la correzione solo delle parti problematiche dello script. Se non si è sicuri di ciò che video, in modo da cercare di capire
v>ÀDÊ՘Ê}i˜iÀˆVœÊVœ“>˜`œÊºcommand» si può includerlo in uno script come questo: il punto esatto dove lo script si blocca
ed eventualmente andare a verificare
set -x # attiva i controlli di correzione da qui i valori delle variabili, per vedere se i
valori sono in linea con quelli che ci
command
aspettiamo.
set +x # ferma i controlli di correzione da qui In script più avanzati, echo può es-
sere inserito per mostrare il conte-
Si possono avere le seguenti opzioni: nuto di variabili in fasi diverse dello
set –v: stampa le linee in entrata alla shell come vengono lette; script, in modo da individuare via via
i problemi.
set –x: stampa il tracciamento dei comandi prima della loro esecuzione.

verifica le tue conoscenze


1 Quali proprietà deve soddisfare uno script 3 Spiega come si inseriscono i commenti in uno script
di shell? di shell.
2 Quali regole si devono seguire per costruire 4 Spiega come si effettua il debug di uno script di
uno script di shell? shell.

Lezione 7 Script di shell 167


5
UNITÀ lezione

8 Elementi degli script di shell

● Uso delle variabili


Le variabili si dividono in globali (o variabili ambientali) le quali sono disponibili in tutte
le shell, o locali disponibili solo nella shell corrente. Usando il comando integrato set senza
alcuna opzione, apparirà un elenco di tutte le variabili e le funzioni.
Le variabili possono essere di 4 tipi:
UÊ Û>Àˆ>LˆˆÊÃÌÀˆ˜}>Æ
Variabile è un oggetto che può as-
UÊ Û>Àˆ>LˆˆÊˆ˜ÌiÀiÆ
sumere valori diversi in un insieme
di definizione. UÊ Û>Àˆ>LˆˆÊVœÃÌ>˜ÌˆÆ
UÊ Û>Àˆ>LˆˆÊ“>ÌÀˆVˆ>ˆ°
Se uno script modifica una variabile ambientale allora le sue modifiche saranno attive solo
localmente.
Le variabili, se non dichiarate come local sono considerate globali.
Abbiamo già visto che per creare una variabile basta assegnarle un valore e se essa è già
esistente si può modificare il suo valore:

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 più possibilità per fare riferimento al valore di una variabile:

$nome_var sostituisce il nome con il valore


${nome_var} serve per distinguere le variabili da un’altra stringa attaccata.

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:

${var:-stringa} se la variabile esiste e non è nulla restituisce il suo valore, altri-


menti restituisce la stringa.

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:

${nomefile%/*} se nomefile contiene un percorso elimina il nome del file e resti-


tuisce solo il percorso.

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:

command1 && command2 si esegue command2 solo se command1 è terminato


regolarmente, cioè restituisce in uscita 0.

168 Unità 5 Interazione con il Sistema Operativo


command1 // command2 si esegue command2 solo se command1 non è termi-
nato regolarmente, cioè restituisce in uscita un valore
diverso da 0.

● Uso dei parametri posizionali


Gli script possono utilizzare diversi parametri, essi possono solo essere referenziati ma non
possono essere modificati e sono locali.
Tali parametri sono identificati come $n che è la forma breve per $argv[n], con n che indica
il numero dell’argomento cioè $1 indica il primo argomento. argv è un vettore che contiene
gli argomenti passati allo script.
I parametri $n sono variabili predefinite. Si possono avere anche le seguenti variabili speciali:

tabella 1 Variabili speciali


variabili speciali definizione
$* rappresenta l’espansione di tutti i parametri posizionali tranne $0, visua-
lizzati come singola stringa dove ciascun parametro è separato da $IFS
$@ rappresenta tutti i parametri come n stringhe delimitate da doppi apici,
permette di elaborare ogni parametro separatamente
$# rappresenta il numero di parametri posizionali passati allo script
$? rappresenta il codice di uscita dell’ultimo comando
$- rappresenta l’ultimo argomento dell’ultimo comando eseguito
$$ rappresenta l’ID del processo attualmente nella shell
$! rappresenta l’ID dell’ultimo processo lanciato in background

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.

● Alcuni caratteri speciali


Il comando sh supporta una forma limitata di pattern-matching. I principali operatori sono:

tabella 2 Caratteri speciali


caratteri speciali definizione
* corrisponde a zero o più caratteri
? corrisponde a un unico carattere
[Gamma] corrisponde a un unico carattere

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.

verifica le tue conoscenze


1 Come si fa riferimento a una variabile? 3 Spiega l’uso dei caratteri speciali in uno script di shell.
4 Spiega l’uso dei parametri proposizionali in uno script
2 Che cosa sono gli operatori di stringa? di shell.

Lezione 8 Elementi degli script di shell 169


5 lezione
UNITÀ
Le istruzioni
9 di controllo e funzioni

● L’istruzione se
L’if è l’istruzione più semplice relativamente a un costrutto di controllo che si può trovare.

Possiamo avere l’if a un ramo: Possiamo avere l’if a due rami:

if la condizione è vera if la condizione è vera


then then
esegui comandi esegui comandi
fi else
esegui comandi
fi

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

ˆÃœ}˜>Êricordarsi sempre `ˆÊºV…ˆÕ`iÀi»Ê½ˆvʓiÌÌi˜`œÊ>>Êvˆ˜iʈÊVœÀÀˆÃ«œ˜`i˜ÌiÊvˆ.


Esempio:

if ((Voto>=6))
then
echo “Promosso!”
else
echo “Mi spiace…Bocciato!”
fi

La condizione può essere indicata con un’espressione condizionale tra parentesi quadre:

[ espressione ] lasciando uno spazio dopo e prima delle parentesi

o con il comando test, cioè test espressione.

Le espressioni possono essere di diverso tipo:


Espressioni con stringhe, per esempio:
stringa restituisce vero se è stata definita;
-z stringa restituisce vero se ha lunghezza uguale a zero;
-n stringa restituisce vero se ha lunghezza diversa da zero;
stringa1 = stringa2 –z restituisce vero se sono uguali;
stringa1! = stringa2 –z restituisce vero se sono diverse.

170 Unità 5 Interazione con il Sistema Operativo


Espressioni con i numeri interi:
v1 –eq v2 restituisce vero se i valori sono uguali;
v1 –ne v2 restituisce vero se i valori sono diversi;

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ÕˆÊ Ûˆi˜iÊ
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\ʺvˆ˜V…jÊmÊÛiÀ>ʏ>ÊVœ˜`ˆâˆœ˜iʘiiÊ«>Ài˜ÌiÈ]ÊiÃi}ՈʏiÊ
istruzioni tra do e done»°Ê iÊ˜œÃÌÀœÊV>Ü]ʏ>ÊVœ˜`ˆâˆœ˜iÊ`>ÊÛiÀˆvˆV>À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 è:

for elemento in lista (lista può essere zero o più parole)


do
istruzioni
done

Lezione 9 Le istruzioni di controllo e funzioni 171


˜iÊ ˆ˜}Õ>}}ˆœÊ Vœ“Õ˜iÊ ÃˆÊ «œÌÀiLLiÊ `ˆÀi\Ê º«iÀÊ œ}˜ˆÊ elemento presente nella lista esegui i
comandi compresi tra do e done»°Ê*œÃÈ>“œÊ˜œÌ>ÀiÊ՘½ˆ“«œÀÌ>˜ÌiÊV>À>ÌÌiÀˆÃ̈V>ÆÊˆÊVˆVœÊfor
consente di definire una variabile, proprio come read e l’assegnazione tramite l’operatore =.

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.

Una funzione è definita utilizzando

[ function ] Nome () {
comandi
}

Se analizziamo la sintassi vediamo che la parola chiave function è tra parentesi quadre
poiché è opzionale, infatti possiamo analogamente scrivere

function Nome () { Nome () {


comandi comandi
} }

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.
Ê«œÃÈLˆiÊÀiˆ˜`ˆÀˆââ>ÀiÊ՘>Êv՘∜˜iÊ`ˆÊÉ"]Ê«Àœ«ÀˆœÊVœ“iʵÕ>Ãˆ>ÈÊ>ÌÀœÊ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:

172 Unità 5 Interazione con il Sistema Operativo


local [VARIABILE[=VALORE]]

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

Il comando typeset –f elenca tutte le funzioni definite.

verifica le tue conoscenze


1 Descrivi sintassi e uso dell’istruzione if. 3 Descrivi sintassi e uso dell’istruzione for.
2 Descrivi sintassi e uso dell’istruzione while. 4 Come si usano le funzioni in uno script?

Lezione 9 Le istruzioni di controllo e funzioni 173


unità

5 sintesi

lezione 1 Il Sistema Operativo come interfaccia


Ogni personal computer viene solitamente dotato di un Sistema Operativo. Dopo l’in-
stallazione si deve provvedere all’attivazione cioè alla fase di bootstrap. Dopo aver ef-
fettuato l’attivazione del SO, la comunicazione può avvenire tramite interfaccia grafi-
ca (GUI), comandi (CLI) tramite chiamate di sistema. Ciascuna interfaccia presenta sia
vantaggi che svantaggi.

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.

lezione 4 La gestione di directory e file in Linux


I file in Linux possono essere lunghi fino a 255 caratteri e i nomi sono case sensitive;
inoltre in Linux non viene richiesta l’estensione dei file. È possibile effettuare tutta una
serie di operazioni sia su directory sia su file. Inoltre si può anche agire sui permessi di
accesso ai file.

lezione 5 Gestione dell’I/O: ridirezione, filtri e pipe


In Linux normalmente la tastiera costituisce il dispositivo di standard input (stdin),
lo schermo o la singola finestra di terminale è invece il dispositivo di standard output
(stdout). Lo standard error (stderr) permette di visualizzare i messaggi di errore ed è
normalmente a video. Si possono ridirigere i flussi standard su file mediante specifici
operatori di ridirezione. Esistono anche i filtri e le pipe che ci permettono di manipo-
lare l’output.

174 Unità 5 Interazione con il Sistema Operativo


unità

lezione 6 Uso delle variabili


Anche nella shell di Linux si possono usare le variabili che possono essere semplici o di
ambiente. Inoltre si può avere l’espansione o la sostituzione di variabili, espressioni e
comandi quando la shell sostituisce dei simboli con dei valori associati.

lezione 7 Script di shell


Le shell sono degli interpreti di un linguaggio, detto linguaggio di shell, e utilizzano i
comandi di tale linguaggio. Si possono realizzare dei programmi detti script di shell. Per
ogni script da scrivere si devono seguire quattro regole fondamentali. La manutenzione
degli script si fa tramite i commenti e il debug.

lezione 8 Elementi degli script di shell


Gli elementi fondamentali di uno script di shell sono: variabili locali e globali; operato-
ri di stringa, di controllo di contenuto (PATH) e di controllo (&&ÊiÊÉÉ®°Ê˜œÌÀiÊ}ˆÊÃVÀˆ«ÌÊ
possono utilizzare diversi parametri posizionali locali; essi possono solo essere referen-
ziati, ma non possono essere modificati.

lezione 9 Le istruzioni di controllo e funzioni


Le principali istruzioni di controllo sono: if, while e for. Il loro uso è simile a quello fat-
to negli altri linguaggi di programmazione tranne per la for, che prevede una sintassi
diversa. Naturalmente le condizioni su cui lavorano si possono ricavare utilizzando gli
operatori logici. Si possono anche utilizzare le funzioni, cioè dei mini-script all’interno
di uno script.

Unità 5 Interazione con il Sistema Operativo 175


unità

5 domande per l’orale

unità 5 Interazione con il Sistema Operativo


Ripasso MP3 1 Descrivi i principali tipi di interfaccia che conosci.

➞ L1

2 Spiega quali sono le caratteristiche più importanti di Linux.

➞ L2

3 Illustra come avviene la gestione dei file in Linux.

➞ L2

4 Illustra l’importanza della shell di Linux.

➞ L3

5 Descrivi i principali comandi di Linux.

➞ L3

6 Descrivi i principali comandi relativi alla gestione di file e directory


in Linux.

➞ L4

7 Descrivi come avviene la ridirezione dell’I/O in Linux?

➞ L5

8 Descrivi i principali filtri di Linux?

➞ L5

9 Dopo aver definito variabili di shell e d’ambiente, descrivi le princi-


pali variabili d’ambiente.

➞ L6

176 Unità 5 Interazione con il Sistema Operativo


unità
domande per l’orale 5
10 Come si procede per realizzare uno script di shell?

➞ L7

11 Descrivi quali sono i principali elementi di uno script di shell.

➞ L8

12 Descrivi le principali istruzioni di controllo che conosci.

➞ L9

Unità 5 Interazione con il Sistema Operativo 177


unità

5 preparati al compito in classe

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.

178 Unità 5 Interazione con il Sistema Operativo


9 Per leggere il contenuto di un file possono essere usati tre comandi:
1. cat che mostra semplicemente il contenuto del file, il suo uso è:
cat nomefile
2. less che legge il documento pagina per pagina; è possibile scorrere il testo usando le frecce e uscire
dalla lettura premendo il tasto q, il suo uso è:
less nomefile
3. more che permette di controllare in modo più efficiente la visualizzazione, il suo uso è:
more nomefile
10 A fine operazione il file Pluto conterrà i dati del file Pippo e in coda quelli del file Topolino, concatenan-
do così i tre file.
11 Il commando (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.
Per selezionare tutte le righe che cominciano per t userò il comando: grep ‘^t’ file.
12 Il comando ‘pr’ prende lo standard output del comando ‘ls’ lo formatta mettendo il testo su 3 colonne e
ridirige il suo standard output allo standard input del comando ‘lpr’. Quindi la linea di comando manda
il listato ordinato alla stampante.

compito in classe proposto Verifica


1 Quale comando permette di conoscere con 8 Qual è il comando per cambiare i permessi
quale identità si sta operando? dei file? Qual è il suo uso?
2 Cosa realizza il comando shutdown. 9 Con quale comando si possono creare file
Quali limiti presenta? vuoti?
10 A cosa serve il comando sort ?
3 L’utente normale può cambiare la propria
password? Qual è la procedura? Può cambiare 11 Cosa produce la seguente sequenza
solo la propria o anche quella di un altro di comandi?
utente?
comando < file
4 Per controllare in quale directory sono, righe di input
quale comando devo digitare? ……….
……….
5 Cosa realizza il seguente comando: $ cd ……….
bin [Invio] ? Si fa riferimento a un percorso Etichetta
assoluto o relativo?
12 Cosa si visualizza a video dopo la seguente
6 Come faccio a sostituire la directory personale
sequenza di comandi:
di un particolare utente?
7 Cosa produce il seguente comando: $ v=13
ls [Invio]? echo $v

Unità 5 Interazione con il Sistema Operativo 179


unità

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ÊvˆiÊÃÞÃÌ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
º,   »ÊvˆiʈÃÊ`ˆvviÀi˜ÌÊvÀœ“Ê̅iʺÀi>`“i»Êvˆi° 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À»°

180 Unità 5 Interazione con il Sistema Operativo


Unità
Il ciclo di sviluppo
6
Competenze
Sviluppare applicazioni informatiche per reti locali o servizi a distanza.
Gestire progetti secondo le procedure e gli standard previsti dai sistemi aziendali di
gestione della qualità e della sicurezza; gestire processi produttivi correlati a funzio-
ni aziendali.

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.

Accertamento dei prerequisiti


1 Un vettore è una variabile: c output all’interno di due cicli in sequenza
a semplice numerica d output all’interno di due cicli annidati
b semplice alfanumerica 4 Per accedere a un campo di un elemento di una
c strutturata che può contenere solo numeri tabella occorre specificare:
d strutturata che può contenere numeri o stringhe
a il nome della tabella
2 A un elemento di un vettore si accede: b il nome della tabella e l’indice dell’elemento
a specificando il nome del vettore e l’indice c il nome della tabella e il nome del campo
dell’elemento d il nome della tabella, l’indice dell’elemento e il nome
b scrivendo il nome del vettore del campo
c scrivendo l’indice 5 Scrivi un programma organizzato in procedure,
d specificando il nome del vettore, la riga e la colonna che carichi in un vettore una serie di numeri e
relativi all’elemento permetta di calcolare il massimo e il minimo tra
3 Per visualizzare il contenuto di una matrice questi.
occorre utilizzare un’istruzione di: 6 Descrivi come funziona l’algoritmo per la ricerca
a output dicotomica e quali sono i presupposti per poterlo
b output all’interno di un ciclo applicare.
6
UNITÀ lezione
Ingegneria del software
1
● Software Engineering
Il mercato odierno dell’informatica è caratterizzato da costi dell’hardware in continua dimi-
nuzione (circa il 30% del totale) e costi del software in continua crescita (circa il 70% del
totale).
Se da una parte le prestazioni dell’hardware migliorano vertiginosamente, dall’altra i siste-
mi software non sempre sono in grado di avere prestazioni corrispondenti.

! 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).

! Il software engineering è l’applicazione di un approccio sistematico, disciplinato e quantificabile


allo sviluppo, all’esercizio e alla manutenzione del software, cioè l’applicazione dell’ingegneria
al software.

● Utilità dell’ingegneria del software


Per capire meglio perché è importante studiare questa parte facciamoci aiutare da un
esempio in cui si vede che cosa succede normalmente quando un cliente desidera far rea-
lizzare qualcosa a qualcuno. Nel nostro caso consideriamo la produzione di un’altalena,

182 Unità 6 Il ciclo di sviluppo


ma l’esempio potrebbe andare bene anche per una casa o per
un programma software (figura 1).

Nella fase di richiesta da parte del committente e nella conse-


guente proposta da parte del venditore, il cliente (che non è
in grado di realizzare da solo l’oggetto) e il fornitore parlano
normalmente due linguaggi diversi e rischiano di non capirsi
e di fraintendersi.
Infatti, il primo è interessato a utilizzare l’oggetto e non com-
prende il linguaggio tecnico usato da chi lo deve costruire
figura 1 Ciò che il cliente ha sempre detto di volere
e far funzionare, mentre il secondo non sempre conosce a
fondo le problematiche legate alle reali esigenze del cliente.
Inoltre, potrebbe trattarsi solo di un venditore, con scarse
conoscenze delle problematiche realizzative. Il risultato è che
ciò che viene ordinato e che quindi si decide di realizzare, è
un qualcosa di strano, probabilmente irrealizzabile e senza
alcuna utilità (altalena con due corde e tre seggiolini della
figura 2) anche se sia il cliente sia il fornitore sono convinti
del contrario e credono di avere descritto e definito qualcosa
di estremamente ragionevole.

figura 2 Ciò che ha chiesto e gli è stato venduto

La fase successiva è la stesura delle specifiche, in cui il vendi-


tore spiega che cosa costruire al tecnico che dovrà progettare
e realizzare l’oggetto, a partire da ciò che ha capito essere le
esigenze del cliente.
Nella figura 3 viene evidenziato come anche in questa
fase è possibile descrivere qualcosa di diverso dal progetto
originale e non ragionevole, poiché vi sono stati errori nella
comunicazione e sono state tralasciate alcune informazioni.

figura 3 Come sono state stese le specifiche

A partire da queste specifiche, interpretando a volte i dati in


modo personale per sopperire alla mancanza di informazio-
ni più dettagliate e all’impossibilità di ricontattare il cliente,
lavorando spesso in modo scoordinato perché il lavoro è stato
diviso in gruppi che non si scambiano informazioni, il progetto
viene in qualche modo portato a termine (figura 4) e con-
segnato al cliente.

figura 4 Come è stato realizzato il sistema

Questi ovviamente si rende conto che il sistema non funziona


come sperava (quando funziona!) e che è diverso da come gli
era stato promesso dal venditore e da ciò che lui si aspettava.
Chiede, quindi, che venga modificato affinché almeno qualco-
sa funzioni (per esempio, che l’altalena dondoli) e il fornitore
lo accontenta facendo dondolare in qualche modo l’altalena
(figura 5).

figura 5 Come è stato fatto funzionare

Lezione 1 Ingegneria del software 183


Tutto questo per poi scoprire che le reali esigenze del cliente
erano molto più limitate rispetto a ciò che era stato richiesto
e che era stato prospettato dal venditore (figura 6).

Se su un esempio macroscopico come quello dell’altalena le


contraddizioni e i paradossi emergono subito fin dalle prime
fasi (si tratta pur sempre di un oggetto tangibile e di uso comu-
ne), la possibilità che su un progetto software avvenga ciò che
abbiamo descritto è quasi una certezza ed è molto più difficile
rendersene conto, se non alla fine del lavoro.
figura 6 Ciò di cui il cliente aveva realmente bisogno Ciò che succede in un progetto software è che le funzioni che
si desidera vengano svolte da un programma vengono gene-
ralmente descritte in modo superficiale, poiché il cliente il più delle volte ha le idee poco
chiare. Nella realizzazione pratica vengono spesso dimenticate alcune parti e vengono male
interpretate certe informazioni, mentre nella fase di verifica gli errori trovati vengono risolti
il più delle volte in modo approssimativo e affrettato (il tempo non basta mai), senza con-
trollare l’impatto che certe modifiche potrebbero apportare ad altre parti del programma,
con il rischio quindi di introdurre nuovi errori. La conseguenza è la realizzazione di un
programma che non rispetta le richieste del cliente o meglio, non fa quello che il cliente
pensava di aver chiesto.

● Attori del progetto


Per attori intendiamo tutte quelle persone che a vario titolo sono coinvolte nel progetto e
prendono il nome di stakeholder; possiamo suddividerli in 2 gruppi principali:
UÊ clienti (utilizzatori del sistema e/o committenti del lavoro);
UÊ fornitori (coloro che sviluppano e vendono il software).

In molti casi possiamo distinguere il cliente/utente e il cliente/committente. Nel primo caso


ci riferiamo alla persona che effettivamente utilizzerà il sistema e per identificarlo useremo
il termine “utente finale” o “end user”. Nel secondo caso si parla di chi ha commissionato il
lavoro e paga il sistema. Potrebbe essere il responsabile del settore di utilizzo del software
o il proprietario dell’azienda che acquista il prodotto.

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.

I moderni processi di sviluppo sono in genere iterativi e incrementali, poiché man


mano che il progetto si sviluppa le varie fasi vengono riprese con l’aggiunta di ulteriori
dettagli.
La modulizzazione del progetto permette di dominarne la complessità, permettendo la
suddivisione dei lavori tra più partecipanti.

184 Unità 6 Il ciclo di sviluppo


● Linguaggi e strumenti
di modellazione
Lo sviluppo del prodotto porta alla necessità di avere linguaggi e strumenti per modellare,
comunicare e documentare gli elementi del progetto. Il linguaggio deve essere unico per
l’analisi e il progetto del software, comprensibile anche ai non esperti in modo che cliente
e fornitore possano comunicare direttamente e vengano eliminati i problemi di traduzione.
Per far questo è importante che il linguaggio abbia una forte componente visuale.
Il linguaggio di progettazione oggi più diffuso è UML (Unified Modeling Language).
È importante avere anche strumenti e metodi per il controllo su tutti gli oggetti prodotti
durante il lavoro, gestione della documentazione collegata e possibilità di tenere traccia
delle modifiche ai sorgenti, agli oggetti e al codice eseguibile. Questi strumenti vengono
chiamati CASE (Computer Aided Software Engineering), cioè strumenti che aiutano a
memorizzare i dati in un repository e aiutano anche graficamente a descrivere il progetto.

● Gestione del progetto


Il progetto va seguito e gestito sia dal punto di vista tecnico sia da quello gestionale.
Troppo spesso si finisce, anche a fronte di specifiche ben definite, di fare di testa propria,
oppure di consultare poco il progetto. Il rischio è di trovarsi nel momento realizzativo a
rifare passi già compiuti in precedenza (per esempio decisioni su certe variabili) duplican-
do gli sforzi per ritrovare la stessa soluzione già individuata, oppure introducendo errori o
inconsistenze, per non aver tenuto conto di tutti i fattori già considerati.
La figura del capo progetto è quindi molto importante, sia per suddividere il lavoro tra i vari
sviluppatori, sia per gestire l’interazione con il cliente.

●Il problema dell’ingegneria


del software
I principali problemi che portano al fallimento nello sviluppo di un progetto possono rias-
sumersi nei seguenti punti:
UÊ Incomprensioni tra clienti e fornitori.
Le necessità dei clienti non vengono spesso comprese in modo adeguato dal fornitore.
Questa difficoltà è principalmente dovuta al fatto che gli interlocutori non parlano un
linguaggio comune. La parola VIAGGIO, può essere per esempio intesa da un turista
come l’insieme dei tragitti (anche con mezzi diversi) che gli permetteranno di raggiunge-
re un certo luogo turistico distante da casa sua; per l’agenzia sarà l’insieme delle attività
che il turista acquista pagando un certo prezzo (spostamento in treno o aereo, soggior-
no in albergo ecc.); per il capitano di una nave il viaggio è il singolo tragitto che il suo
mezzo compie da una località a un’altra.
UÊ Formalizzazione insufficiente delle decisioni.
I problemi nascono quando non viene formalizzato a sufficienza tutto ciò che è stato
detto e deciso. I requisiti dei clienti sono espressi in modo non chiaro e ambiguo, le
richieste del cliente cambiano in modo frequente e spesso non sono realistiche. Molto
spesso le cose si dicono o si sottintendono, senza lasciare traccia di queste decisioni.
In questo modo è facile che alcune informazioni vadano perse.

verifica le tue conoscenze


1 Che cosa si intende per ingegneria del software? 3 Che cosa vuol dire riutilizzare il software?
2 Che cosa vuol dire progettare il software? 4 Perché è importante documentare il software?

Lezione 1 Ingegneria del software 185


6
UNITÀ lezione
Il ciclo di vita del software
2
● Le fasi
Analisi
Il ciclo di sviluppo prende anche il nome di ciclo di vita del software. Con questo termine si
intende l’insieme delle fasi che accompagnano un programma durante tutta la sua vita, dal
momento in cui viene pensato al momento in cui viene cancellato perché non più utilizza-
to. L’attività di produzione del software viene normalmente suddivisa in fasi (figura 1).
Progetto
Le fasi vengono spesso suddivise in sottofasi. Ogni fase (e/o ogni sottofase) genera normal-
mente uno o più output che possono essere dei documenti e delle componenti software.
Nel caso che durante una delle fasi ci si accorga di errori nei documenti o ci si trovi di
fronte a situazioni che ci obbligano a dei ripensamenti, è possibile ripetere la fase prece-
Realizzazione dente modificando i relativi documenti.

figura 1 Ciclo di ● Analisi del problema


sviluppo del software
L’analisi comprende tutta la parte in cui si analizza il problema e le esigenze dell’utente, si
capisce quello che si vuole realizzare, tenendo presente gli obiettivi. Può essere suddivisa in
due sottofasi:
UÊ Definizione dei requisiti.
Per requisiti intendiamo i servizi attesi dal sistema e i vincoli cui il sistema deve sottostare.
In questa fase si esaminano a fondo le esigenze degli utenti effettuando con essi ripetuti col-
loqui e facendosi aiutare da esperti del settore. Si verificano le risorse, non solo finanziarie,
che possono essere utilizzate sia in termini di mezzi operativi quali l’hardware e il software,
sia per quanto riguarda il personale impiegabile per le varie fasi (progetto, programmazio-
ne, test ecc.). Viene verificato che le esigenze degli utenti siano effettivamente realizzabili
e che le risorse disponibili siano sufficienti. Se per esempio vi è l’esigenza di andare da
Milano a Roma in automobile impiegando al massimo 4 ore, trasportando 5 persone e
consumando 20 litri di benzina ci si renderà conto che la cosa non è fattibile. Bisognerà
ridurre alcune delle richieste (per esempio ampliando il tempo massimo) o aumentare le
risorse disponibili (carico di benzina). Questa fase termina con la definizione dello Studio di
Fattibilità, cioè un documento in cui si definisce appunto se un progetto è o non è fattibile
e a quali condizioni. Possono anche essere evidenziate una o più ipotesi risolutive.
UÊ Specifica dei requisiti.
È la sottofase in cui si provvede alla modellazione dei requisiti utilizzando varie tecni-
che. In pratica si definisce cosa deve fare il sistema e non come deve essere realizzato.
L’obiettivo è definire i dati e le funzionalità necessarie.
Vengono dettagliate le funzioni che dovrà avere il sistema in modo ancora indipendente
da come verranno poi realizzate. Per esempio si definirà che il programma dovrà visua-
lizzare i dati di un cliente reperito da un archivio, senza specificare come avviene l’acces-
so all’archivio e come sono visualizzati i dati (solo nome e cognome o anche l’indirizzo).
È importante che i termini del problema siano analizzati con il linguaggio dell’utente
evitando di ragionare con termini prettamente informatici.

● 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

186 Unità 6 Il ciclo di sviluppo


due principali sottofasi durante le quali vengono generati i seguenti documenti (uno per
ogni sottofase): l’architettura di progetto (come vengono organizzate le componenti software)
e il disegno di dettaglio (“come” implementare le componenti).
UÊ Architettura di progetto.
In questa fase viene impostata la soluzione generale definendo bene le strutture dei dati (in
particolare quelli di input e di output) e descrivendo a grandi linee la struttura e il funziona-
mento di ogni componente (programma o sottoprogramma) che dovrà far parte del sistema.
UÊ Disegno di dettaglio.
Viene approfondito il progetto dal punto di vista realizzativo, e vengono descritte le
specifiche di dettaglio utilizzando un opportuno linguaggio di progetto o un flow-chart.
Vengono cioè descritte, per tutte le parti componenti il prodotto finale, le modalità di
interazione coi dati e tra loro e gli algoritmi di funzionamento.

● 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.

verifica le tue conoscenze


1 Che cos’è il ciclo di vita del software? 3 Che cosa si fa durante l’analisi?
2 Quali sono le principali macrofasi? 4 Quali sono le fasi della progettazione?

Lezione 2 Il ciclo di vita del software 187


6
UNITÀ lezione
Manutenzione e gestione del progetto
3
● Manutenzione
La fase di manutenzione accompagna la vita di un prodotto software da subito dopo il suo
rilascio fino alla sua fine, cioè fino al momento in cui non verrà più utilizzato. Vi sono varie
tipologia di manutenzione:
UÊ Manutenzione correttiva.
La più diffusa attività di manutenzione si ha quando si evidenziano malfunzionamenti
dovuti a casi particolari non sufficientemente testati o non considerati. È da ricordare
che pur in presenza di test e prove molto approfondite, è sempre possibile che si pre-
sentino dei casi non previsti.
Un tipico esempio è stato il problema “ANNO 2000” anche conosciuto con il termine
“millennium bug”. I programmi realizzati negli anni Sessanta e Settanta, per ottimizzare il
codice e risparmiare memoria, utilizzavano nella gestione delle date solo le ultime due cifre
per indicare l’anno. I programmi che hanno adottato questa impostazione hanno funzio-
nato perfettamente per anni, ma con l’avvicinarsi del cambio di secolo si sono cominciate
a verificare delle anomalie. Infatti dovendo gestire date posteriori all’anno 2000, avendo a
disposizione solo due cifre, queste risultavano per il sistema anteriori alle date di fine seco-
lo. Il 17 febbraio 2003 (memorizzato come “17-02-03”) veniva infatti considerato minore
del 24 marzo 1999 (24-03-99). Il problema è subito risultato molto serio perché, per esem-
pio, da un magazzino hanno cominciato a uscire prima i prodotti con scadenza posteriore
al 2000 lasciando in giacenza quelli con scadenza a fine secolo. Questa impostazione non
era più accettabile e i programmi hanno dovuto essere modificati in modo opportuno.
UÊ Manutenzione adattiva.
Un altro tipo di manutenzione è la modifica nel tempo di funzionalità esistenti per ade-
guarle alle mutate condizioni, in particolare quando si tratta di programmi gestionali e
contabili che devono adeguarsi alle variazioni fiscali (aliquote, esenzioni, nuovi adempi-
menti o modalità di calcolo ecc.) o a mutate condizioni sociali (introduzione dell’euro).
UÊ Manutenzione evolutiva.
Vi è poi la manutenzione di tipo migliorativo (o accrescitivo) in cui avviene l’introdu-
zione di nuove funzionalità che soddisfino nuove esigenze dell’utenza sorte dopo lo
sviluppo del prodotto. Per esempio il calcolo e la stampa di statistiche o nuovi prospetti,
o la gestione automatica di attività fatte manualmente.

● 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

188 Unità 6 Il ciclo di sviluppo


alcune delle informazioni sul progetto e sullo sviluppo sono ormai andate perse. Non è raro il
caso in cui in questa situazione la documentazione venga fatta fare a persone momentaneamen-
te libere ma poco a conoscenza del progetto, poiché le persone che hanno realmente realizzato
il sistema sono ormai impiegate in altri lavori.

● 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

figura 3 Costo medio di un errore

verifica le tue conoscenze


1 Che cosa si intende per manutenzione? 3 Perché costa di più correggere un errore se il
software è in esercizio rispetto alla fase di progetto?
2 Che caratteristiche deve avere un software per
essere di qualità? 4 Descrivi il problema “Anno 2000”.

Lezione 3 Manutenzione e gestione del progetto 189


6 lezione
UNITÀ
Approccio metodologico
4 ai progetti

● Che cos’è una metodologia


Una metodologia è un insieme di metodi, procedure, regole, standard, tecniche e linguaggi.
Una metodologia per essere tale deve soddisfare le seguenti condizioni:
UÊ documentata (esiste un insieme di documenti che descrivono la metodologia stessa,
le procedure di cui si compone, il prodotto di ogni procedura);
UÊ ripetibile;
UÊ trasferibile (persone qualificate possono essere istruite alla comprensione e all’uso della
metodologia);
UÊ basata su tecniche consolidate (implementa, magari modificandole, tecniche provate
e accettate);
UÊ validata (è stata utilizzata con successo su un numero significativo di applicazioni);
UÊ appropriata (idonea al contesto).
Tempo Esistono varie metodologie di progetto che si sono sviluppate negli anni per venire incon-
tro alle esigenze dei progettisti e dei programmatori. I primi approcci proponevano sempli-
cemente alcune modalità di descrizione della documentazione del software prodotto, men-
tre con lo sviluppo delle tecniche e il mutare delle esigenze si sono poi sviluppati metodi
ni

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“>Æ

rappresentazione aspetti coperti proprietà


Jackson funzionali e dati rappresentazioni degli algoritmi; ordinamento dei dati;
ordinamento delle azioni
Warnier funzionali e dati rappresentazioni degli algoritmi; ordinamento dei dati;
ordinamento delle azioni
diagrammi di flusso analisi funzionale consolidata nel tempo
pseudocodifica funzionale rappresentazioni degli algoritmi
flusso dei dati e delle funzioni che flusso di informazioni; dipendenza di operazioni da altre
DFD - Data Flow
agiscono su loro e con certe estensioni operazioni
Diagram
gestione anche del tempo

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

190 Unità 6 Il ciclo di sviluppo


UÊÊ>ëiÌ̜ÊÌi“«œÀ>i\ʵÕ>˜`œÊ`iۜ˜œÊiÃÃiÀiÊv>ÌÌiÊiÊVœ“iÊÈÊ`iۜ˜œÊȘVÀœ˜ˆââ>ÀiÊ­Vœ˜ÌÀœœÊ
del sistema rispetto al tempo e della reazione dello stesso agli eventi);
UÊÊ>ëiÌ̜Ê`iˆÊ`>̈\ÊVœ“iÊÛ>˜˜œÊ`iÃVÀˆÌ̈ʈÊ`>̈ÊÃÕÊVՈʏiÊÛ>ÀˆiÊVœ“«œ˜i˜ÌˆÊ`iÊÈÃÌi“>Ê`iۜ˜œÊ
lavorare.

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.

● Confronto tra metodologie


Non esiste la metodologia migliore. In base al tipo di applicazione (gestionale, di servizio,
da ufficio ecc.), all’attività (ripetitive o estemporanee), al numero di utenti (molti/pochi),
modelli diversi hanno risultati diversi. Esistono però nella realtà particolarità ed eccezioni
che non sempre si riesce a rappresentare in modo completo.
Viene mostrato nella tabella sotto il confronto tra alcune metodologie con l’indicazione del
grado di copertura dei vari aspetti (funzioni, tempi, dati).

funzionale temporale dati

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

A: alta; M: media; B: bassa

●Approccio strutturato e approccio


Object-Oriented
Ultimamente il software è diventato sempre più interattivo e guidato dagli eventi. Il
software convenzionale è sempre stato gestito in modo ottimale dall’ “Approccio struttura-
to”. Invece i sistemi più moderni con interfacce interattive e grafiche (GUI) richiedono la
programmazione a oggetti e in questi casi l’approccio “Object-Oriented” è il modo migliore
per progettare software ottimale.
In questa Unità di apprendimento affronteremo l’Approccio strutturato, mentre nella succes-
siva vedremo l’approccio Object-Oriented.

verifica le tue conoscenze


1 Che cos’è una metodologia? 3 Qual è la metodologia migliore per gestire gli aspetti temporali?
4 Che metodologia useresti se devi gestire aspetti temporali,
2 Quali sono le principali metodologie? funzionali e di dati?

Lezione 4 Approccio metodologico ai progetti 191


6
UNITÀ lezione
Modelli di approccio strutturato
5
● Differenti modelli
Un modello di processo non costituisce di per sé una metodologia e non fornisce regole o
rappresentazioni per le fasi di cui si compone, ma costituisce piuttosto un riferimento per
il processo di realizzazione del software.
Esistono varie filosofie per approcciare il ciclo di vita del software, ma le principali sono il
modello a cascata e la prototipizzazione.

● 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

figura 1 Modello a cascata

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

192 Unità 6 Il ciclo di sviluppo


specifiche e il ripercorrere tutte le fasi portano a un notevole spreco di tempo e di denaro.
In virtù dell’esperienza fatta, la rigidità originaria dello schema è stata mitigata nelle
applicazioni attuali attraverso la possibilità di avere feedback tra le varie fasi e una
maggiore frammentazione delle stesse, per favorire da un lato un controllo di maggior
dettaglio e dall’altro il parallelismo di esecuzione di attività (task) appartenenti a una
stessa fase.

● 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Ê `ˆvvˆVœÌDÊ`ˆÊvœÀ“>ˆââ>Àiʈ˜Ê“œ`œÊ˜œ˜Ê>“Lˆ}՜ÊiÊ>`iÀi˜ÌiʈÊÀiµÕˆÃˆÌˆÆ
UÊ VœÃ̈ÊiiÛ>̈ʫiÀʏ>ʓœ`ˆvˆV>Ê`iˆÊÀiµÕˆÃˆÌˆÊˆ˜Êv>ÈÊ>Û>˜â>ÌiÊ`ˆÊÀi>ˆââ>∜˜i°

La prototipizzazione rapida (figura 2) prevede la costruzione di prototipi durante le


prime fasi di sviluppo di un sistema.

ASCOLTARE COSTRUIRE
IL CLIENTE IL MODELLO

TEST
DEL CLIENTE

figura 2 Prototipizzazione rapida

È importante notare la differenza tra un prototipo e il sistema finale, poiché il prototi-


po implementa solo una parte delle funzionalità richieste al sistema. Questo approccio
permette al committente di simulare l’uso del sistema finale utilizzando il prototipo,
consentendo di evidenziare fin dalle prime fasi del progetto eventuali incongruenze o
problemi.
Tra gli scopi c’è quello di evidenziare con maggior chiarezza le funzionalità necessarie del
sistema, le sequenze operative, le necessità degli utenti, i requisiti di rappresentazione dei
dati, il “look and feel” dell’interfaccia.
Questo approccio risulta ottimale quando ricorrono certe situazioni quali:
UÊ ÀiµÕˆÃˆÌˆÊÜvÌÜ>Àiʈ˜ˆâˆ>“i˜ÌiÊVœ˜vÕÈÊiʓœÌœÊ}i˜iÀˆVˆÆ
UÊ Ìi>“Ê`ˆÊ«Àœ}iÌ̜ʈ˜vœÀ“>iÊiÊÃV>ÀÈÌDÊ`ˆÊÀˆÃœÀÃiÆ
UÊ Vœ““ˆÌÌi˜â>ʈ˜`ˆÃ«œ˜ˆLˆiʜʈ“«œÃÈLˆˆÌ>Ì>Ê>Ê`ivˆ˜ˆÀiÊÌÕÌ̈ʈÊÀiµÕˆÃˆÌˆÆ
UÊ ÃˆÃÌi“ˆÊˆ˜vœÀ“>̈ۈÊ`ˆÊ«ˆVVœiɓi`ˆiÊ`ˆ“i˜Ãˆœ˜ˆ°

Lezione 5 Modelli di approccio strutturato 193


● Prototipi “usa e getta”
L’implementazione di prototipi avviene durante le fasi iniziali del progetto. I prototipi
sono sviluppati per comprendere gli aspetti più oscuri del progetto, per provare alcune
soluzioni, per mostrare al committente alcune funzionalità. Vengono poi abbandonati per
effettuare la costruzione del sistema finale, eventualmente anche con l’approccio “a casca-
ta” anche se a volte alcune componenti (una procedura, una videata ecc.) possono essere
riutilizzate. In questo caso si parla di “prototipi usa e getta”.

● 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).

Studio di Analisi Disegno


fattibilità funzionale generale

Disegno di Disegno di Disegno di


dettaglio dettaglio dettaglio

Realizzazione Realizzazione Realizzazione

Test Test Test

Rilascio Rilascio Rilascio

Tranche 1 Tranche 2 Tranche 3

figura 3 Modello incrementale

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).

194 Unità 6 Il ciclo di sviluppo


Integrazione
INCREMENTO 1 Analisi Disegno Codifica e Test

Integrazione
INCREMENTO 2 Disegno Codifica e Test
. .

. .

. .
Integrazione
INCREMENTO n Disegno Codifica e Test

figura 4 Modello incrementale

● 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.

verifica le tue conoscenze


1 Quali sono gli svantaggi del modello a 3 Che cos’è un prototipo “usa e getta”?
cascata? 4 Come funziona il modello incrementale?
2 Come funziona il “rapid prototyping”? 5 Che legame esiste tra il modello a spirale e quello a cascata?

Lezione 5 Modelli di approccio strutturato 195


6
UNITÀ lezione
Diagrammi di flusso
6
● I dataflow
Sono usati principalmente per l’analisi funzionale e come
Programma strumento di documentazione per descrivere l’interazione
Tastiera o
procedura tra le varie componenti del programma e l’esterno. I dataflow
servono a illustrare, mediante semplici simboli grafici, quali
Output sono i flussi e i dati che costituiscono gli input e gli output
su carta
dell’elaborazione.
Nastro
magnetico A livello più basso permettono di rappresentare le singole pro-
Disco
magnetico cedure descrivendo le singole istruzioni. Sono i flow chart che
abbiamo visto e utilizzato fino a ora. A un livello più elevato
descrivono come le varie componenti interagiscono tra di loro
Video Percorso
informazioni e con l’esterno, a un livello macro, senza che si arrivi al detta-
glio della singola istruzione.
figura 1 Simboli utilizzati nei diagrammi di flusso In figura 1 vengono mostrati i simboli utilizzati.

● 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.

figura 2 Maschera di input figura 3 Prospetto di stampa

196 Unità 6 Il ciclo di sviluppo


● Metodologia DFD
I DFD (Data Flow Diagram) servono per descrivere essenzialmente sistemi composti da
dati e procedure e sono molto usati nella fase di analisi e progetto dei sistemi. Si basano
sulla scomposizione del sistema in sottocomponenti partendo dal diagramma di contesto
(diagramma di livello 0 in cui viene evidenziata la frontiera del sistema con gli input e gli
output esterni - figura 4).
Il sistema viene visto come un insieme di processi che trasformano gli input in output.
I DFD sono strutturati per livelli fino ad arrivare alle specifiche software di dettaglio
chiamate “Mini Spec”.
I processi (nodi, bolle, funzioni) sono collegati tra loro da un flusso (archi) che trasporta
dati da un processo (flusso in uscita) a un altro (flusso in entrata). I processi prelevano o
immagazzinano i dati in depositi.
Il diagramma di livello 1 mostra la sud-
divisione del sistema nell’insieme delle
strutture dati (storage) e dei sottosistemi
I1 O1
che operano su di esse, con l’indica-
zione dei flussi di dati, cioè quali dati
ricevono in input le varie procedure e
quali forniscono in output (figura 5).
Nell’esempio, infatti, gli archivi dati
sono AR1 e AR2 e le procedure S1,
S2 e S3. L’output della procedura S1 I2 O2
carica l’archivio AR1, mentre S2 modi-
fica il contenuto di AR1 e carica dati
in AR2. figura 4 DFD, diagramma di contesto
Ogni sottosistema può ulteriormente
essere dettagliato con l’indicazione dei
suoi sottosistemi e dei dati su cui lavo-
ra, fino ad arrivare alla descrizione delle
singole procedure. I1
Le strutture dati vengono normalmente
descritte utilizzando il dizionario dei S1
dati che fornisce definizione e descri-
zione di tutti gli item che compongono
01
il DFD. Possono essere utilizzate per
I2 S2 AR1 S3
questo fine altre metodologie come, per
esempio, il metodo entità-relazioni che 02
verrà descritto in seguito.
Sono state proposte anche alcune
estensioni per gestire i problemi di tipo AR2
real-time.

figura 5 Diagramma di livello 1

verifica le tue conoscenze


1 Per quali aspetti della progettazione vengono utilizzati 3 Che cosa si intende per livello 0 dei DFD?
normalmente i dataflow?
4 Che differenza c’è tra dataflow e DFD?
2 Fino a che livello di dettaglio si può arrivare
5 Che cos’è il dizionario dei dati?
con i dataflow?

Lezione 6 Diagrammi di flusso 197


6
UNITÀ lezione
Reti di Petri
7
Una rete di Petri è uno strumento concettuale per descrivere i sistemi come un grafo i cui
nodi sono rappresentati da posti (Places) e transizioni (Transitions). Questi si indicano
con cerchietti e con barrette collegati da frecce orientate che indicano il verso di percor-
renza. Una freccia collegherà sempre un cerchietto a una barretta o viceversa ma mai due
barrette o due cerchietti.

Vi sono molti modi di utilizzare le reti di


Petri. Un modo molto semplice e diffuso
Precondizioni nella progettazione di sistemi è quello di
vedere il grafo come un insieme di “condi-
zioni/eventi”.
Transazione/Operazione Per posto possiamo, infatti, intendere una
condizione in cui i vari elementi si trovano
Postcondizioni e permettono di rappresentare lo stato del
sistema. Per transizione si intende l’acca-
dere di un evento e in particolare quella
figura 1 Reti di Petri figura 2 Evento operazione che permette il passaggio a un
nuovo stato del sistema (figura 1 e 2).

Affinché una transizione possa “scattare”


devono essere verificate tutte le condizioni
a monte di essa (precondizioni), cioè tutti
i posti a monte devono essere “veri”. La
transizione renderà veri tutti i posti a valle
di esso. Per indicare che una condizione è
vera viene inserito un punto all’interno del
cerchietto (figura 3).

Quando tutte le condizioni indicate nei cer-


chietti in alto, cioè in ingresso, sono vere,
avviene l’evento indicato nella barretta e quin-
di il sistema rende vere le condizioni indicate
figura 3 “Scatto” di una transizione
sotto, cioè in uscita.

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

198 Unità 6 Il ciclo di sviluppo


● Espressioni
Tramite le reti di Petri si possono rappresentare:
UÊ Sequenze (figura 4)

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).

UÊ Ciclo figura 4 Sequenza


Un evento rende vera una condizione precedente (figura 7).

figura 5 figura 6 Branching figura 7 Ciclo


Operazioni parallele

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

verifica le tue conoscenze


1 Che cos’è un grafo condizione-eventi? 3 È possibile avere dei cicli in una rete di Petri?
2 Quando un evento può scattare? 4 Vi possono essere attività parallele?

Lezione 7 Reti di Petri 199


6
UNITÀ lezione

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à

figura 1 E-R, entità e caratteristiche

● 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).

PERSONA ACQUISTO CASA

DATA ACQUISTO

figura 2 E-R, associazioni

200 Unità 6 Il ciclo di sviluppo


a) RELAZIONI 1:1

RELAZIONE
MATRIMONIO

MARITI
MOGLI

b) RELAZIONI 1: N

RELAZIONE
MADRI-FIGLI

FIGLI
MADRI

c) RELAZIONI M: N

RELAZIONE
TRA CUGINI

CUGINI
CUGINI

figura 3 Le associazioni nel modello Entità-Relazione

● Modellare la realtà con E-R


La figura 4 mostra un esempio di descrizione dei dati usando il modello E-R.
Nell’esempio vi sono dei libri (con Titolo e Codice ISBN) pubblicati da case editrici (di cui
si conoscono alcuni attributi). Un libro è pubblicato da una sola casa editrice, mentre una
casa editrice, ovviamente, può pubblicare più libri. Ogni libro può essere scritto da più
autori, così come un autore può avere scritto più libri.

COD ISBN N 1 COD


TITOLO CASA
LIBRI NOME
EDITRICE
INDIRIZZO
M

N
NOME
DATA AU TORI
NASCITA

figura 4 E-R, esempio

verifica le tue conoscenze


1 Che cos’è un’entità nel modello E-R? 4 Che differenza c’è tra entità e istanza?
2 Che cosa sono le relazioni? 5 Che cos’è un attributo?
3 Che tipi di relazioni/associazioni esistono? 6 Un’associazione può avere un attributo?

Lezione 8 Modello Entità-Relazione 201


6
UNITÀ lezione
Metodologia SADT
9
SADT (Structured Analysis and Design Technique) è una
Condizionamenti
metodologia per la definizione dei modelli di sistemi com-
Componenti Prodotto plessi largamente applicata e conosciuta anche con l’acroni-
Costruire mo IDEF (Information DEFinition).
Prodotto
Si tratta quindi di una metodologia completa adatta per la
progettazione di sistemi di qualunque genere e di qualun-
que complessità.
Fase 1
Fase 2 Le principali caratteristiche dell’approccio SADT sono:
Fase 3 UÊʏ>Ê VœÃÌÀÕ∜˜iÊ `ˆÊ Õ˜Ê “œ`iœÊ «iÀÊ «>ÃÃˆÊ ÃÕVViÃÃˆÛˆÊ ­Ìœ«‡
down); ciò consente di fissare l’attenzione sulle attività
di alto livello e di procedere a scomposizioni successi-
figura 1 Approccio Top-Down ve fino al dettaglio richiesto dagli obiettivi dell’analisi
(figura 1);
UÊʏ>ʓœ`Տ>ÀˆÌDÊ`iÊ“œ`iœÊÀˆÃՏÌ>˜ÌiÊ­>ʜ}˜ˆÊii“i˜Ìœ]Ê>Ê
un qualunque livello di dettaglio, è possibile associare
una precisa funzione e ben definiti flussi di informazioni
in ingresso/uscita); permette di affidare a gruppi di lavo-
ro indipendenti l’ulteriore analisi o l’implementazione
delle procedure relative a ciascun modulo, evitando i
consueti problemi di integrazione;
UÊʏ>Ê`ivˆ˜ˆâˆœ˜iÊ`ˆÊ՘>Ê}iÀ>ÀV…ˆ>ÊÌÀ>ʏiÊÛ>ÀˆiÊ>Ì̈ۈÌD°Ê"}˜ˆÊ
sottoinsieme può avere un insieme di cui è parte (padre)
ed essere rappresentabile tramite sottoinsiemi a più ele-
vato grado di dettaglio (figli) (figura 2).
figura 2 Gerarchia in SADT

● 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

figura 3 Box e loro dominanza

202 Unità 6 Il ciclo di sviluppo


L’arrow (freccia) rappresenta oggetti (informazioni, disegni, uten-
sili, risorse ecc.), collega i box tra loro ed è “etichettato” da un CONTROLLI
sostantivo. Vi sono quattro tipi di frecce: input, controlli, output,
meccanismi (figura 4).

Input: oggetti che vengono trasformati dall’attività descritta dal


box. INPUT OUTPUT
Controlli (vincoli): vincoli che influenzano l’esercizio dell’attività.
L’attività non può fornire l’output previsto se non sono verificate
le condizioni.
Output: rappresenta gli oggetti prodotti come risultato dell’esecu-
zione dell’attività. L’output di un’attività può essere un input per
attività successive.
Meccanismi (risorse): indicano le risorse e gli aspetti organizzativi MECCANISMI
coinvolti nelle attività (persone, strumenti, posti di lavoro, respon-
sabilità, uffici competenti, locali necessari alla realizzazione). Non figura 4 SADT, frecce
subiscono mutamenti a seguito dell’attività.
L’interpretazione da dare alle frecce dalla figura 4 è la seguente: “gli input sono trasformati
in output secondo i vincoli usando le risorse”.
Dalle iniziali dei quattro tipi di frecce si parla di diagramma ICOM.

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

Requisiti Utente Definire


Specifiche
Richieste Modifiche Prodotto
Output
Input
Progettisti Computer
Meccanismi

L’interpretazione sarà: “nella definizione di un prodotto i requisiti utente e le richieste di modifica


definiscono le specifiche basandosi sull’analisi di mercato usando i progettisti e i computer”.

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à.

verifica le tue conoscenze


1 Che cosa significa SADT? 3 Che cos’è un “meccanismo” o “risorsa”?
2 Che cosa rappresentano le frecce? 4 A cosa servono i vincoli?

Lezione 9 Metodologia SADT 203


6
UNITÀ lezione
Il diagramma IDEF
10
● Componenti
L’unità principale di un modello IDEF è un diagramma che evi-
denzia le relazioni (ICOMs) tra le singole attività (figura 1).

La difficoltà maggiore è nel riuscire a rappresentare per ogni


casella un’attività ben identificabile, con input, output e
condizionamenti non ambigui.
Nel modellare uno schema IDEF ogni attività del mondo
reale presa in considerazione viene rappresentata in un
box con un’etichetta. Nella figura 2 vediamo come si
trasforma l’attività di realizzazione di un hamburger nel
corrispondente schema IDEF (figura 3). Notare come i 4
input che rappresentano i vari ingredienti siano stati riuniti
figura 1 Diagramma IDEF in un’unica voce di input (ingredienti) che potrà essere poi
successivamente dettagliata.

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

Costruire Vediamo tramite alcuni esempi come possono interagire


Prodotto tra loro le varie attività utilizzando varie tipologie di con-
nessione.
SPECIFICHE
Controlli
Definire In figura 4 si mostra come l’output di un’attività può
Prodotto
essere usato da altre attività. Per esempio l’output di un’atti-
Costruire vità diventa l’input per un’attività successiva oppure l’output
Prodotto dell’attività “Definire prodotto”, cioè le “Specifiche” viene
utilizzato per controllare la successiva attività di costruzione
Attrezzare
Meccanismi del prodotto.
Area
Il risultato di un’attività può anche essere utilizzato come
strumento per poter svolgere un’attività successiva.
Assemblare Nei due casi di figura 5 viene realizzato il concetto di
Feedback. Cioè l’output viene usato da una attività prece-
AREA DI LAVORO
figura 4 Uso dell’Input dente dal punto di vista concettuale, ma che a fronte di
risultati particolari potrà essere rieseguita.

204 Unità 6 Il ciclo di sviluppo


Eseguire
Schedulazione Lavoraz.
Controllo STATO Input
Feedback Produzione LAVORAZIONE PARTE
STIME Feedback
Controllo
Eseguire Qualità
Lavoraz. PARTE
SCARTI
figura 5 Output come Feedback

esempio
Vediamo ora un esempio in cui si descrive la preparazione di una lettera da spedire a un cliente.

Nome CERCARE IN Nome inesistente


ARCHIVIO
Indirizzo
C’è carta da lettera

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).

A1 Disegni A1 Mat. Prima

A0 Specifiche A0 Elementi
da utilizzare

A2 Ciclo A2 Semilavorati

figura 7 Branch figura 8 Join

Lezione 10 Il diagramma IDEF 205


Diagramma
Il modello SADT è di fatto una gerarchia di diagrammi. Ogni diagramma è in genere for-
mato da 3/6 box. Ciascun box può essere ulteriormente espanso con un diagramma di
livello inferiore. Esiste un diagramma iniziale definito come Context Diagram (figure
9, 10 e 11).

A0

A1 A2 A3 A4

A1.1 A1.2 A1.3 A3.1 A3.2 A3.3 A4.1 A4.2 A4.3

A1.1.1 A1.1.2 A1.1.3 A1.1.4 A4.1.1 A4.1.2 A4.1.3 A4.1.4

figura 9 Gerarchia di diagrammi

NONE Context diagram


Le frecce definiscono
la frontiera del modello
0
A-0 La box definisce la A0
funzione del modello
NONE
1
A-0
2 TOP DIAGRAM
3
A-0

1 2
1
2 3
2
3 4
4 3 A-1
A-1 A-2 A-3
A-0

2 Questo box è il padre 1

3 di questo diagramma 2
A-21 A-22
A-1
3

A-4
figura 10 Approccio Top-Down

A-12

figura 11 Legame tra i diagrammi

206 Unità 6 Il ciclo di sviluppo


Il Context Diagram definisce il contesto dell’attività. Il box definisce la funzione del model-
lo e le frecce la frontiera (figura 12).

Scomposizione dei diagrammi A-0

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).

Consistenza dei diagrammi


La consistenza dei diagrammi viene garantita dalla corrispondenza tra gli elementi di un
diagramma di livello superiore con quelli di un diagramma di livello inferiore. Per esempio
ogni input presente in un diagramma dovrà ritrovarsi anche nel diagramma del livello di
dettaglio successivo. Nell’esempio gli input I1 e I2 li ritroviamo come input nel box 1 del
livello più basso (figura 13).

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

figura 13 Consistenza dei diagrammi

verifica le tue conoscenze


1 Che cos’è il diagramma di contesto? 2 Che metodologia useresti se devi gestire aspetti
temporali, funzionali e di dati?

Lezione 10 Il diagramma IDEF 207


unità

6 sintesi

lezione 1 Ingegneria del software


Per ingegneria del software si intende tutta quella parte dell’informatica legata alla pro-
gettazione, alla produzione, alla riutilizzabilità e alla manutenzione dei programmi atta
a ridurre i costi di produzione del software migliorandone la qualità.

lezione 2 Il ciclo di vita del software


Il software ha un proprio ciclo di vita. Viene pensato, progettato, realizzato, utilizzato,
mantenuto, fino a quando smette di essere utilizzato. Per ogni fase vi sono delle attività
da svolgere e documenti da realizzare.

lezione 3 Manutenzione e gestione del progetto


La fase di manutenzione accompagna la vita di un prodotto software da subito dopo il
suo rilascio fino alla sua fine, cioè fino al momento in cui non verrà più utilizzato. Da
non sottovalutare nella fase di sviluppo la gestione del progetto.

lezione 4 Approccio metodologico ai progetti


Un corretto approccio alla produzione del software è quello di seguire una metodologia,
cioè delle regole e delle tecniche che permettano di realizzare facilmente del software
di qualità. La gestione del ciclo di vita del software può essere approcciato in vari mo-
di. Due le principali tipologie: l’approccio strutturato e l’approccio Object-Oriented.

lezione 5 Modelli di approccio strutturato


Tra i modelli basati sull’approccio strutturato troviamo il tradizionale modello a cascata
ma anche i più innovativi approcci prototipali o a spirale.

lezione 6 Diagrammi di flusso


Una delle metodologie più vecchie e più utilizzate è sicuramente quella dei diagrammi
di flusso. Deve il suo successo alla facilità di uso e alla sua completezza rappresentativa,
anche se solo nella parte di analisi funzionale. È un ottimo strumento di documentazione.

208 Unità 6 Il ciclo di sviluppo


unità

lezione 7 Reti di Petri


Una rete di Petri è uno strumento concettuale per descrivere i sistemi tramite un gra-
fo in cui si rappresentano Condizioni e Attività. Molto utilizzato per rappresentare gli
aspetti temporali di un sistema.

lezione 8 Modello Entità-Relazione


Poiché difficilmente una metodologia è in grado di coprire tutti gli aspetti del progetto,
sono nate differenti metodologie. Per esempio l’E-R si concentra sulla progettazione dei
dati, mentre i DFD coprono la parte dei flussi di dati.

lezione 9 Metodologia SADT


SADT è una metodologia completa adatta per la progettazione di sistemi di qualunque
genere e di qualunque complessità. Ha un approccio gerarchico.

lezione 10 Il diagramma IDEF


L’unità principale di un modello IDEF è un diagramma che evidenzia le relazioni (ICOMs)
tra le attività. Nel modellare uno schema IDEF ogni attività del mondo reale presa in con-
siderazione viene rappresentata in un box con un’etichetta collegata ad altri diagrammi.

Unità 6 Il ciclo di sviluppo 209


unità

6 domande per l’orale

unità 6 Il ciclo di sviluppo


Ripasso MP3 1 A cosa serve l’ingegneria del software?
➞ L1

2 Quali sono le fasi principali del ciclo di vita del software?


➞ L2

3 Quali sono le differenti tipologie di manutenzione?


➞ L3

4 Che cos’è una metodologia? Quali aspetti può coprire?


➞ L4

5 Quali sono i principali modelli di approccio al ciclo di vita del software?


➞ L4

6 Quali sono le metodologie di tipo “strutturato”?


➞ L5

7 Come si rappresenta un algoritmo utilizzando i diagrammi di flusso?


➞ L6

8 Che cos’è una rete di Petri?


➞ L7

9 Descrivi le caratteristiche del modello E-R.


➞ L8

10 L’approccio SADT serve solo per lo sviluppo del software?


➞ L9

11 Cosa significa l’acronimo ICOM?


➞ L9,L10

210 Unità 6 Il ciclo di sviluppo


unità
in English, please 6
Abstract
THE DEVELOPMENT CYCLE
Software engineering indicates the part of IT concerned with the planning,
production, reusability and maintenance of programs. It aims to reduce the
production costs of software and simultaneously to improve its quality. Software has
its own a life cycle. It is conceived, planned, produced and maintained until it ceases
to be used. Maintenance accompanies the entire life of a software product
from the time if its launch to its end, that is, until such time that it is no longer used.
During the development stage, project management is important: the correct
approach to software production is to adhere to a methodology, that is, to a series
of rules and techniques which enable quality software to be readily produced.
Management of the life cycle of software can be approached in various ways. The
two main types are the structured approach and the Object-Oriented approach.
Among the structured-approach models are the traditional cascade model, the
prototype model, the spiral model and the incremental model. As it is unlikely that
one methodology can cover all aspects of a project, different methodologies have
arisen. One of the oldest and most widely used methodologies is, without doubt, flow
diagrams which are able to deal above all with data flows.
E-R focuses instead on data planning while Petri networks are useful in representing
a system’s temporal aspects. SADT is a complete methodology suited for planning all
kinds of systems, whatever their level of complexity.

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

a reads the data from A and modifies B’s data


b reads the data from A and B and modifies both A’s and B’s data
c reads the data from A and B and modifies B’s data
d reads B’s data and modifies A’s data.

Unità 6 Il ciclo di sviluppo 211


unità

6 in English, please

2 In the following Entity-Relationship diagram:

1 N
A C B

a for each A entity there is a single B entity


b for each A entity there are many B entities
c for each AB couple there is also a C entity
d for each B entity there are many C entities
3 In the course of tests it is necessary:
a to carry out a minimum of 10 tests
b to test only the main test cases
c to plan the tests in such a way as to examine all possible test cases
d to carry out random tests

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.

212 Unità 6 Il ciclo di sviluppo


Unità
La progettazione con UML
7
Competenze
Sviluppare applicazioni informatiche per reti locali o servizi a distanza.
Gestire progetti secondo le procedure e gli standard previsti dai sistemi aziendali di
gestione della qualità e della sicurezza.
Gestire processi produttivi correlati a funzioni aziendali.

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.

Accertamento dei prerequisiti


1 Elenca le fasi principali del ciclo di vita del 3 Quale metodologia considera prevalentemente
software. gli aspetti temporali?
2 Quale attività non va fatto prima della a Reti di Petri c Entity-Relationship
programmazione? b Data-flow d Flow-chart
a Analisi dati
4 Descrivi l’algoritmo per trovare il massimo di una
b Raccolta requisiti
serie di valori.
c Test
d Studio fattibilità 5 Descrivi l’algoritmo per fare una torta.
7
UNITÀ lezione

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

1997 - la versione 1.1 dello Unified Modeling Language


Analisi
novembre diventa ufficialmente standard di OMG (propo-
Lo scopo di questa fase è costruire un modello della
sta congiunta di Rational Software, Microsoft, realtà che dovrà essere gestita dall’applicazione. In
Hewlett-Packard, Oracle, Sterling Software, questa fase, tramite un modello astratto conciso e pre-
MCI Systemhouse, Unisys, ICON Computing, ciso, viene determinato cosa il sistema deve fare e non
IntelliCorp, i-Logix, IBM, ObjecTime, Platinum come deve essere fatto concentrandosi sugli oggetti del
Technology, Ptech, Taskon, Reich Technologies, dominio applicativo. Il modello deve essere compren-
Softeam e altri) sibile agli esperti del dominio che non necessariamente
sono esperti di informatica.
1999 UML 1.3 - specifica degli aspetti semantici e Per esempio in una biblioteca abbiamo come oggetti
notazionali per modelli e sottosistemi.
del dominio: libri, ordini di acquisto, prestiti mentre
2003 UML 1.5 - vengono inglobate le “Action come esperti del dominio i bibliotecari e i lettori.
Semantics”
Progettazione del sistema
2005 UML 2.0 - molte variazioni significative, comple- In questa fase vengono prese tutte le decisioni di alto
ta ristrutturazione del metamodello livello sull’architettura del sistema informativo. Il siste-
2010 UML 2.3 - ultima versione con variazioni minori
ma viene suddiviso in sottosistemi sulla base dell’analisi
ottenuta dal passo precedente e sull’architettura globale.

Progettazione degli oggetti


Durante questa fase vengono aggiunti ulteriori dettagli agli oggetti tenendo conto dello
specifico sistema hw/sw che si userà. L’obiettivo principale di questa fase è di progettare le
strutture dati e gli algoritmi necessari per implementare le classi ottenute dalla fase di analisi.

214 Unità 7 La progettazione con UML


Implementazione
Le classi ottenute alla fine della fase precedente vengono tradotte in termini di uno specifico
linguaggio di programmazione. In genere l’implementazione non dovrebbe comportare scelte
particolarmente cruciali dato che tutte le scelte importanti dovrebbero essere state prese nelle
fasi precedenti. Nella fase di implementazione è importante seguire i principi alla base della
progettazione software in modo che l’implementazione rifletta in modo diretto il progetto; que-
sto permette di rendere il sistema implementato flessibile, facile da modificare e da estendere.

● 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

figura 1 Incapsulamento figura 2 Information hiding

verifica le tue conoscenze


1 Cosa vuol dire UML? 3 Quali sono i principali diagrammi dell’UML?
2 Su che paradigma si basa la metodologia UML? 4 Che fasi metodologiche copre l’UML?

Lezione 1 UML 215


7
UNITÀ lezione

2 La modellazione degli oggetti

● Modello degli oggetti


Tramite il modello degli oggetti vengono descritti gli oggetti del sistema, cioè gli elementi
di base in cui il dominio applicativo viene scomposto. Per ogni oggetto vengono indivi-
duate:
UÊ ½ˆ`i˜ÌˆvˆV>̜ÀiÊ­ ®Æ
UÊ }ˆÊ>ÌÌÀˆLṎʭ«Àœ«ÀˆiÌD®Æ
UÊ iʜ«iÀ>∜˜ˆÊ­“i̜`ˆ®Æ
UML UÊ iÊÀi>∜˜ˆÊVœ˜Ê>ÌÀˆÊœ}}iÌ̈°

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

figura 2 Classi e oggetti

216 Unità 7 La progettazione con UML


● Attributi
Un attributo descrive una proprietà di un oggetto.
UÊ œ“i]ÊiÌD]Ê«iÜÊܘœÊ«iÀÊiÃi“«ˆœÊ>ÌÌÀˆLṎÊ`i>ÊV>ÃÃiÊ-ÌÕ`i˜Ìi°

œœÀi]Ê«iÜ]ʓœ`iœÊܘœÊ>ÌÌÀˆLṎÊ`i>ÊV>ÃÃiʜ̜VˆViÌÌ>°
Ogni attributo ha un valore per ogni oggetto-istanza. Per esempio l’attributo età può avere
valore 19 per l’oggetto Mario Rossi.
Il nome di un attributo deve essere unico all’interno della stessa classe, tuttavia classi
diverse possono avere attributi con lo stesso nome. Oltre al nome per ogni attributo è
importante definire il dominio, cioè l’insieme dei possibili valori dell’attributo. È inoltre
possibile specificare informazioni aggiuntive, come per esempio il valore di default, cioè il
valore che viene assegnato all’attributo quando l’oggetto viene creato. Per esempio si può
prevedere che l’attributo “numero copie” della classe Libro nel diagramma della biblioteca
valga sempre “1” quando viene creata una nuova istanza. In alcuni casi è possibile omettere
gli attributi, a seconda della fase di progettazione su cui si sta operando.

● 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.

Quando si avvia il sistema viene proposta una finestra


per permettere di scegliere la tipologia di approccio
figura 3 Finestra iniziale di StarUML
desiderato. Scegliere “Default Approach” (figura 3).

Lezione 2 La modellazione degli oggetti 217


Vediamo come creare una classe con i suoi attributi nel diagramma delle classi.

Inizialmente abbiamo un diagramma delle classi vuoto (figura 4).

figura 4 Diagramma delle classi vuoto

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).

figura 5 Creazione classe PERSONA figura 6 Inserimento attributo


œ˜ÊˆÊÌ>Ã̜ʺ³»ÊÃiʘiʈ˜ÃiÀˆÃVœ˜œÊ`ˆÊ˜ÕœÛˆÊ­figura 7), con il “–” si cancellano.

figura 7 Classe creata con StarUML

Tramite l’iconcina rossa si possono aggiungere le operazioni (figura 8).

218 Unità 7 La progettazione con UML


figura 8 Inserimento metodi

In questo modo possiamo creare le informazioni di base di una classe (figura 9).

figura 9 Classe completa di attributi e metodi

verifica le tue conoscenze


1 Che cos’è una classe? 4 A cosa servono gli attributi?
2 Che rapporto c’è tra classe e oggetto?
5 Crea con StarUML (o un altro software) una classe
3 Che cos’è un metodo? STUDENTE con gli attributi Cognome, Nome e Classe.

Lezione 2 La modellazione degli oggetti 219


7
UNITÀ lezione

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

figura 1 Esempio di associazione

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).

Mario Rossi: lavora


Persona ITUD s.n.c.:
Azienda
Beppe Verdi: lavora
Persona
PaperPetrol:
lavora Azienda
Ada Byron:
Persona

lavora
Persona Azienda
* 1

figura 2 Esempio di link e associazioni

● 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).

220 Unità 7 La progettazione con UML


PARENTELA
PERSONA
+COGNOME
+NOME

figura 3 Associazione unaria

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

figura 4 Associazione ternaria

● 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

figura 5 Ruoli nell’associazione unaria

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.

Lezione 3 Associazioni e link 221


● Molteplicità
La molteplicità (o grado) indica quante istanze di una classe possono essere connesse alle
istanze di un’altra classe in una specifica associazione. Pertanto la molteplicità rappresenta
un vincolo sul numero di oggetti connessi.
In genere la molteplicità è specificata da termini quali uno o molti ma più in generale è
possibile usare qualsiasi sottoinsieme dei numeri interi non negativi. Molto spesso la mol-
teplicità è un valore, o un singolo intervallo di valori, ma è possibile avere più intervalli
disconnessi; per esempio il numero di porte in una macchina è 2 o 4.
Normalmente la molteplicità può essere specificata nel seguente modo:

1 esattamente uno
* molti (zero o più)
0 opzionale (eventualmente non presente)
m specificato numericamente

Possono esserci altre combinazioni:

0..1 opzionale (zero o uno)


0..* opzionale (zero o più)
m..n 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

figura 6 Esempio di classe Associazione

222 Unità 7 La progettazione con UML


Se necessario potremmo aggiungere altri attributi o addirittura delle operazioni.
Per esempio un messaggio di avvertimento se l’utente tenta di accedere a una WS in modalità
errata, o far partire una procedura di LOG quando viene autorizzato l’accesso (figura 7).

Bisogna comunque fare attenzione alla classe Associazione.


Molto spesso si tratta di una classe “nascosta” e non di una vera e propria associazione, e
quindi come tale andrebbe trattata.

UTENTE Accesso WS

Permesso
+Privilegio
+Home Dir
+warning()
+Log()

figura 7 Classe Associazione complessa

verifica le tue conoscenze


1 Che cos’è un’associazione? 4 Quali sono le possibili molteplicità di una
2 Che rapporto c’è tra associazione e link? associazione?
3 Un’associazione può avere attributi? 5 Che cos’è la molteplicità di un’associazione?

Lezione 3 Associazioni e link 223


7
UNITÀ lezione

4 Il diagramma delle classi

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Ã\ÊVˆi˜ÌiÊi`ÊÕÌi˜Ìi®Ê˜iÊ>˜`ÀDÊVœ˜Ãˆ`i‡
rata una sola accorpandole;
UÊ œ}˜ˆÊ V>ÃÃiÊ `iÃVÀˆÛiÊ Õ˜Ê ˆ˜Ãˆi“iÊ `ˆÊ œ}}iÌ̈]Ê µÕˆ˜`ˆÊ V>ÃÃˆÊ Ãˆ˜}œ>Àˆ]Ê «iÀÊ iÊ µÕ>ˆÊ VˆœmÊ 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œÀ“Տ>̈ÊVœ“iÊ
attributi (es: l’età di una persona...);
UÊ V>ÃÃˆÊ iÊ >ÌÌÀˆLÕÌˆÊ Ãœ˜œÊ ii“i˜ÌˆÊ `ˆÃ̈˜ÌˆÊ `ˆÊ “œ`i>∜˜i]Ê «iÀÊ VÕˆÊ ÃiÊ Õ˜Ê ViÀÌœÊ Vœ˜ViÌ̜Ê
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.

224 Unità 7 La progettazione con UML


3. Ogni corso ha un valore in punti di credito.
4. Un corso può far parte di un numero qualsiasi di lauree.
5. Per laurearsi è necessario raggiungere un numero minimo totale di punti di credito composto
dai corsi obbligatori e da quelli facoltativi.
6. Il numero minimo di punti è differente da laurea a laurea.

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

● Identificare gli attributi


Nella fase di analisi abbiamo individuato altri sostantivi (es. punti di credito), ma dall’ana-
lisi del contesto ci rendiamo conto che vanno in realtà considerati come attributi. Abbiamo
infatti seguito queste semplici regole:
UÊ }ˆÊ>ÌÌÀˆLṎÊܘœÊ«Àœ«ÀˆiÌDÊ`ˆÊȘ}œˆÊœ}}iÌ̈ʭiÃ\ÊiÌD]ʘœ“i]ÊVœœÀi]Ê«iÜÊiVV°®Æ
UÊ }ˆÊ>ÌÌÀˆLṎ]Ê}i˜iÀ>“i˜Ìi]ÊVœÀÀˆÃ«œ˜`œ˜œÊ>ÊÜÃÌ>˜ÌˆÛˆÊÃi}Ո̈Ê`>ÊVœ“«i“i˜ÌœÊ`ˆÊëi‡
cificazione (es: il colore dell’auto);
UÊ ÃiÊ՘Ê>ÌÌÀˆLÕ̜Ê`iÃVÀˆÛiʏœÊÃÌ>̜ʈ˜ÌiÀ˜œÊ`ˆÊ՘ʜ}}iÌ̜ÊV…iÊmʈ˜ÛˆÃˆLˆiÊ>½iÃÌiÀ˜œ]Ê>œÀ>Ê
si può non considerarlo.

Quindi secondo queste regole nell’esempio precedente possiamo cominciare a individuare


gli attributi più rilevanti (figura 1).

Studente Laurea
+Matricola +Codice
+Cognome +Nome
+Nome +Numero crediti

Corso Piano di Studi


+Codice +Anno
+Nome +Crediti ottenuti
+Crediti +Crediti da raggiungere

figura 1 Prima ipotesi di classi e attributi

Lezione 4 Il diagramma delle classi 225


● Dizionario dei dati
Il dizionario dei dati è un utile strumento per evitare ambiguità nella definizione degli
oggetti che entrano a far parte del nostro sistema. Si tratta di un contenitore in cui vengono
conservate tutte le informazioni sui dati del sistema che stiamo progettando.
Può essere organizzato in vario modo. Si parte con il caricare informazioni sulle classi
che vengono definite nel diagramma delle classi aggiungendo tutte le informazioni utili a
descrivere le classi e gli attributi.
Quando si inseriscono le associazioni si fa direttamente riferimento alle classi già inserite.
-iÊÈÊṎˆââ>Ê՘œÊÃÌÀՓi˜ÌœÊ>Õ̜“>̈VœÊ`ˆÊ«Àœ}iÌ̜ʭ
- ®ÊµÕiÃ̜Êۈi˜iÊv>Ì̜ʈ˜Ê>Õ̜“>‡
tico. Non si corre quindi il rischio di ridefinire classi già esistenti, magari con nomi simili.
(es. STUDENTE e STUDENTI).

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.

classe attributi descrizione


Laurea laurea che è possibile ottenere frequentando i corsi e sostenendo gli esami
Codice codice identificativo del corso di laurea
Nome nome ufficiale della laurea che si otterrà
Numero Crediti numero minimo totale di punti di credito da raggiungere per potersi laureare. È
composto dai corsi obbligatori e da quelli facoltativi
Corso corso che è possibile frequentare
Codice codice identificativo del corso
Nome nome del corso
Crediti numero di crediti che si ottengono superando l’esame alla fine del corso
Studente studente iscritto all’Università
Matricola identificativo univoco dello studente all’interno dell’Università
Cognome cognome dello studente
Nome nome dello studente
Piano piano di Studi definito dallo studente, collegato a tutti i corsi obbligatori e facoltativi
di Studi che lo studente frequenterà
Anno anno di corso
Crediti ottenuti crediti già raggiunti dallo studente
Crediti da raggiungere crediti ancora da ottenere per potersi laureare

● 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Ê«ÀœLi“>ʜʘiÊ`ˆâˆœ˜>ÀˆœÊ`iˆÊ`>̈°Ê
œ˜Ãˆ`iÀˆ>“œÊˆ˜Ê«>À̈Vœ>ÀiʵÕiˆÊV…iÊ
facciano riferimento ad almeno due classi o a una classe in modo iterativo.

È buona norma evitare di inserire associazioni irrilevanti, cioè associazioni estranee al


dominio del problema o che considerano costrutti relativi all’implementazione, così come
le associazioni che possono essere definite in termini di altre associazioni.

226 Unità 7 La progettazione con UML


Bisogna sempre cercare di dare un nome all’associazione e, se possibile, aggiungere i nomi
di ruolo dove occorre. Ricordiamo che i nomi di ruolo descrivono il ruolo che la classe
ricopre nell’associazione dal punto di vista dell’altra classe.
Fondamentale è poi indicare la molteplicità, facendo attenzione ai casi in cui vi siano delle
molteplicità anomale (es. “uno” da entrambe le parti).
Bisogna fare attenzione anche nel caso di associazioni ternarie con attributi. Molto spesso
nascondono l’esistenza di una classe vera e propria.

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

figura 2 Associazioni tra classi

verifica le tue conoscenze


1 Che cos’è il diagramma delle classi? 3 A che cosa serve il dizionario dei dati?
2 Come si identificano le classi principali? 4 Come si identificano le associazioni?

Lezione 4 Il diagramma delle classi 227


7
UNITÀ lezione

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

figura 1 Organizzazione gerarchica delle classi

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À¢Ê«ÀœLi“ˆÊ`ˆÊVœ˜vˆÌ̈Ê
e duplicazioni.

Apparecchio Elettrico Articolo


tensione codice
potenza prezzo

Televisore
pollici

figura 2 Esempio di ereditarietà multipla

228 Unità 7 La progettazione con UML


● Polimorfismo
Abbiamo detto che tramite il concetto di ereditarietà si può definire una classe come esten-
sione di una classe base (superclasse). Gli oggetti della nuova classe possiederanno tutti
gli attributi e i metodi della superclasse (sono cioè ereditati). Nella definizione della nuova
classe si possono aggiungere nuovi attributi e nuovi metodi.
Si possono anche ridefinire attributi e metodi ereditati dalle superclassi. Pertanto il mecca-
nismo dell’ereditarietà permette di specializzare una classe per mezzo di aggiunte e sosti-
tuzioni.

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 DEFINISCEUNASUPERCLASSECOMUNEOggetto_grafico;
s DEFINISCEUNMETODOdisplay per la classe Oggetto_grafico;
s RIDEFINISCETALEMETODOINOGNUNADELLESOTTOCLASSI

Vi sono due modalità per ridefinire un metodo:


UÊ Àˆ`ivˆ˜ˆÀœÊVœ˜ÊœÊÃÌiÃÜʘœ“iÊiÊ}ˆÊÃÌiÃÈÊ̈«ˆÊiʘՓiÀœÊ`ˆÊ>À}œ“i˜ÌˆÊ­overriding);
UÊ Àˆ`ivˆ˜ˆÀœÊVœ˜ÊœÊÃÌiÃÜʘœ“iʓ>ÊVœ˜Ê̈«ˆÊiʘՓiÀœÊ`ˆÊ>À}œ“i˜ÌˆÊ`ˆÛiÀÈʭoverloading).

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

Lezione 5 Generalizzazione ed ereditarietà 229


*iÀÊiÃi“«ˆœ]ʈÊ“i̜`œÊ ˆÃi}˜>
œÀ˜ˆViÊ`i>ÊV>ÃÃiʈ˜iÃÌÀ>
œ˜/ˆÌœœÊiÃÌi˜`iʈÊ“i̜`œÊ
ˆÃi}˜>
œÀ˜ˆViÊ`i>ÊV>ÃÃiʈ˜iÃÌÀ>]ÊÃi“«ˆVi“i˜ÌiÊ>}}ˆÕ˜}i˜`œÊ>Ê“i̜`œÊœÀˆ}ˆ˜>ÀˆœÊ`iÊ
codice specifico per disegnare il titolo. Per evitare di duplicare il codice, si può far riferi-
mento a un metodo della sopraclasse con lo stesso nome.

● 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

~triangolo (L1, L2; L3)


~triangolo (Altezza, Base)

230 Unità 7 La progettazione con UML


●Generalizzazione, specializzazione
ed ereditarietà
La possibilità di usare classi e sottoclassi definisce la FIGURE GEOMETRICHE
gerarchia di generalizzazione e specializzazione. Si tratta
di relazioni semantiche tra classi per cui una sottoclasse FIGURE PIANE SOLIDI
deve comprendere tutte le proprietà della superclasse.
In pratica si utilizza un sottoinsieme di elementi che
hanno tutte le caratteristiche degli elementi del sovrain- PUNTO
sieme più alcuni specifici. Per esempio possiamo pen-
LINEA POLIEDRO
sare all’insieme delle figure geometriche diviso in due
sottoinsiemi: Figure piane e Solidi. A loro volta le Figure
piane sono suddivise in Punti, Linee e Poligoni. Tutti e POLIGONO
tre avranno delle caratteristiche comuni (per esempio il
nome), ma ognuna di esse avrà anche delle caratteristiche
in più, per esempio il poligono avrà l’Area che gli elementi
figura 3 Insiemi e sottoinsiemi
degli altri due sottoinsiemi non hanno (figura 3).
Possiamo notare come sia possibile avere dei sottoinsiemi mutualmente esclusivi che
coprano tutte le casistiche, così come dei sottoinsiemi parziali (subset).
In UML la generalizzazione è rappresentata
graficamente con un piccolo triangolo che
connette una sottoclasse alla sua superclas- Figura geometrica
se. La superclasse è connessa con il vertice
in alto del triangolo. L’esempio precedente
viene rappresentato come in figura 4.
A ogni generalizzazione è possibile associare
Figura piana Solido
un discriminatore, cioè un attributo i cui
valori ci permettono di individuare la sotto- – superficie
– volume
classe a cui l’oggetto appartiene.
Grazie alla generalizzazione è più facile ana-
lizzare il sistema in quanto si possono orga-
nizzare le classi descrivendo in modo suc- Punto Linea Poligono Poliedro
cinto differenze e similitudini. L’ereditarietà
delle operazioni è utile in fase di imple-
mentazione come meccanismo di riuso del figura 4 La generalizzazione in UML
codice.
I termini ereditarietà (inheritance), specializzazione, generalizzazione sono spesso usati in
modo intercambiabile; esistono tuttavia delle differenze:
UÊ >ÊëiVˆ>ˆââ>∜˜iÊiʏ>Ê}i˜iÀ>ˆââ>∜˜iÊܘœÊ“iVV>˜ˆÃ“ˆÊ`ˆÊ“œ`i>∜˜iÊVœ˜ViÌÌÕ>i
Si differenziano per il fatto che nella generalizzazione abbiamo un approccio bottom-up
(cioè partiamo da una o più sottoclassi e individuando gli elementi comuni definiamo
una superclasse).
Nella specializzazione invece abbiamo un approccio Top-Down. Parto cioè da una classe
generale e individuo dei sottoinsiemi significativi.
UÊ ½iÀi`ˆÌ>ÀˆiÌDʈ˜ÛiViÊmÊ՘ʓiVV>˜ˆÃ“œÊ`ˆÊÀˆÕÜÊ`iÊVœ`ˆVi°

verifica le tue conoscenze


1 Che cos’è l’ereditarietà? 3 Descrivi una gerarchia di generalizzazione.
2 Che cos’è il polimorfismo? 4 Descrivi che cos’è un’aggregazione.

Lezione 5 Generalizzazione ed ereditarietà 231


7
UNITÀ lezione

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

In UML l’aggregazione ha una rappresentazione grafica in cui un rombo è associato alla


classe che rappresenta gli oggetti compositi.

Documento Paragrafo Frase

figura 2 Rappresentazione gerarchica in UML

Nell’esempio della figura 2 un documento è l’aggrega-


zione di uno o più paragrafi ciascuno dei quali è l’aggrega-
ImpiantoStereo Bicicletta
zione di una o più frasi.
Può essere inoltre indicata la quantità di componenti e il pos-
0..1 0..1 sesso può anche essere di tipo opzionale come mostrato negli
esempi di figura 3. Nel primo caso abbiamo un Impianto
<<possiede>> <<possiede>> stereo, che può avere o non avere un amplificatore, mentre
nel secondo caso la bicicletta dovrà avere necessariamente dei
copertoni.
0..1 0..2
L’aggregazione può essere vista come un’associazione specia-
Amplificatore Copertone
le caratterizzata da alcune proprietà semantiche aggiuntive:
UÊ Ê«Àœ«ÀˆiÌDÊ ÌÀ>˜ÃˆÌˆÛ>\Ê ÃiÊ Ê mÊ «>ÀÌiÊ `ˆÊ Ê iÊ Ê mÊ «>ÀÌiÊ `ˆÊ

>œÀ>ÊÊmÊ«>ÀÌiÊ`ˆÊ
Æ
figura 3 Quantità e opzionalità UÊ Êproprietà antisimmetrica: se A è parte di B, allora B non
è parte di A.

232 Unità 7 La progettazione con UML


L’aggregazione può avere
un numero arbitrario di Computer
livelli. Quando si ha una
collezione di componenti
che appartengono allo stes-
so assembly, si può usare Monitor System box Mouse Tastiera
un albero di aggregazione
come nell’esempio di un
computer (figura 4).
Nella figura 5 si vede Cabinet Ventola CPU RAM
una possibile struttura-
zione di aggregazione figura 4 Albero di aggregazione
della macchina.

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

figura 5 Esempio di aggregazione in UML

Ereditarietà nello schema dei dati


Nella ricerca degli oggetti possono emergere situazioni in cui le classi sono legate da aggre-
gazioni o generalizzazioni. Possiamo quindi organizzare le classi usando l’ereditarietá per
condividere le strutture comuni.
L’ereditarietà può essere raggiunta in due direzioni:
UÊ }i˜iÀ>ˆââ>˜`œÊ>ëiÌ̈ÊVœ“Õ˜ˆÊ`ˆÊV>ÃÈÊiÈÃÌi˜ÌˆÊˆ˜Ê՘>ÊÃÕ«iÀV>ÃÃiÆ
UÊ À>vvˆ˜>˜`œÊV>ÃÈÊiÈÃÌi˜ÌˆÊˆ˜ÊÜÌ̜V>ÃÈÊëiVˆ>ˆââ>Ìi°
Un test significativo per la ricerca di aggregazioni è usare le frasi “ha (costituito da)” e “è
parte di (contenuto in)” in una descrizione di una relazione:
UÊ ºÌœ«‡`œÜ˜»]ʏ>ÊvÀ>ÃiÊmʺ…>»Ê­iðʈLÀœÊº…>»Ê
>«ˆÌœœ®Æ
UÊ ºLœÌ̜“‡Õ«»]ʏ>ÊvÀ>ÃiÊmʺmÊ«>ÀÌiÊ`ˆ»Ê­iðÊ
>«ˆÌœœÊºmÊ«>ÀÌiÊ`ˆ»ÊˆLÀœ®°
Se la relazione interpretata con queste frasi non ha senso, allora non è un’aggregazione
dal punto di vista strutturale, l’aggregazione spesso mette in relazione parecchie classi
mentre un’associazione è poco sensata oltre il grado binario.

verifica le tue conoscenze


1 Che cosa rappresenta la classe componente? 3 Quanti livelli può avere un’aggregazione?
2 Che cos’è un assembly? 4 Che proprietà hanno le aggregazioni?

Lezione 6 Aggregazioni 233


7
UNITÀ lezione

7 La modellazione funzionale

● Gli aspetti dinamici


Una volta definiti gli aspetti statici di un sistema (cioè la struttura degli oggetti e le
associazioni tra di essi) bisogna affrontare gli aspetti dinamici, cioè va analizzato ciò che
deve fare il sistema e l’evoluzione temporale degli oggetti e delle associazioni. Si parla
quindi del modello dinamico del sistema in grado di coprire sia l’aspetto funzionale che
quello temporale. In particolare va considerato cosa devono fare le varie componenti
del sistema, quando devono attivarsi e come si devono sincronizzare. Va organizzato il
controllo del sistema rispetto al tempo e la reazione dello stesso agli eventi. Gli aspetti
da considerare sono quindi:
UÊ iÛi˜ÌˆÊV…iÊ«ÀœÛœV>˜œÊV>“Lˆ>“i˜ÌˆÊ`ˆÊÃÌ>̜Æ
UÊ ÃiµÕi˜âiÊ`ˆÊiÛi˜ÌˆÆ
UÊ ÃÌ>̈ÊV…iÊ`ivˆ˜ˆÃVœ˜œÊˆÊVœ˜ÌiÃ̜ʫiÀÊ՘ʈ˜Ãˆi“iÊ`ˆÊiÛi˜Ìˆ°
Vengono descritti gli aspetti di controllo di un certo sistema, cioè le sequenze di operazioni
che possono verificarsi indipendentemente da cosa le operazioni facciano o come siano
implementate.
Il modello funzionale viene graficamente espresso tramite il diagramma dei casi d’uso, mentre
il modello temporale è graficamente rappresentato principalmente per mezzo di diagrammi
di stato, diagrammi di sequenza e diagrammi di attività.

● Diagramma dei casi d’uso


(Use Cases)
Lo strumento fornito da UML per descrivere gli aspetti funzionali del sistema è il diagram-
ma dei casi d’uso. In pratica serve a descrivere cosa il sistema deve fare e chi e come deve
usarlo. Due sono le componenti principali:
UÊ V>ÜÊ`½ÕÜ\Ê՘>Ê«>À̈Vœ>Àiʓœ`>ˆÌDÊ`ˆÊÕÜÊ`iÊÈÃÌi“>Æ
UÊ >Ì̜Ài\ÊÜ}}iÌ̜ÊiÃÌiÀ˜œÊ>ÊÈÃÌi“>Ê­iÃÃiÀiÊՓ>˜œÊœÊ>ÌÀœÊÈÃÌi“>®°

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.

234 Unità 7 La progettazione con UML


● Gli aspetti dinamici
Poiché il sistema reagisce a degli eventi, associati in genere a degli attori (esterni), identifi-
care gli eventi ai quali bisogna rispondere aiuterà a identificare i casi d’uso.

Due sono i principali concetti alla base di un modello dinamico:


– evento: rappresenta una richiesta o uno stimolo esterno a cui il sistema deve rispondere
o reagire Si tratta di un qualcosa che avviene in un dato istante di tempo

esempio
s LUTENTESCHIACCIAILTASTODESTRODELMOUSE
s ILVOLO!:PARTEDA-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 LOPZIONEhTASTODESTROvÒPRESENTE
s ILVOLO!:ÒhDECOLLATOv

Il diagramma degli stati è usato per rappresentare la modifica dello stato di un oggetto al
verificarsi di un evento.

Nel diagramma dei casi d’uso viene definito quali sono i


casi d’uso, quali gli attori che intervengono e come si rap-
portano tra di loro.
Prenota visita

Nell’esempio di figura 2 viene mostrato il diagramma


di un sistema per gestire le visite. In questo caso l’utente
esterno accede al sistema per prenotare una visita o per
pagarla dopo che è stata effettuata. utente
Paga visita
Un caso d’uso può utilizzare (“uses”) un altro caso
d’uso, attivandolo. Per esempio il caso d’uso delle
prenotazioni richiama il caso d’uso di controllo posto figura 2 Interazione di un utente con i casi d’uso
libero come mostrato in figura 3.

Prenota visita

utente Cerca posto

Paga visita

figura 3#ASODUSOCHEhUSAvUNALTROCASODUSO

Lezione 7 La modellazione funzionale 235


● Altri tipi di casi d’uso
Vi sono inoltre casi d’uso di livello più basso.
La relazione di inclusione <<include>> specifica che un caso d’uso di base comprende
sistematicamente il comportamento descritto dal caso incluso. Esso non è mai eseguito da
solo ma solamente in quanto parte del caso d’uso di base. Indica un frammento che viene
sempre eseguito durante l’esecuzione del caso d’uso alla base della freccia.
Nell’esempio di figura 4 precedente il caso d’uso “Aggiorna prenotazioni” potrà essere
usato (attivato) solo dal caso d’uso “Prenota visita”.

<<include>>
Aggiorna prenotazioni
Prenota visita

utente
Cerca posto

Paga visita

figura 4%SEMPIODIhINCLUDOv

La relazione estensione <<extend>> fornisce una forma controllata di estensione del


comportamento di un caso base per mezzo dell’attivazione di un altro caso d’uso in base
a specifiche condizioni. Il caso d’uso di base potrebbe operare da solo oppure in altre
circostanze (al verificarsi di certe condizioni) richiedere l’estensione.

La relazione <<include>> si differenzia dalla relazione <<extend>> poiché il caso d’uso


“incluso” è sempre attivato mentre nell’estensione sono descritti dei comportamenti opzio-
nali. L’estensione indica un frammento che può essere eseguito in determinate circostanze.
Nella fase di analisi si può seguire una semplice regola per capire se usare extend o include:
UÊ Ṏˆââ>ÀiÊiÝÌi˜`ʵÕ>˜`œÊÈÊ`iÃVÀˆÛiÊ՘>ÊÛ>Àˆ>∜˜iÊ>ÊVœ“«œÀÌ>“i˜ÌœÊ˜œÀ“>iÆ
UÊ Ṏˆââ>Àiʈ˜VÕ`iʵÕ>˜`œÊÈÊÃÌ>ÊÀˆ«iÌi˜`œÊ>Ê`iÃVÀˆâˆœ˜iÊ`ˆÊ՘ÊVœ“«œÀÌ>“i˜ÌœÊ«ÀiÃi˜ÌiÊ
già in uno o più differenti use cases.

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.

236 Unità 7 La progettazione con UML


numero requisito attori caso d’uso
1 un produttore di computer offre la possibilità di cliente seleziona computer
acquistare computer on line. ordina computer

2 accedendo alla pagina Web il cliente può cliente visualizza configurazioni standard
visualizzare le configurazioni standard di com-
puter disponibili

3 o può costruirsela interattivamente cliente configura computer

4 i componenti configurabili (come memorie, cliente visualizza elenco componenti


CPU ecc.) sono visualizzati in una lista di seleziona componenti
opzioni disponibili

5 per ogni configurazione il cliente può valutar- cliente calcola costo


ne il costo

6 nella fase di configurazione il cliente può farsi cliente, venditore richiesta aiuto venditore
aiutare da un venditore configura computer

Il diagramma può essere quello rappresentato nella figura 5.

Ordina Computer
Visualizza configurazioni standard
Seleziona computer

<<extend>>

Calcola costo
Visualizza elenco componenti

<<extend>>
Cliente

Seleziona componenti
Richiesta aiuto venditore <<extend>>

Configura computer
Venditore

figura 5 Diagramma dei casi d’uso dell’esempio

verifica le tue conoscenze


1 A che cosa serve un caso d’uso? 3 Chi sono gli attori nei diagrammi dei casi d’uso?
2 Che cos’è un evento? 4 #HEDIFFERENZACÒTRAhINCLUDEvEDhEXTENDv

Lezione 7 La modellazione funzionale 237


7
UNITÀ lezione

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ÀˆvˆV>ʏ>Ê`ˆÃ«œ˜ˆ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˜ÌˆvˆV>˜œÊ}ˆÊœ}}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).

Cliente Impiegato Campi

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()

9: campo non disponibile()


10: Risposta negativa()

figura 1 Diagramma di sequenza per la prenotazione di un campo

238 Unità 7 La progettazione con UML


La definizione del diagramma di sequenza parte normalmente dall’analisi del diagramma
delle classi e da quello dei casi d’uso. Nel nostro esempio il diagramma delle classi può
Àˆ`ÕÀÈÊ>>ÊÃi“«ˆViÊV>ÃÃiÊ
>“«ˆ]ʓi˜ÌÀiʈÊ`ˆ>}À>““>Ê`iˆÊV>ÈÊ`½ÕÜʫœÌÀiLLiÊiÃÃiÀiʵÕiœÊ
mostrato in figura 2.

Richiedi campo

Verifica disponibilità
Cliente

Paga campo

Impiegato
Rilascia ricevuta Aggiorna stato

figura 2 Diagramma dei casi d’uso per la prenotazione di un campo

Ecco alcuni utili consigli per creare il diagramma:


£°Ê
œ“ˆ˜Vˆ>ÀiÊ >Ê Vœ˜Ãˆ`iÀ>ÀiÊ Ãi“«ÀiÊ ½ˆ˜ÌiÀ>∜˜iÊ «ˆÙÊ ºÕ˜}>»Ê «iÀV…jÊ ˆ˜Ê }i˜iÀiÊ mÊ >Ê «ˆÙÊ
significativa
UÊ Õ˜>ÊÃiµÕi˜â>Ê`iÊ̈«œÊº½ÕÌi˜ÌiÊ>ÀÀˆÛ>]ÊV>“Lˆ>ʈ`i>ÊiÊÃiʘiÊÛ>»Ê˜œ˜ÊmʓœÌœÊÈ}˜ˆvˆV>‡
tiva, anche se corrisponde a un caso d’uso reale;
UÊ ÃœˆÌ>“i˜ÌiÊ ½ˆ˜ÌiÀ>∜˜iÊ «ˆÙÊ Õ˜}>Ê mÊ µÕi>Ê ˆ˜Ê VÕˆÊ Û>Ê ÌÕÌÌœÊ Li˜i]Ê ˜œ˜Ê VˆÊ ܘœÊ VˆœmÊ
Campi
ripensamenti o eccezioni.
2. Fare in modo che un solo oggetto appartenente al dominio del problema gestisca il +Nome
+Orari
controllo di un caso d’uso +Prezzi
UÊ «iÀʜ}˜ˆÊV>ÜÊ`½ÕÜÊV½mÊ՘ʜ}}iÌ̜ÊV…iʺÃ>»ÊVœ“iʏœÊÈÊ}iÃ̈ÃVi]Ê}ˆÊ>ÌÀˆÊœ}}iÌ̈Êv>˜˜œÊ
da supporto a tale gestione; +Verifica disponibilità()
+Aggiorna stato()
UÊ Ì>iÊ >VVœÀ}ˆ“i˜ÌœÊ >Փi˜Ì>Ê ˜œÌiۜ“i˜ÌiÊ >Ê ÀˆÕÃ>LˆˆÌDÊ `i}ˆÊ œ}}iÌÌˆÊ iÊ v>ۜÀˆÃViÊ >Ê +Disponibilità()
Ài>ˆââ>∜˜iÊ`ˆÊ>ÀV…ˆÌiÌÌÕÀiÊ
ˆi˜Ì‡-iÀÛiÀ°
figura 3
L’analisi delle interazioni può condurre alla scoperta di operazioni delle classi: ogni messag- #LASSEh#AMPIv
gio invoca in genere l’operazione dell’oggetto chiamato che ha lo stesso nome del messag-
gio (es. verifica disponibilità campo). In questa fase si può cominciare a indicare nelle classi
i metodi che si individuano. Nel nostro esempio la classe può diventare quella mostrata
nella figura 3.

verifica le tue conoscenze


1 Che cos’è il modello dinamico? 3 Come si rappresenta il tempo nei diagrammi di
sequenza?
2 Che cos’è un diagramma di sequenza?

Lezione 8 La modellazione dinamica 239


7
UNITÀ lezione

9 Diagrammi di stato e di attività

● 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
6EDIAMOPERESEMPIOILDIAGRAMMADISTATODELLACLASSE#/.4/CHEINIZIALMENTERISULTAhNON
PAGATOv0OTRÌPASSAREIMMEDIATAMENTENELLOSTATOh0AGATOvSEVIENESALDATOSUBITO OPPURE
PASSAREPRIMANELLOSTATOh0AGATOPARZIALEvSEVIENESALDATOINUNSECONDOMOMENTODOPOAVER
dato un anticipo.

NON PAGATO

ANTICIPO
PAGATO SALDO
PARZIALE
SALDO

PAGATO

240 Unità 7 La progettazione con UML


● Sequenza di eventi
Una sequenza di eventi corrisponde a un cammino attraverso il diagramma degli stati.
L’attività eseguita per rispondere a un evento da parte dell’oggetto ricevente dipende dallo
stato di tale oggetto e può includere:
UÊ Õ˜>ʓœ`ˆvˆV>Ê`iœÊÃÌ>̜Ê`ˆÊÌ>iʜ}}iÌ̜Æ
UÊ ½ˆ˜ÛˆœÊ`ˆÊ՘Ê>ÌÀœÊiÛi˜ÌœÊ­ÌÀ>“ˆÌiÊ՘ʓiÃÃ>}}ˆœ®Ê>Ê“ˆÌÌi˜Ìiʈ˜ˆâˆ>iʜÊ>Ê՘ÊÌiÀâœÊœ}}iÌ̜°Ê
Un evento può logicamente precedere un altro evento oppure i due eventi possono essere
non collegati:
UÊ ˆÊۜœÊ£ÓÎÊ`iÛiÊ«>À̈ÀiÊ`>Ê
…ˆV>}œÊ«Àˆ“>Ê`ˆÊ>ÀÀˆÛ>ÀiÊ>Ê->˜ÊÀ>˜VˆÃVœÊ­µÕiÃ̈Ê`ÕiÊiÛi˜ÌˆÊ
sono causalmente collegati);
UÊ ˆÊۜœÊ£ÓÎʫբʫ>À̈ÀiÊ«Àˆ“>ʜÊ`œ«œÊ`i>Ê«>ÀÌi˜â>Ê`iÊۜœÊ{xÈÊ`>Ê,œ“>Ê­µÕiÃ̈Ê`ÕiÊ
eventi non sono casualmente collegati e si considerano concorrenti).
Anche se ogni evento rappresenta un’occorrenza unica normalmente gli eventi sono rag-
}ÀÕ««>̈ʈ˜ÊV>ÃÈÊ`ˆÊiÛi˜Ìˆ°Ê*iÀÊiÃi“«ˆœ\ʺˆÊۜœÊ£ÓÎÊ«>ÀÌiÊ`>Ê
…ˆV>}œ»ÊiʺˆÊۜœÊ{xÈÊ«>ÀÌiÊ
da Roma” sono istanze della classe di eventi “Partenza voli”.
In alcuni casi un evento è un semplice segnale mentre altri eventi trasmettono informazioni
che possiamo considerare gli attributi dell’evento.
Uno stato può essere caratterizzato tramite:
UÊ vÀ>Ãiʈ˜Êˆ˜}Õ>}}ˆœÊ˜>ÌÕÀ>i\
– “la sveglia dell’orologio sta suonando per indicare l’ora stabilita”;
UÊ ˆ˜Ãˆi“iÊ`ˆÊVœ˜`ˆâˆœ˜ˆ\
– sveglia = “on”;
qÊ œÀ>ÊÃÌ>LˆˆÌ>ʐʜÀ>Ê>ÌÌÕ>iʐʜÀ>Ê«Àœ}À>““>Ì>ʳÊÓäÊÃiVœ˜`ˆÆ
– nessun tasto è stato schiacciato dopo l’ora stabilita.

● 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

Nell’esempio della figura 1ʏœÊÃÌ>̜ʺ


>˜ViœÊ«iÀ̜»Ê
si raggiunge quando si attiva la transizione Apri e questo
ÃV>ÌÌ>ʵÕ>˜`œÊˆÊÈÃÌi“>ÊmʘiiÊÃÌ>̜ʺ
>˜ViœÊV…ˆÕÜ»ÊiÊ
figura 1 Diagramma di stato con condizioni
ˆ˜ÊVœ˜Ìi“«œÀ>˜i>ʘiœÊÃÌ>̜ʺ
œ`ˆViʈ˜ÃiÀˆÌœ»°

esercizio guidato
Testo Descrivi il diagramma di stato dell’oggetto “telefonata”.
Analisi Gli stati possibili sono:
UÊ Ìiivœ˜œÊ Vœ˜Ê ̜˜œÊ ˆ˜ˆâˆ>i]Ê µÕ>˜`œÊ ÃˆÊ mÊ >â>Ì>Ê >Ê VœÀ˜iÌÌ>Ê iÊ ˜œ˜Ê ÃˆÊ mÊ >˜VœÀ>Ê `ˆ}ˆÌ>ÌœÊ ˆÊ
numero;

Lezione 8 Diagrammi di stato e di attività 241


UÊ `ˆ}ˆÌ>∜˜iʘՓiÀœ]ʓi˜ÌÀiÊÃ̈>“œÊ`ˆ}ˆÌ>˜`œÊiÊÛ>ÀˆiÊVˆvÀiÊ`iÊ˜Õ“iÀœÊ“>ʘœ˜Ê>LLˆ>“œÊ
ancora finito;
UÊ >ÌÌiÃ>ÊÀˆÃ«œÃÌ>]ʵÕ>˜`œÊÈÊmÊvˆ˜ˆÌœÊ`ˆÊ`ˆ}ˆÌ>ÀiʈÊ˜Õ“iÀœÊiÊÈÊ>ÌÌi˜`iÊV…iʵÕ>V՘œÊÀˆ«œ˜`>Ê
dall’altra parte;
UÊ Vœ˜ÛiÀÃ>∜˜i]ʓi˜ÌÀiÊÃ̈>“œÊ«>À>˜`œÊ>ÊÌiivœ˜œ°

Gli eventi che occorrono sono:


UÊ >â>ÊVœÀ˜iÌÌ>]Ê«iÀÊ>Ûۈ>Àiʏ>ÊÌiivœ˜>Ì>Æ
UÊ VˆvÀ>]Ê«iÀÊVœ“ˆ˜Vˆ>ÀiÊ>Ê`ˆ}ˆÌ>ÀiÊ՘>ÊVˆvÀ>ÊÃՏÊÌ>Ã̈iÀˆ˜œÊ`iÊÌiivœ˜œÆ
UÊ >ÌÀ>ÊVˆvÀ>]Ê«iÀÊ`ˆ}ˆÌ>ÀiÊ՘½>ÌÀ>ÊVˆvÀ>Æ
UÊ ˜Õ“iÀœÊVœ“«i̜]ʵÕ>˜`œÊÈÊmÊ`ˆ}ˆÌ>Ì>ʏ½ÕÌˆ“>ÊVˆvÀ>ÊiÊÈʫ>ÃÃ>ʈ˜Êv>ÃiÊ`ˆÊ>ÌÌiÃ>Æ
UÊ ÀˆÃ«œ˜`i]ʵÕ>˜`œÊ`>½>ÌÀœÊ>̜ʵÕ>V՘œÊ>â>ʏ>ÊVœÀ˜iÌÌ>ÊiÊÀˆÃ«œ˜`iÆ
UÊ Àˆ>ÌÌ>VV>]ʵÕ>˜`œ]ʵÕ>Õ˜µÕiÊÈ>ʏœÊÃÌ>̜]ÊÈÊ>LL>ÃÃ>ʏ>ÊVœÀ˜iÌÌ>°

Il diagramma di stato corrispondente sarà quello mostrato in figura 2.

alza cornetta

INIZIA TONO
riattacca

cifra

DIGITAZIONE riattacca
NUMERO

numero completo
altra cifra riattacca
ATTESA RISPOSTA

riattacca
risponde

CONVERSAZIONE

figura 2 Diagramma di stato di una telefonata

● 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).

242 Unità 7 La progettazione con UML


Per collegare il diagramma degli eventi è necessario specificare quale operazione viene
invocata quando si ha un evento. In pratica si realizza il complementare del diagramma
degli stati.
Le operazioni sono distinte in:
UÊ >Ì̈ۈÌD]ÊV…iʈ“«ˆi}>˜œÊ՘ÊViÀ̜ÊÌi“«œÊ>ÊiÃÃiÀiÊiÃi}ՈÌiÊiÊܘœÊ>ÃÜVˆ>ÌiÊ>ÊÃÌ>̈Æ
UÊ >∜˜ˆ]ÊV…iÊܘœÊVœ˜Ãˆ`iÀ>ÌiʈÃÌ>˜Ì>˜iiÊ`>Ê«Õ˜ÌœÊ`ˆÊۈÃÌ>Ê`iÊ“œ`iœÊ­ˆ˜Ê>ÌÀiÊ«>ÀœiÊ
sono operazioni per cui non ci interessa dettagliarne l’organizzazione interna).

Nella figura 3 è mostrato l’esempio di un diagramma di attività relativo all’acquisto di


un computer on line dopo che lo si è eventualmente configurato.

Configura computer

Mostra modulo acquisto

Consulta istruzioni acquisto

incompleto
Compila modulo
OK
Salva ordine

Invia ordine Annulla ordine

figura 3 Diagramma delle attività

verifica le tue conoscenze


1 Che cos’è un diagramma di stato? 3 Che cos’è una condizione?
4 Che rapporto esiste tra diagramma di stato e
2 Due eventi possono essere concorrenti? diagramma di attività?

Lezione 9 Diagrammi di stato e di attività 243


unità

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 2 La modellazione degli oggetti


L’insieme degli elementi della realtà (oggetti) dotati di caratteristiche comuni viene rap-
presentato in una classe. Ogni classe è dotata di attributi e metodi (operazioni).

lezione 3 Associazioni e link


Nel modello degli oggetti di UML un’associazione rappresenta il legame tra classi di og-
getti. Può legare una classe a se stessa oppure duo o più classi tra loro.

lezione 4 Il diagramma delle classi


Il diagramma delle classi permette di descrivere le classi del sistema che si sta proget-
tando nonché le associazioni tra di loro. L’uso di un dizionario dei dati permette di evi-
tare incongruenza e inconsistenze.

lezione 5 Generalizzazione ed ereditarietà


Una delle caratteristiche dei sistemi a oggetti è quello di poter gestire l’ereditarietà.

œ˜Ãi˜ÌiÊ`ˆÊiÃÌi˜`iÀiÊV>ÃÈʫÀiiÈÃÌi˜ÌˆÊ>}}ˆÕ˜}i˜`œÊœÊ“œ`ˆvˆV>˜`œÊVœ“«œ˜i˜ÌˆÊ­>̇
tributi o metodi). Un oggetto può essere composto da più sottoggetti, in questo caso si
parla di aggregazione.

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.

244 Unità 7 La progettazione con UML


unità

lezione 7 La modellazione funzionale


Il diagramma dei casi d’uso è uno strumento fornito da UML per descrivere gli aspet-
ti funzionali del sistema. Serve a descrivere cosa il sistema deve fare e chi e come deve
usarlo. Nel diagramma si rappresentano i “casi d’uso” (particolare modalità di uso del
sistema) e gli attori (soggetti esterni che interagiscono con il sistema).

lezione 8 La modellazione dinamica


Il modello dinamico rappresenta gli aspetti temporali di un sistema ed è graficamente
rappresentato tramite i diagrammi di stato, i diagrammi di sequenza, i diagrammi di
attività. In particolare i diagrammi di attività permettono di evidenziare come i vari og-
getti del sistema interagiscono tra di loro.

lezione 9 Diagrammi di stato e di attività


I diagrammi di stato e i diagrammi di attività sono complementari tra loro. Nei primi
infatti si definiscono i possibili stati di un oggetto e si evidenziano le attività che porta-
no a un particolare stato. Nei secondi il focus è sulle attività, legate tra loro dal cambia-
mento che gli oggetti hanno a fronte di un’attività.

Unità 7 La progettazione con UML 245


unità

7 domande per l’orale

unità 7 La progettazione con UML


Ripasso MP3
1 Quali sono le fasi della metodologia UML?

➞ L1

2 Che cos’è un metodo di un oggetto?

➞ L2

3 Su che paradigma si basa UML?

➞ L1,L2

4 Cosa vuol dire molteplicità di un’associazione?

➞ L3

5 Che rapporto c’è tra dizionario dei dati e diagramma delle classi?

➞ L4

6 Che differenza c’è tra overloading e overriding?

➞ L5

7 Cosa rappresenta una aggregazione?

➞ L6

8 Chi sono gli attori dei casi d’uso?

➞ L7

9 Che cos’è un evento?

➞ L8,L9

10 Che cos’è uno stato?

➞ L8,L9

246 Unità 7 La progettazione con UML


unità
preparati al compito in classe 7
Tema proposto
A partire dai seguenti requisiti definisci il diagramma delle classi, il diagramma dei casi d’uso, il diagram-
ma di sequenza e il diagramma di attività.
1. Il negozio “Video for all” ha in catalogo una notevole serie di titoli di film attuali e/o da cineteca. Il
film può essere disponibile in DVD o in blu-ray (o su entrambi i supporti).
2. Ogni film può essere affittato per un certo periodo (espresso in giorni), con una spesa d’affitto per quel
periodo.
3. Il negozio deve essere in grado di rispondere immediatamente a qualsiasi richiesta sulla disponibilità
di un film e quanti dischi sono disponibili per l’affitto.
4. La spesa d’affitto è differente per supporti video differenti.

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Ê Vˆi˜Ìi

Il diagramma delle classi sarà il seguente:

FILM COPIA FILM CONDIZIONI


+Codice disponibile +Supporto applica +Periodo affitto
+Titolo +Linguaggi +Spese affitto
+Regista 1 0..* 1..* 1
+Disponibile
0..*

affitta

DVD BLU RAY 0..1 CLIENTE


+Durata +Durata +Tessera
+Cognome
+Nome

Unità 7 La progettazione con UML 247


DIAGRAMMA CASI D’USO

Gestire Cliente
Verifica disponibilità

Cliente
<<extend>>

Affittare video

Ricevi pagamento Impiegato


<<include>>

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:

IMPIEGATO FILM Cliente

1: Verifica disponibilità()

2: OK()

3: Richiedi pagamento()

4: Paga()

5: Aggiorna disponibilità()

248 Unità 7 La progettazione con UML


DIAGRAMMA DI ATTIVITÀ

Chiedi video Verifica disponibilità

disponibile

Chiedi pagamento non disponibile

Pagamento effettuato

Aggiorna scorta Stampa ricevuta

L’elaborazione inizia quando il cliente chiede il video e si verifica la disponibilità. Se è disponibile, la


transazione Affitto “scatta” (è eseguita). Dopo che il pagamento è stato accettato, un’altra biforcazione
permette l’esecuzione concorrente delle attività Aggiornare Scorta e Stampare Ricevuta.

compito in classe proposto Verifica

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.

Unità 7 La progettazione con UML 249


unità

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.

250 Unità 7 La progettazione con UML


Unità
Analisi dei requisiti
8
Competenze
Sviluppare applicazioni informatiche per reti locali o servizi a distanza.
Gestire progetti secondo le procedure e gli standard previsti dai sistemi aziendali
di gestione della qualità e della sicurezza; gestire processi produttivi correlati a
funzioni aziendali.

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.

Accertamento dei prerequisiti


1 Elenca i principali diagrammi presenti in UML. b Modello incrementale
2 Quali di questi diagrammi UML non serve per c Modello a cascata
descrivere l’aspetto dinamico di un sistema? d Modello a spirale
a Diagramma delle classi
4 Descrivi cosa si intende per analisi dei requisiti.
b Diagramma dei casi d’uso
c Diagramma di sequenza 5 UML vuol dire:
d Diagramma di stato a Unique Model Language
3 Quale metodologia non si può ricondurre b User Manipulution Language
all’approccio prototipale? c Uniform Modeling Language
a Modello “usa e getta” d User Modeling List
8
UNITÀ lezione
Raccolta dei requisiti
1
● I requisiti
Per requisiti si intendono le caratteristiche e gli aspetti funzionali che gli utenti si attendono
dal sistema.
I requisiti possono essere classificati in:
UÊ requisiti di sistema (descrivono lo scopo del sistema);
UÊ requisiti funzionali (descrivono le funzioni che devono essere disponibili);
UÊ requisiti informativi (descrivono le strutture dati).
Esistono inoltre i vincoli cui il sistema deve sottostare che possono essere legati a particolari
comportamenti voluti dal cliente e a problematiche di sicurezza o di prestazioni.
L’attività di raccolta dei requisiti avviene da parte di un analista di business e/o di un
analista di sistema coinvolgendo gli utenti e i proprietari del sistema stesso (cioè i clienti),
utilizzando tecniche diverse come per esempio le tradizionali interviste ai clienti o altri
metodi come la costruzione di prototipi.
I requisiti raccolti devono essere soggetti a un’attenta analisi per eliminare duplicazioni e
contraddizioni. Questo compito conduce, in genere, a revisioni e ridiscussioni dei requisiti
con i clienti che li hanno espressi.
Una volta accettati dai clienti, i requisiti sono definiti, classificati, numerati e ordinati
secondo certe priorità nel documento dei requisiti.

● 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.

Interviste a clienti ed esperti di dominio


Le interviste sono in genere condotte con i clienti e forniscono informazioni sulle funziona-
lità del sistema in esame, o su quelle che il cliente vorrebbe nel sistema. Portano in genere
a definire il modello dei casi d’uso.

252 Unità 8 Analisi dei requisiti


Vi sono due tipologie fondamentali di interviste strutturate (formali) e non strutturate
(informali).
1. Intervista strutturata: viene preparata in anticipo e prevede normalmente un for-
mulario di domande predefinite. Vi sono sia domande aperte dove il cliente è libero
di esprimere le sue indicazioni sia chiuse con risposta selezionabile da un insieme di
possibili risposte già fornite.
2. Intervista non strutturata: si tratta in genere di incontri informali, senza domande anti-
cipate o obiettivi predeterminati in cui si vuole portare il cliente a parlare di ciò che ha in
mente. Può comunque essere utile avere a disposizione un canovaccio in modo da portare
il cliente a capire di cosa ha realmente bisogno e quali siano le sue reali esigenze. Sono
da evitare domande nelle quali l’intervistatore esprime (direttamente o indirettamente) la
propria opinione sul problema (“dobbiamo fare le cose secondo questo schema?”) oppure
domande contenenti già la risposta (“vorresti che il sistema facesse questo, non è vero?”).
Nello stesso tempo è importante capire le esigenze del cliente e aiutarlo nell’esprimerle.

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
----------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------

Lezione 1 Raccolta dei requisiti 253


Osservazioni
L’osservazione diretta può essere una tecnica efficace per l’individuazione delle informa-
zioni necessarie quando il cliente potrebbe non essere in grado di fornirle direttamente
o potrebbe averne solo una conoscenza parziale. L’osservazione può essere passiva o
attiva.
Nell’osservazione passiva l’analista osserva le attività svolte dal cliente senza un suo
coinvolgimento diretto. A volte però le persone tendono a comportarsi in modo non
naturale, quando sono osservate. Possono per esempio lavorare seguendo molto rigida-
mente le regole e le procedure formali, cosa che non farebbero se non fossero osservati.
Questo distorce la realtà poiché non emergono le reali modalità di lavoro nascondendo
per esempio alternative utili o non evidenziando dei problemi reali. Per questo motivo
può essere utile in alcuni casi usare una videocamera per un’osservazione poco intrusiva.
Nell’osservazione attiva, l’analista partecipa direttamente alle attività ed entra a far parte
del gruppo di lavoro.
In ogni caso le osservazioni dovrebbero essere svolte per periodi prolungati, in differenti
intervalli temporali, con differenti carichi di lavoro e anche con gruppi di lavoro differenti

Studio dei documenti e dei sistemi software


Per approfondire la conoscenza del dominio e per ricercare i requisiti legati ai casi d’uso
fondamentale è lo studio dei documenti. Vengono esaminati i documenti organizzativi
quali la modulistica aziendale (per vedere degli esempi è utile analizzare anche moduli già
compilati), la descrizione delle procedure lavorative e delle politiche di intervento, piani di
business, organigrammi, corrispondenza tra uffici, registrazioni contabili, corrispondenza
esterna, lamentele clienti ecc. In pratica tutti i documenti che possono aiutare a comporre
il funzionameto del sistema.
Se esiste già un sistema software lo si può esaminare analizzando l’interfaccia e i report
(con la relativa documentazione), manuali operativi di sistema, documentazione utente,
documentazione tecnica, modelli di analisi e progetto, l’archivio dei difetti e delle richieste
di modifica del sistema esistente ecc.
La conoscenza del dominio può essere poi approfondita tramite la consultazione di riviste
e libri di riferimento, nonché di documenti di soluzioni adottate per altre realtà aziendali
analoghe.

● 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).

254 Unità 8 Analisi dei requisiti


Sviluppo cooperativo delle applicazioni – JAD
Nell’approccio JAD (Joint Application Development) si organizzano riunioni di gruppo per
far lavorare a stretto contatto clienti e sviluppatori. Una riunione JAD può durare poche
ore, qualche giorno o anche due settimane. Il numero di partecipanti non dovrebbe supe-
rare un limite compreso tra 25 e 30.
Le figure presenti nel gruppo sono:
UÊ leader: la persona che dirige e modera l’incontro, normalmente dotato di eccellenti
capacità di comunicazione e una buona conoscenza del dominio del business (non
necessariamente dello sviluppo del software);
UÊ segretario: la persona che registra la sessione JAD su computer, dotato di buona capa-
cità di scrittura e un’ottima conoscenza dello sviluppo del software. Può usare strumenti
CASE per documentare la sessione e sviluppare modelli iniziali di soluzione;
UÊ clienti (utenti e manager): mettono in comune e discutono requisiti, prendono deci-
sioni, approvano obiettivi di progetto ecc.
UÊ sviluppatori, analisti di business e altri membri del gruppo di sviluppo: ascoltano
piuttosto che intervenire, partecipano all’incontro per scoprire fatti e raccogliere infor-
mazione, non per influenzare il processo.
Questa tecnica si basa sul concetto che la “sinergia di gruppo” produce migliori soluzioni
ai problemi. I gruppi incrementano la produttività, apprendono più velocemente, produ-
cono giudizi più equilibrati, eliminano più facilmente gli errori, orientano l’attenzione dei
partecipanti sui problemi più importanti, integrano le persone ecc.

Sviluppo rapido delle applicazioni (RAD)


Questo approccio allo sviluppo del software punta a creare rapidamente una soluzione
combinando più tecniche quali per esempio:
U prototipo evolutivo;
U strumenti CASE con possibilità di generazione di codice e sviluppo integrato tra modelli
di progetto e codice;
U JAD iterattivo con pesante uso di strumenti CASE.

verifica le tue conoscenze


1 Chi è l’analista di business? 3 A che cosa servono i prototipi?
2 Che strumenti si usano per l’analisi dei requisiti? 4 Come devono essere composti i questionari?

Lezione 1 Raccolta dei requisiti 255


8
UNITÀ lezione
Gestione dei requisiti
2
● Validazione dei requisiti
Una volta che i requisiti sono raccolti questi vanno validati. I requisiti derivati da differenti
utenti, anche se legati allo stesso sistema, potrebbero per esempio sovrapporsi o essere in
conflitto. Alcuni requisiti potrebbero essere ambigui o non realistici, altri requisiti potreb-
bero rimanere ignorati. Nella descrizione potrebbero evidenziarsi problemi di sinonimia
(nomi diversi ma stesso significato), omonimia (nomi uguali ma significati diversi), simili-
tudine (es. parziale sovrapposizione di significato).
I requisiti devono quindi essere validati con i clienti prima di essere riportati nel docu-
mento dei requisiti.
Una volta che i requisiti siano stati raccolti in uno specifico documento dei requisiti, la
ricerca dei conflitti avviene confrontando un requisito con tutti gli altri. Ciò implica un
confronto con gli utenti per migliorare la comprensione dei requisiti elencati, modifican-
doli se necessario. In questa fase verranno eliminati quelli non pertinenti o se occorre ne
verranno aggiunti di nuovi.
Il risultato finale sarà una versione completa del documento dei requisiti, con tutti i requi-
siti chiaramente identificati e classificati.
I requisiti, una volta identificati, devono essere poi organizzati e documentati. Nel tempo
i requisiti possono cambiare e di questo bisogna tenerne traccia così come vanno poi con-
siderate le relazioni con gli altri sistemi.

●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).

I requisiti possono essere strutturati gerarchicamente con relazioni di composizione: un


requisito può essere composto da più sotto-requisiti e, a sua volta, può essere parte di un
requisito a livello superiore.
Le relazioni gerarchiche introducono livelli di classificazione nei requisiti e questo può
riflettersi nei numeri d’identificazione (usando la notazione a punto). Per esempio, consi-
deriamo il seguente insieme gerarchico di requisiti:

1. “Il sistema, su richiesta dell’operatore, stampa i report giornalieri”


1.1 “Il sistema, stampa il report giornaliero delle vendite”
1.2 “Il sistema, stampa il report giornaliero degli acquisti”
1.3. ecc.

256 Unità 8 Analisi dei requisiti


● Gestione del cambiamento
e tracciabilità dei requisiti
Durante la fase di sviluppo alcuni requisiti possono essere modificati, altri possono essere
rimossi oppure se ne possono aggiungere di nuovi.
Modificare un requisito dopo che è stato implementato nel sistema potrebbe essere molto
costoso, tanto da risultare proibitivo per la necessità di individuare e modificare tutte le
parti di progetto già sviluppate a partire dal requisito iniziale. È importante seguire quindi
delle politiche ben definite per documentare la richiesta di cambiamento, per stimare il
suo impatto nel progetto e per effettuare le modifiche. Una modifica accettata deve essere
analizzata per valutarne la fattibilità tecnica, l’impatto sul resto del progetto e il costo.
Una volta approvata, la modifica viene inserita aggiornando i vari documenti nei modelli in
cui è rilevante, fino a modificare i requisiti (tracciabilità). La tracciabilità deve essere gestita
attraverso strumenti automatizzati.

● Analisi dei rischi


Una volta che sono risolti conflitti e sovrapposizioni e l’insieme dei requisiti risulta comple-
to è necessario sottoporlo a un’analisi del rischio e a una valutazione della priorità. L’analisi Risk Management
del rischio identifica i requisiti che potrebbero causare difficoltà nello sviluppo, mentre la Si tratta di un’area in cui si valutano
valutazione della priorità serve per permettere un’eventuale ritaratura del progetto nel caso i rischi presenti nello sviluppo di un
vi fossero ritardi (per esempio, non considerando i requisiti con bassa priorità per rispet- processo/sistema, dal punto di
tare i tempi di completamento). vista sia tecnico sia economico. In
I requisiti possono essere “rischiosi” a causa di una varietà di fattori. Il rischio può essere: alcuni casi il rischio ci vincola a certe
scelte, mentre in altri casi possiamo
UÊ tecnico (il requisito è difficile da implementare tecnicamente);
valutare se l’eventuale danno a cui
UÊ di prestazione (se implementato si ha un tempo di risposta non accettabile); potremmo andare incontro è supe-
UÊ di sicurezza (se implementato può esporre il sistema a pericoli di intrusione); riore o inferiore ai possibili vantaggi.
UÊ d’integrità della base dati e di inconsistenza nei dati;
UÊ nel processo di sviluppo (richiede l’uso di strumenti di sviluppo non convenzionali);
UÊ legale (potrebbe violare leggi attualmente vigenti);
UÊ di volatilità (oggetto di modifiche frequenti durante il processo di sviluppo).

● Documento dei requisiti


È il risultato della fase di determinazione dei requisiti e deve essere organizzato secondo
uno schema predefinito.
I requisiti sono normalmente raggruppati in requisiti funzionali e vincoli. I requisiti fun-
zionali possono ulteriormente essere classificati in requisiti sulle operazioni e requisiti
sui dati. Nella parte introduttiva del documento va considerato il contesto del progetto,
comprendente lo scopo del progetto, la descrizione degli stakeholder e i vincoli principali.
Nella conclusione sono discussi i restanti problemi, compresi i tempi, i costi, i rischi, la
documentazione ecc.

Ecco un esempio di Indice del documento dei requisiti


1. Premesse del progetto:
– obiettivi e scopo del prodotto;
– contesto di business;
– stakeholder;
– soluzioni preliminari;
– sintesi del documento.
2. Servizi del sistema:
– scopo del sistema;

Lezione 2 Gestione dei requisiti 257


– requisiti funzionali;
– requisiti informativi.
3. Vincoli di sistema:
– requisiti di interfaccia;
– requisiti di prestazione;
– requisiti di sicurezza;
– requisiti operativi;
– requisiti politici e legali;
– altri vincoli.
4. Problemi progettuali:
– problemi aperti;
– programma preliminare;
– previsione costi.
5. Appendici:
– glossario;
– documenti e moduli del business;
Ricordiamo che in UML la parte stati-
– riferimenti.
ca del sistema (dati) è rappresentata
nel diagramma delle classi, mentre Analizziamo le varie parti che compongono il documento.
la parte dinamica è descritta tramite
il diagramma dei casi d’uso.
Premesse del progetto
In questa parte vanno spiegati chiaramente gli obiettivi e lo scopo del progetto e descritto
il contesto di business. È rivolto principalmente ai manager e ai decisori che non studie-
ranno in dettaglio l’intero documento ma si limiteranno a esaminare gli aspetti fondamen-
tali. Tra le cose da evidenziare c’è sicuramente la descrizione di come il sistema proposto
contribuirà agli obiettivi e alle finalità di business dell’organizzazione. Vanno identificati gli
stakeholder (cioè gli utenti del sistema) e devono essere ben descritte le linee generali della
soluzione con eventualmente una lista di package software e di componenti che andranno
poi ulteriormente analizzati.
Questa parte va conclusa con una sintesi del documento per facilitare la comprensione del
contenuto. In questa sintesi dovrebbe anche essere spiegata la metodologia di analisi e di
progetto adottata dagli sviluppatori.

Servizi del sistema


Viene definito cosa il sistema deve fornire. È la parte più importante del documento e
conterrà i modelli ad alto livello (modelli dei requisiti di business).
Saranno quindi presenti:
UÊ diagramma di contesto;
UÊ diagramma dei casi d’uso dove sono descritti i requisiti funzionali. Ciascun requisito
deve essere identificato, classificato e definito;
UÊ diagramma delle classi che contiene i requisiti informativi. Il diagramma non è una
definizione completa delle strutture dati, gli attributi della classe potrebbero essere bre-
vemente descritti e gli identificatori dovrebbero essere determinati.

Vincoli del sistema


Vengono descritte le limitazioni cui il sistema deve sottostare quando esegue i propri ser-
vizi. Possiamo individuare:
U requisiti d’interfaccia: come si presenterà l’interfaccia con gli utenti e le problematiche
d’interazione. Il progetto iniziale dell’interfaccia sarà condotto durante la specifica dei
requisiti e sviluppato successivamente durante il progetto di sistema;
U requisiti di prestazione (riguardano i tempi di risposta del sistema per i vari compiti da
eseguire, l’affidabilità, la disponibilità, l’efficienza ecc.);
U requisiti di sicurezza (privilegi d’accesso degli utenti all’informazione, gli utenti possono
essere imposte restrizioni per l’accesso ai dati e/o limitazioni per l’esecuzione di certe
operazioni sui dati stessi);
U requisiti operativi (specificano l’ambiente hardware/software, valutano l’impatto su altri

258 Unità 8 Analisi dei requisiti


aspetti del progetto come l’addestramento degli utenti e la manutenzione del sistema);
U requisiti politici e requisiti legali (devono essere messi in evidenza perché potrebbero
provocare il rifiuto del prodotto);
U altri vincoli: come per esempio richieste sulla semplicità d’uso del sistema (requisiti di
usabilità) o sulla semplicità di manutenzione del sistema (requisiti di manutenibilità).

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.

verifica le tue conoscenze


1 Come vanno catalogati i requisiti? 3 Che cosa deve contenere un documento dei requisiti?
2 Perché è importante la tracciabilità dei requisiti? 4 Che cosa sono i vincoli di sistema?

Lezione 2 Gestione dei requisiti 259


8
UNITÀ lezione
Definizione dei requisiti
3
● Il processo di gestione dei requisiti
Il processo di analisi e reperimento dei requisiti si articola in 3 fasi:
1. Definizione dei requisiti (Requirement Definition)
2. Target Setting
3. Identificazione soluzione (Solution Identification and Testing) (figura 1).
Fase A Fase B Fase C
Requirement Target Setting Solution
Definition Identification & Testing

Individuazione e
Definizione Valutazione
consolidamento
requisiti alternative
Provided Function

Mapping tra Identificazione


Consolidamento
Requested Function soluzione
requisiti
e Provided Function

Implementazione
Definizione
importanza delle Target Setting
Testing
Requested
Function

figura 1 Processo di gestione dei requisiti

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ʏœÀœÊ>˜>}À>vˆV>Ê­,iµÕˆÀi“i˜ÌÊ>ÌÀˆÝ®°
UÊ “«œÀÌ>˜â>Ê`iiÊ,iµÕiÃÌi`Ê՘V̈œ˜Ê­,iµÕˆÀi“i˜ÌÊ>ÌÀˆÝ®°

260 Unità 8 Analisi dei requisiti


Per gestire il processo di raccolta dei requisiti si può utilizzare un normale foglio elettronico
Vœ“iÊÃÌÀՓi˜ÌœÊ`ˆÊÃÕ««œÀ̜°ÊœÊ«œÃÈ>“œÊÛi`iÀiʜÀ}>˜ˆââ>̜ÊVœ“iÊ՘>Ê,iµÕˆÀi“i˜ÌÊ>ÌÀˆÝÊ
(tabella 1) suddiviso in sezioni per permettere di raccogliere in modo strutturato tutti i
requisiti con i relativi attributi. La prima sezione contiene la scomposizione dei requisiti par-
tendo dai requisiti di alto livello. Poiché il grado di scomposizione dei requisiti può variare
in base alla complessità del problema, anche il numero delle colonne può cambiare. In ogni
caso, l’ultimo livello di scomposizione del requisito diventa una Requested Function, viene tabella 1 Esempio di
codificato come tale e viene ricopiato nell’apposita colonna (sulla stessa riga). Requirement Matrix

Deployment Requisiti Provided Function Attributi

requisito requisito requisito Requested descrizione


Provided Function importanza
di alto livello di 1° livello di 2° livello Function estesa

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

Il sistema deve Il sistema deve


consentire la consentire la
catalogazione catalogazione
di software di software
presente su presente su
supporti ottici supporti ottici
(CD-DVD) (CD-DVD)

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.

Lezione 3 Definizione dei requisiti 261


La seconda sezione della matrice contiene invece le Provided Function, cioè le funzioni che
andranno realizzate per rispondere alle richieste (requisiti). Queste andranno inserite sotto le
relative Requested Function. La terza sezione della matrice dei requisiti contiene gli attributi
(descrizione estesa e valutazione dell’importanza).
"ÌÀiÊ>>Ê`iÃVÀˆâˆœ˜iÊ`iˆÊÀiµÕˆÃˆÌˆ]ʏ>Ê,iµÕˆÀi“i˜ÌÊ>ÌÀˆÝÊVœ˜Ìˆi˜iÊ>˜V…iʈÊœÀœÊˆÛiœÊ`ˆÊ
importanza che viene definito solo per le Requested Function. Esistono numerosi metodi
per definire l’importanza di una serie di requisiti; per la loro determinazione è fondamen-
tale coinvolgere il maggior numero possibile di utenti. Considerato l’elevato numero di
Requested Function, la soluzione migliore è quella di far assegnare a ognuna un valore
di importanza (basso, medio o alto) dagli utenti. Il valore finale dell’importanza di ogni
Requested Function (che sarà compreso tra 1 a 10) sarà determinato dalla media tra tutti
gli utenti.
Poiché queste matrici possono diventare molto grosse può essere utile codificare i vari
elementi e metterli in un dizionario (vedi tabella 2).
˜Ê µÕiÃÌœÊ “œ`œÊ ˜i>Ê ,iµÕˆÀi“i˜ÌÊ >ÌÀˆÝÊ “iÌÌiÀi“œÊ ܏œÊ ˆÊ Vœ`ˆVˆÊ iÊ ˆÊ ˜œ“iÊ LÀiÛiÊ
(tabella 3).

tabella 2 Dizionario dei requisiti

codice nome descrizione attributo (descrizione estesa)

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 = Requisito, RF = Requested Function, PF = Provided Function

262 Unità 8 Analisi dei requisiti


tabella 3 Requirement matrix semplificata con codici

Deployment Requisiti Provided Function Attributi

requisito requisito requisito Requested Provided


importanza
di Alto livello di 1° livello di 2° livello Function Function

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

Testo Un’azienda che si occupa di sviluppo software e consulenza ha la necessità di riorga-


nizzare la gestione dei pacchetti software che riguardano la collocazione e il reperimento del
materiale software utilizzati all’interno dell’azienda stessa. All’interno dell’azienda infatti il sof-
tware risultava poco o per nulla organizzato, di conseguenza si verificava una grande perdita di
tempo laddove per i motivi più disparati, non solo in seguito all’acquisto di nuove postazioni,
un dipendente avesse necessità di installare una nuova applicazione sul proprio pc.

Analisi Come primo passo nella realizzazione dell’applicativo si procede al reperimento,


consolidamento e deployment dei requisiti a vari livelli; questa fase si svolge in maniera
incrementale sino a giungere alla definizione delle Requested Function.
Partiamo dalla richiesta di base, cioè quella di avere un sistema che consenta la catalogazione
del software presente in ufficio. Tutti gli applicativi si trovano su supporti ottici (CD/DVD)

Lezione 3 Definizione dei requisiti 263


e quelli che non lo sono possono essere copiati su un supporto ottico. Analizzando la situa-
zione ci si accorge dei seguenti problemi:
UÊ manca un archivio unificato;
UÊ difficoltà nel reperire CD/DVD prelevati dai dipendenti;
UÊ difficoltà nel risalire al contenuto di un determinato CD/DVD.
Quindi, per quanto riguarda la gestione dei supporti il “cliente” richiede la creazione di un
archivio fisico contenente i supporti ottici e la gestione di tale archivio.
Come già detto per identificare le funzionalità richieste e mapparle sulle funzionalità che il
sistema dovrà fornire utilizza un foglio elettronico come strumento di supporto per realizzare la
,iµÕˆÀi“i˜ÌÊ>ÌÀˆÝ°Ê*œˆV…jʏ>ʓ>ÌÀˆViÊ`ˆÛi˜ÌiÀiLLiʓœÌœÊ}À>˜`iÊ`ivˆ˜ˆ>“œÊ«Àˆ“>ʈÊ`ˆâˆœ˜>ÀˆœÊ
dei requisiti (tabella 4®ÊiÊÃÕVViÃÈÛ>“i˜Ìiʏ>Ê,iµÕˆÀi“i˜ÌÊ>ÌÀˆÝÊ­tabella 5).

tabella 4 Dizionario dei requisiti dell’esempio

codice nome descrizione attributo (descrizione estesa)

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)

264 Unità 8 Analisi dei requisiti


codice nome descrizione attributo (descrizione estesa)

PF-4 Report Report per le copertine Stampa automaticamente la copertina


copertine del CD selezionato (ovviamente il CD
deve essere già stato inserito nel DB).

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

PF-6 Maschera Maschera per collocazione Maschera che consente di associare un


collocazione software su server software e una directory del server. Un
software software può essere associato a più car-
telle e viceversa

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)

Lezione 3 Definizione dei requisiti 265


codice nome descrizione attributo (descrizione estesa)

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

PF-9 Maschera Maschera che consente la modifica dei


per dati relativi a un CD o la cancellazione
modifica CD dello stesso

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

PF-10 Maschera Maschera per collocazione Maschera che consente di associare un


collocazione software su CD software e un CD presenti nel DB. In
software CD