Politecnico di Milano

Facoltà di Ingegneria dell’Informazione

SISTEMI INFORMATICI – Esercitazioni A.A. 2012–2013

SCHEDULING, LINGUAGGIO C e STATECHARTS

Fabio PANOZZO

Indice
I Scheduling 2
3 3 3 3 4 5 10 13 13 13 13 14 14 19 20 22 22 22 22 23 23 23 26 27 35 35 35

1 Processi aperiodici 1.1 Modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 1.1.2 1.2 1.3 1.4 EDF∗ Simboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grafico dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (Preemption, vincoli di precedenza) . . . . . . . . . . . . . . . . . . . . . . .

EDF (Preemption, no vincoli di precedenza) . . . . . . . . . . . . . . . . . . . . . . SPRING (No preemption) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Processi periodici 2.1 Modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 2.1.2 2.1.3 2.2 2.3 2.4 Simboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Grafico dei processi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Risultati notevoli di schedulabilità . . . . . . . . . . . . . . . . . . . . . . .

RM (Statico, Di = Ti ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DM (Statico, Di < Ti ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EDF (Dinamico, Di = Ti ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Processi misti 3.1 3.2 Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 3.2.2 3.3 3.4 3.5 3.6 Simboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Risultati notevoli di schedulabilità . . . . . . . . . . . . . . . . . . . . . . .

Aperiodici Hard Real Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RM + DS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EDF + TBS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . EDF + TBS∗ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Gestione dell’overload 4.1 Modello . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Simboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii

4.2 4.3

Workload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DOVER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36 38

II

Linguaggio C

42
43 50

5 Comunicazione di rete 6 Programmazione parallela

III

Statecharts

54
55 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 55 56

7 Statecharts 7.1 7.2 Linguaggio 7.1.1 Simboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Esercizi (tratti da temi d’esame) . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Parte I Scheduling 2 .

se – Lmax ≤ 0 i processi sono schedulabili – Lmax > 0 i processi non sono schedulabili 1.1 1.Capitolo 1 Processi aperiodici 1. .1 Modello Simboli • {j1 .1.2 Grafico dei processi ai ji 1 2 3 4 5 6 7 8 t ci di 3 . se – Li ≤ 0 la deadline del processo i è rispettata – Li > 0 la deadline del processo i non è rispettata • Lmax = maxi Li lateness massima dei processi.1. . . jn } processi aperiodici • ai istante di arrivo di un processo • fi istante di fine di un processo • di deadline di un processo • ci tempo di computazione di un processo • Li = fi − di lateness di un processo. .

4 CAPITOLO 1. j1 ai ci di 1 1 2 j1 Li 0 j2 2 2 9 j5 -1 j3 0 3 5 j3 0 j4 3 2 8 j4 -1 j5 2 1 4 j2 0 j1 j2 j3 j4 j5 1 2 3 4 5 6 7 8 9 10 t Lmax = 0. Esercizio 1. no vincoli di precedenza) Early deadline first.2 Schematizzare la schedulazione dei processi. j1 j1 ai ci di 1 2 5 j1 Li -2 j2 4 2 11 j4 -1 j3 0 4 7 j3 0 j4 5 1 7 j6 0 j5 6 1 12 j2 0 j6 8 2 10 j2 j3 j4 j5 0 j5 j6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 t Lmax = 0. . Nota. quindi i processi sono schedulabili. All’istante 5 si potrebbero schedulare sia j3 che j4 . dare la sequenza di completamento. Sceglie il processo pronto con deadline più piccola. quindi i processi sono schedulabili.2 EDF (Preemption. Garanzia di ottimalità: restituisce la soluzione con il minimo Lmax tra tutte le possibili schedulazioni (esistenti). Esercizio 1. dare Li e Lmax . PROCESSI APERIODICI 1. dare la sequenza di completamento. dare Li e Lmax . la scelta è del tutto arbitraria.1 Schematizzare la schedulazione dei processi.

1.3. EDF∗ (PREEMPTION, VINCOLI DI PRECEDENZA) Esercizio 1.3 Dire se il seguente problema è schedulabile.

5

j1 ai ci di 1 2 4 j4 Li -1

j2 2 1 3 j2 0

j3 0 3 4 j3 1

j4 1 1 3

j1

j2

j3

j1 3

j4 1 2 3 4 5 6 7 8 t

Lmax > 0, quindi i processi non sono schedulabili. Nota. All’istante 3 si potrebbero schedulare sia j1 che j3 ; indipendentemente dalla scelta effettuata sarebbe risultato Lmax = 3 perché EDF restituisce sempre il valore ottimo.

1.3

EDF∗ (Preemption, vincoli di precedenza)

Due fasi: 1. Costruzione del problema ausiliario • a∗ i = maxjk →ji {ai , ak + ck } – un processo non deve essere attivato prima che il suo predecessore non possa aver finito • d∗ i = minji →jk {di , dk − ck } – devo poter terminare il predecessore e avere tempo a sufficienza per terminare il successore 2. EDF
a∗ i = a1 j1 c1 d∗ 1 d1

j1

j2

a2 j2 1 2 3 4

a∗ 2

d∗ = d2 c2 2

5

6

7

8

9 10 11 12

t

Nota. Il predecessore non può fare preemption del successore perché ogni volta che si dovrà scegliere tra j1 e j2 sarà scelto j1 perché la sua deadline è minore.

6 Esercizio 1.4

CAPITOLO 1. PROCESSI APERIODICI

Schedulare i seguenti processi tenendo conto delle precedenze.

j1 ai ci di 1 2 5

j2 1 2 7

j3 0 2 9

j4 0 1 7

j5 2 1 8
j2 j1

j3

j4

a∗ 2 = a2 a∗ 3 = a3 a∗ 5 = a5

a∗ 1 = max{1, 1 + 2} = 3

d∗ 1 = d1 d∗ 3 = min{9, 7 − 1} = 6 d∗ 2 = min{7, 5 − 2} = 3

a∗ 4 = max{0, 0 + 2} = 2

d∗ 4 = d4 d∗ 5 = d5

j1

j1 a∗ i ci d∗ i 3 2 5

j2 1 2 3

j3 0 2 6

j4 2 1 7

j5 2 1 8

j2

j3

j4

j5 1 2 3 4 5 6 7 8 9 10 t

1.3. EDF∗ (PREEMPTION, VINCOLI DI PRECEDENZA) Esercizio 1.5 Schedulare i seguenti processi tenendo conto delle precedenze; calcolare Lmax .
j4

7

j1 ai ci di 1 2 5

j2 0 1 11

j3 1 2 12

j4 3 1 15

j5 5 1 13

j6 5 2 14
j2 j1

j3

j6

j5

a∗ 1 = a1 a∗ 3 = max{1, 1 + 2} = 3 a∗ 2 = max{0, 1 + 2} = 3

a∗ 6 = max{5, 3 + 2, 5 + 1, 3 + 1} = 6

a∗ 5 = max{5, 3 + 1} = 5

a∗ 4 = max{3, 1 + 2} = 3

d∗ 6 = d6

d∗ 5 = min{13, 14 − 2} = 12

d∗ 4 = min{15, 14 − 2} = 12

d∗ 3 = min{12, 14 − 2} = 12

d∗ 2 = min{11, 12 − 1} = 11

d∗ 1 = min{5, 11 − 1, 12 − 2, 12 − 1} = 5

j1

j2

j1 a∗ i ci d∗ i 1 2 5

j2 3 1 11

j3 3 2 12

j4 3 1 12

j5 5 1 12

j6 6 2 14
j5 j3

j4

j6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 t

Lmax = −2.

1 + 1} = 2 a∗ 3 = max{2. 14 − 1. 1 + 1} = 2 d∗ 3 = min{13. 13 − 1} = 11 d∗ 1 = min{14. 13 − 1. . 14 − 1. j1 ai ci di 1 1 14 j2 1 1 11 j3 2 1 13 j4 2 1 24 j5 2 1 14 j6 3 1 15 j2 j4 j6 j1 j3 j5 a∗ 1 = a1 a∗ 2 = a2 a∗ 4 = max{2. 2 + 1} = 3 a∗ 6 = max{3. 1 + 1. PROCESSI APERIODICI Schedulare i seguenti processi tenendo conto delle precedenze.8 Esercizio 1. 13 − 1} = 12 a∗ 5 = max{2. calcolare Lmax . 15 − 1} = 13 d∗ 5 = d5 d∗ 4 = min{24. 2 + 1} = 3 d∗ 6 = d6 j1 j2 j1 a∗ i ci d∗ i 1 1 12 j2 1 1 11 j3 2 1 13 j4 2 1 13 j5 3 1 14 j6 3 1 15 j5 j3 j4 j6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 t Lmax = −8. 2 + 1. 2 + 1. 15 − 1} = 13 d∗ 2 = min{11.6 CAPITOLO 1.

9 j1 ai ci di 2 2 12 j2 1 2 3 j3 0 3 7 j4 3 1 8 j5 6 2 11 j6 4 1 12 j1 j6 j5 t=0 a∗ 1 = a1 a∗ 2 = a2 a∗ 3 = a3 a∗ 4 = a4 a∗ 5 = a5 a∗ 6 = a6 t=4 a∗ 1 = a1 a∗ 2 = a2 a∗ 3 = a3 a∗ 4 = a4 a∗ 5 = a5 a∗ 6 = max{4.3. 2 + 2} = 4 t=6 a∗ 1 = a1 a∗ 2 = a2 a∗ 3 = a3 a∗ 4 = a4 a∗ 6 = max{4. EDF∗ (PREEMPTION.1. 12 − 1} = 11 d∗ 2 = d2 d∗ 3 = d3 d∗ 4 = d4 d∗ 5 = d5 d∗ 6 = d6 d∗ 1 = d1 d∗ 2 = d2 d∗ 3 = d3 d∗ 4 = d4 d∗ 5 = d5 d∗ 6 = d6 . 4 + 1} = 6 d∗ 1 = min{12. 11 − 2} = 9 d∗ 1 = min{12.7 Valutare EDF∗ considerando la conoscenza del vincolo solo all’arrivo del processo. 9 − 1} = 8 d∗ 2 = d2 d∗ 3 = d3 d∗ 4 = d4 d∗ 5 = d5 d∗ 6 = min{12. 2 + 2} = 4 a∗ 5 = max{6. VINCOLI DI PRECEDENZA) Esercizio 1.

1: EDF Figura 1.2: Soluzione esistente Ricercare quindi tra tutte le possibili schedulazioni.4. Spring.4.4. PROCESSI APERIODICI 0. Utilizzo di euristiche (di I e II grado) e limiti di backtracking (numero massimo di nodi) per migliorare il tempo di restituzione di una soluzione.4 5 6 7 8 9 10 11 12 13 14 15 16 t 1.10 t=0 a∗ i ci d∗ i t=4 a∗ i ci d∗ i t=6 a∗ i ci d∗ i j1 2 2 12 j1 2 2 11 j1 2 2 8 j2 1 2 3 j2 1 2 3 j2 1 2 3 j3 0 3 7 j3 0 3 7 j3 0 3 7 j4 3 1 8 j4 3 1 8 j4 3 1 8 j5 6 2 11 j5 6 2 11 j5 6 2 11 j6 4 1 12 j6 4 1 12 j5 j1 CAPITOLO 1. L’istante temporale del nodo di arrivo deve essere minore di di − ci .4. .6 j6 4 1 9 j6 1 2 3 4 0. problema N P –completo.6 6 0.6 0. non applicabile nella realtà. costruzione di un albero di enumerazione. j1 ai ci di 1 2 6 j2 2 2 4 j2 1 2 3 4 5 6 t j2 1 2 3 4 5 6 t j1 j1 Figura 1.4 SPRING (No preemption) Senza preemption con EDF non si ha garanzia di trovare la soluzione anche se essa esiste. per tutti i processi non ancora schedulati.6 6 4 0 j2 j3 j4 0.

h′ 1 =8 .. h′ 1 =8 . h′ 2 =4 h3 = 3. h′ 3 =5 h4 = 0. h′ 5 =7 t=3 h1 = 2. h′ 4 = 11 h5 = 0. 11 0 j1 8 j2 2 j1 8 j3 4 j1 ai ci di 5 3 8 j2 0 2 4 j3 3 1 5 j4 0 3 11 j5 1 1 7 j1 8 j4 11 j1 8 j4 7 j5 5 Esercizio 1. h3 = 0. h′ 3 =5 h4 = 0.8 Schedulare i seguenti processi.. . h′ 1 =8 h2 = 0.. h′ 4 = 11 h5 = 1. h′ 3 =5 h4 = 0. h′ 5 =7 t=2 h1 = 3.9 Schedulare i seguenti processi utilizzando le seguenti euristiche: • hi = max{ai − t. h′ 4 = 11 ... 0} • h′ i = di .4.1. h3 = 1.. 0 j2 2 j1 ai ci di 5 3 8 j2 0 2 4 j3 3 1 5 j4 0 3 11 j5 1 1 7 j4 7 j1 8 j4 11 j5 3 j3 4 t=0 h1 = 5. SPRING (NO PREEMPTION) Esercizio 1.

.. . h4 = 0. CAPITOLO 1.8.... h4 = 0.. . ... . h′ 1 =8 ... La ricerca nel presente esercizio è computazionalmente più efficiente di quella dell’Esercizio 1. PROCESSI APERIODICI t=8 .. h′ 4 = 11 ...12 t=4 h1 = 1. h′ 4 = 11 .. Nota.

.Capitolo 2 Processi periodici 2.k istanza k-esima del processo i • φi fase di un processo (primo tempo di attivazione) • Ti periodo del processo • ri.1 2.k ri.k = φi + (k − 1) · Ti k-esima attivazione • Di = di.k − ai.k deadline relativa di un processo • Ci tempo di computazione di un processo • U= i Ui = i Ci fattore di utilizzazione Ti 2.1. . .2 Grafico dei processi Ti Di φi τi 1 2 3 4 5 6 7 8 t Ci di.k+1 13 . τn } processi periodici • τi.1. .1 Modello Simboli • {τ1 .

Deadline monotonic • Response time analysis (condizione sufficiente – computazionalmente pesante) Early deadline first • U ≤ 1 il sistema è schedulabile 2.1) cj · (k −1) k Ri Tj Iik = j |Tj <Ti (2. . Rate monotonic • Lyu–Layland (condizione sufficiente) U th = n · √ n 2−1 dove n è il numero dei processi – U ≤ U th il sistema è schedulabile – U th < U ≤ 1 non ci si può esprimere sulla schedulabilità del sistema • Bini–Buttazzo (condizione sufficiente) – – i (Ui i (Ui + 1) ≤ 2 il sistema è schedulabile + 1) > 2 non ci si può esprimere sulla schedulabilità del sistema • Response time analysis (condizione necessaria e sufficiente – computazionalmente pesante) 0 Ri = Ci (2. Le priorità sono fisssate all’istante t = 0 e non possono cambiare durante la schedulazione dei processi: più piccolo è il periodo.14 CAPITOLO 2. La verificata schedulazione con Lyu–Layland implica la verificata schedulazione con Bini– Buttazzo.2) (2. Di = Ti) Rate monotonic. ∀i il sistema è schedulabile Nota.3 Risultati notevoli di schedulabilità Se U > 1 il sistema non è schedulabile indipendentemente dall’algoritmo utilizzato. PROCESSI PERIODICI 2.3) k Ri = Ci + Ii – Ri ≤ Di .2 RM (Statico. più alta la priorità.1.

RM (STATICO. Essendo U < 1 il sistema risulta schedulabile anche con EDF. U= U th 2 1 ∼ 1 1 + + + = 0. 754 3 5 13 15 √ 4 =4· 2−1 ∼ = 0. 7568 U < U th ⇒ schedulabile con RM Nota.1 Schedulare i seguenti processi. DI = TI ) Esercizio 2. . 15 τ1 φi Ci Ti 0 2 15 τ2 1 2 3 τ2 τ1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 t Esercizio 2. τ1 φi Ci Ti 2 1 3 τ2 0 1 5 τ3 2 2 13 τ4 0 1 15 Lyu–Layland test.2.2.2 Dire se il seguente sistema è schedulabile con RM.

τ4 . 36 i (Ui + 1) > 2 ⇒ non ho garanzia di schedulabilità RTA test. τ1 φi Ci Ti 0 2 6 τ2 1 2 10 τ3 2 1 4 τ4 3 2 11 Lyu–Layland test. τ2 .16 CAPITOLO 2. PROCESSI PERIODICI τ1 τ2 τ3 τ4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 t Esercizio 2. 757 U > U th ⇒ non ho garanzia di schedulabilità Bini–Buttazzo test.3 Dire se il seguente sistema è schedulabile con RM. Ordino in modo crescente i processi per Ti : τ3 . τ1 . 0 R3 = C3 = 1 0 I3 =0 1 0 0 R3 = C3 + I3 = 1 = R3 R3 < D3 = T3 ⇒ τ3 è schedulabile . 965 6 10 4 11 √ 4 =4· 2−1 ∼ = 0. (Ui + 1) = i 2 +1 · 6 2 +1 · 10 1 +1 · 4 2 +1 11 ∼ = 2. U= U th 2 2 1 2 ∼ + + + = 0.

DI = TI ) 0 R1 = C1 = 2 0 I1 = C3 · 0 R1 T3 17 =1· 2 =1 4 3 =1 4 1 0 0 R1 = C1 + I1 = 2 + 1 = 3 = R1 1 I1 = C3 · 1 R1 T3 =1· 2 1 1 R1 = C1 + I1 = 2 + 1 = 3 = R1 < D1 = T1 ⇒ τ1 è schedulabile 0 R2 = C2 = 2 0 I2 = C1 · 0 0 R2 R2 + C3 · T1 T3 =2· 2 2 +1· =3 6 4 5 5 +1· =4 6 4 6 6 +1· =4 6 4 1 0 0 R2 = C2 + I2 = 2 + 3 = 5 = R2 1 I2 = C1 · 1 1 R2 R2 + C3 · T1 T3 =2· 2 1 1 R2 = C2 + I2 = 2 + 4 = 6 = R2 2 I2 = C1 · 2 2 R2 R2 + C3 · T1 T3 =2· 3 2 2 R2 = C2 + I2 = 2 + 4 = 6 = R2 < D2 = T2 ⇒ τ2 è schedulabile 0 R4 = C4 = 2 0 I4 = C2 · 0 0 0 R4 R4 R4 + C1 · + C3 · T2 T1 T3 =2· 2 2 2 +2· +1· =5 10 6 4 7 7 7 +2· +1· =8 10 6 4 10 10 10 +2· +1· =9 10 6 4 11 11 11 +2· +1· = 11 10 6 4 1 0 0 R4 = C4 + I4 = 2 + 5 = 7 = R4 1 I4 = C2 · 1 1 1 R4 R4 R4 + C1 · + C3 · T2 T1 T3 =2· 2 1 1 R4 = C4 + I4 = 2 + 8 = 10 = R4 2 I4 = C2 · 2 2 2 R4 R4 R4 + C1 · + C3 · T2 T1 T3 =2· 3 2 2 R4 = C4 + I4 = 2 + 9 = 11 = R4 3 I4 = C2 · 3 3 3 R4 R4 R4 + C1 · + C3 · T2 T1 T3 =2· 4 3 4 R4 = C4 + I4 = 2 + 11 = 13 = R4 R4 > D4 = T4 ⇒ τ4 non è schedulabile .2. RM (STATICO.2.

PROCESSI PERIODICI τ4 0 ? 20 1. U th = 4 · Hp : C4 = 1 U= √ 4 2−1 ∼ = 0. 2. . sia massimo ma schedulabile con Lyu–Layland. Bini–Buttazzo test. 968 i (Ui + 1) > 2 ⇒ τ4 è schedulabile (Ui + 1) = 1 +1 · 4 1 +1 · 4 1 +1 · 5 2 +1 20 ∼ = 2. 75 5 20 τ4 è schedulabile 1 2 + + = 0. 3. Lyu–Layland test.4 Trovare valore di C4 tale che: 1. 757 + Hp : C4 = 2 2 3 + 8 12 U < U th ⇒ 3 2 U= + 8 12 U > U th ⇒ 1 1 + = 0.18 Esercizio 2. 2. 0625 Hp : C4 = 2 i i (Ui + 1) > 2 ⇒ non ho garanzia di schedulabilità C4 = 1. sia massimo ma schedulabile in sezione critica. 8 5 20 non ho garanzia di schedulabilità C4 = 1. Hp : C4 = 1 i (Ui + 1) = 1 +1 · 4 1 +1 · 4 1 +1 · 5 1 +1 20 ∼ = 1. τ1 φi Ci Ti 0 2 8 τ2 0 3 12 τ3 0 1 5 CAPITOLO 2. sia massimo ma schedulabile con Bini–Buttazzo.

DI < TI ) 3.5 Dire se il seguente sistema è schedulabile. 2. Le priorità sono fisssate all’istante t = 0 e non possono cambiare durante la schedulazione dei processi: più piccola è la deadline. DM (STATICO. C4 = 4. Nel caso C4 = 4 cosa ci direbbero i test Lyu–Layland e Bini–Buttazzo? Lyu–Layland U= 2 3 1 4 + + + = 0. Esercizio 2. 19 τ3 τ1 τ2 τ4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Nota. Di < Ti) Deadline monotonic. Sezione critica test. τ1 φi Ci Ti Di 0 2 6 3 τ2 3 2 6 3 . più alta la priorità.3.3 DM (Statico. 9 8 12 5 20 U > U th ⇒ non ho garanzia di schedulabilità Bini–Buttazzo (Ui + 1) = i 1 +1 · 4 1 +1 · 4 1 +1 · 5 4 +1 20 =3 i (Ui + 1) > 2 ⇒ non ho garanzia di schedulabilità Nota.2. Con EDF sarebbe schedulabile? Essendo U < 1 la risposta è affermativa.

2: DM Nota. Esercizio 2.20 CAPITOLO 2. 2. Di = Ti) Early deadline first. τ1 φi Ci Ti 0 2 8 τ2 0 3 12 τ3 0 1 5 τ4 0 5 20 3 1 5 2 + + + = 0.4 EDF (Dinamico. 95 8 12 5 20 U < 1 ⇒ il sistema è schedulabile U= .6 Schedulare i seguenti processi.1: Sezione critica Figura 2. Le priorità cambiano dinamicamente al variare degli istanti di tempo: deadline più stringente. PROCESSI PERIODICI 0 R2 = C2 = 2 0 I2 =0 1 0 0 R2 = C2 + I2 = 1 = R2 R2 < D2 ⇒ τ2 è schedulabile 0 R1 = C1 = 2 0 = C2 · I1 0 R1 T2 =2· 2 =2 6 1 0 R1 = C1 + I1 = 2 + 2 = 4 > D1 ⇒ τ1 non è schedulabile τ1 τ1 τ2 1 2 3 4 5 6 t τ2 1 2 3 4 5 6 t Figura 2. L’esercizio è una dimostrazione che RTA è una condizione sufficiente e non necessaria per la schedulabilità di un sistema con DM. priorità più alta.

.4. DI = TI ) 21 τ3 τ1 τ2 τ4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Nota. Nell’Esercizio 2. EDF (DINAMICO. con C4 = 5 il sistema risulta schedulabile utilizzando EDF.4 il sistema risultava schedulabile con algoritmo RM e al più C4 = 4 (analisi RTA).2. ma non con RM.

2.1 Modello Simboli • ri = fi − ai tempo di risposta del processo • Ci (t): tempo di computazione rimanente al processo i all’istante t • Up fattore di utilizzazione dei processi periodici (definito in modo analogo ad U del Cap. 2) 22 .2 3.Capitolo 3 Processi misti 3.1 Scenario Aperiodico Hard Real Time Aperiodico Soft Real Time EDF No server Server BACKGROUND SCHEDULING Statico Dinamico RM + EDF + DEFERRABLE TOTAL SERVER BANDWIDTH SERVER 3.

1 Schedulare i seguenti processi. τ1 φi Ci Ti 1 2 4 τ2 0 2 8 τ3 2 1 16 τ4 0 1 32 j1 ai ci di 3 2 8 j2 5 2 17 j3 7 2 22 1 1 2 2 + + + = 0. .3.4 RM + DS Deferrable server. in questi casi hanno precedenza i processi aperiodici. Laddove non diversamente specificato manda in esecuzione i processi aperiodici con politica FIFO.3. 3.2. 84375 4 8 16 32 Up < 1 ⇒ l’insieme dei processi periodici è schedulabile Up = Nota.3 Aperiodici Hard Real Time Esercizio 3. All’istante t = 3 è possibile mandare in esecuzione sia τ2 che j1 ed all’istante t = 13 sia τ1 che j2 .2 Risultati notevoli di schedulabilità Se Up + Us > 1 il sistema non è schedulabile indipendentemente dall’algoritmo utilizzato. APERIODICI HARD REAL TIME • Us fattore di utilizzazione del processo server τs 23 3. Deferrable server n U th = n · • Up ≤ U th ⇔ Up ≤ n · Us + 2 −1 2 · Us + 1 Us + 2 −1 2 · Us + 1 dove n è il numero dei processi n il sistema è schedulabile 3.

PROCESSI MISTI τ1 τ2 τ3 τ4 j1 j2 j3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 t Esercizio 3.2 Schedulare i seguenti processi. 13 15 2 Us = = 0.24 CAPITOLO 3. 6 3  Up < U th ⇒ schedulabile con RM 0. τ1 φi Ci Ti 0 2 15 τs 1 2 3 ai ci j1 1 1 j2 0 2 j3 2 2 j4 4 2 j5 11 3 j6 9 3 j7 6 3 Up = U th = 1 ·  1 2 = 0. 6 + 2 − 1 ∼ = 0. 6 + 1  . 143 2 · 0.

3 Calcolare la capacità massima del DS affinché il sistema sia schedulabile.3. 39 ≤ 2 · 2 −1 2 · Us + 1 Up = Us = ⇔ Us ≤ 0. τ1 φi Ci Ti 0 1 6 τ2 0 2 9 τs 0 ? 4 ai ci j1 1 1 j2 8 1 j3 3 3 j4 11 2 1 2∼ + = 0. 308⌋ = 1 4 . Mostrare la schedulazione.4. 308 Cs ⇔ Cs = ⌊4 · Us ⌋ = ⌊4 · 0. 39 6 9 Us + 2 0. RM + DS 25 τ1 τs j1 j2 j3 j4 j5 j6 j7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 t Esercizio 3.

ck Us dk = max{ak .4 Schedulare i seguenti processi. τ1 φi Ci Ti 0 1 4 τ2 0 1 5 τ3 0 2 11 j1 ai ci 1 3 j2 4 2 . I processi aperiodici sono ordinati in base all’istante di attivazione. PROCESSI MISTI τ1 τ2 τs j1 j2 j3 j4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 t 3. Per la condizione necessaria e sufficiente di schedulabilità si ha che Us + Up ≤ 1.5 EDF + TBS Total bandwidth server.26 CAPITOLO 3. dk−1 } + d0 = 0 Nota. conseguentemente al più Us = 1 − Up . Esercizio 3. È necessario introdurre delle soft deadline per i processi aperiodici che consentano la schedulazione con EDF.

dk ) + If (ak . 63 = 0. ds k) = next_ri (ak ) = ds k − next_ri (ak ) − 1 · Ci Ti ak + 1 · Ti Ti . ds k ) = Ia (ak . 10} + = 10 + 6 = 16 0. 37 2 d2 = max{4. 37 ✜  ✜✁ ✜✂ ❥  ❥✁ ✶ ✷ ✸ ✹ ✺ ✻ ✼ ✽ ✾ ✶✵ ✶✶ ✶✷ ✶✸ ✶✹ ✶✺ ✶✻ ✶✼ ✶✽ ✶✾ ✷✵ t 3. 0 d0 k = max{ak . 0} + 3 = 1 + 9 = 10 0.6 EDF + TBS∗ È possibile migliorare le soft deadline per rendere la schedulazione computazionalmente più efficiente attraverso stime iterative degli istanti di fine dei processi. 37 d1 = max{1.6. dk ) Ia (ak . 63 4 5 11 Us = 1 − 0. ds k) = i|τi attivo e di <ds k Ci (ak ) max 0. ds ) f k k +1 ˜s ds =f k k dove s s Ip (ak . EDF + TBS∗ 27 Up = 1 1 2 ∼ + + = 0. dk −1 } + ck Us d0 0 =0 ˜s = ak + ck + Ip (ak . i If (ak .3.

ds k ): interferenza causata da istanze periodiche attivate prima di ak con deadline minore di ds k • If (ak .28 Significato. ds k ): interferenza causata da istanze periodiche che si attiveranno dopo ak con deadline minore di ds k • Ci (ak ): tempo di computazione rimanente al processo i all’istante t = ak • ds k − next_ri (ak ) : numero di volte che il processo i si riattiva dopo ak (è minore di 0 se Ti si attiva dopo ds k) ak + 1 : istante della prima riattivazione del processo i dopo ak (sul libro questa formula Ti non è corretta. dk ) • Ia (ak . ds k ): interferenza (stimata) su jk da parte di processi periodici in [ak . CAPITOLO 3. PROCESSI MISTI s • Ip (ak . manca il termine “ +1” al numeratore) • .

−1 ·2 =1+0+0+0 =1 11 16 ˜2 = a1 + c1 + Ia (0.5 Schedulare i seguenti processi. 757 4 5 11 16 Us = 1 − 0. 0} + 3 = 0 + 13 = 13 0. − 1 · 1+ 4 5 10 − 11 10 − 16 + max 0. 243 d0 1 = max{0. 13) = 1 + 1 + 2 = 4 If (0.6. − 1 · 1+ 4 5 6 − 11 6 − 16 + max 0. 6−5 6−4 − 1 · 1 + max 0. 243 0+1 ·5=5 5 0+1 next_r4 (0) = · 16 = 16 16 0+1 ·4=4 4 0+1 · 11 = 11 next_r3 (0) = 11 next_r1 (0) = next_r2 (0) = ˜0 = a1 + c1 + Ia (0. 6) = 1 + 1 = 2 If (0. − 1 · 2 + max 0. 13 − 4 13 − 5 − 1 · 1 + max 0. 757 = 0.3. 10) + If (0. EDF + TBS∗ Esercizio 3. 10) = max 0. − 1 · 2 + max 0. 6) = 0 + 3 + 2 + 0 = 5 = d3 = d2 f 1 1 1 Ia (0. 29 τ1 φi Ci Ti 0 1 4 τ2 0 1 5 τ3 0 2 11 τ4 0 2 16 j1 ai ci 0 3 Up = 2 2 ∼ 1 1 + + + = 0. −1 ·2 =0+0+0+0=0 11 16 . 13) = 0 + 3 + 4 + 3 = 10 = d1 = d0 f 1 1 1 Ia (0. − 1 · 1+ 4 5 13 − 11 13 − 16 + max 0. 10) = 1 + 1 = 2 If (0. −1 ·2 =2+1+0+0 =3 11 16 ˜1 = a1 + c1 + Ia (0. 13) + If (0. 13) = max 0. 10) = 0 + 3 + 2 + 1 = 6 = d2 = d1 f 1 1 1 Ia (0. − 1 · 2 + max 0. 6) + If (0. 10 − 5 10 − 4 − 1 · 1 + max 0. 6) = max 0.

τ1 φi Ci Ti 0 1 6 τ2 0 2 9 ai ci j1 1 2 j2 8 1 Up = 1 2∼ + = 0. − 1 · 1+ 4 5 4 − 11 4 − 16 + max 0. Esercizio 3. − 1 · 2 + max 0.30 CAPITOLO 3. 5) + If (0. 5) = 1 If (0. Anche se d5 1 = d1 è inutile reiterare il sistema perché per la schedulabilità non potrà mai essere d1 < a1 + c1 e a1 + c1 = 3.6 Schedulare i seguenti processi. 4) + If (0. PROCESSI MISTI ˜3 = a1 + c1 + Ia (0. τ1 τ2 τ3 τ4 j1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t 4 Nota. 4−4 4−5 − 1 · 1 + max 0. 39 6 9 Us = 1 − 0. 0} + 2 =1+4=5 0. −1 ·2 =0+0+0+0=0 + max 0. 5−4 5−5 − 1 · 1 + max 0. 4) = 0 If (0. 61 . − 1 · 1+ 4 5 5 − 16 5 − 11 − 1 · 2 + max 0. 4) = max 0. −1 ·2 =0+0+0+0=0 11 16 d1 = 3. 5) = max 0. 5) = 0 + 3 + 1 + 0 = 4 = d4 = d3 f 1 1 1 Ia (0. 39 = 0. 11 16 ˜4 = a1 + c1 + Ia (0. 61 d0 1 = max{1. 4) = 0 + 3 + 0 + 0 = 3 = d5 = d4 f 1 1 1 Ia (0.

61 8+1 ·9=9 9 d0 2 = max{8.2: Valutazione processi attivi all’istante t = 8 . 10) = max 0.3. 10) = 0 non ci sono processi attivi all’istante t = 8 If (8. 10 − 12 10 − 9 − 1 · 1 + max 0. 10) = 8 + 1 + 0 + 0 = 9 = d1 = d0 f 2 2 2 Ia (8. 5) = max 0.6. 5) = 0 non ci sono processi attivi con di < ds k If (1. 10) + If (8.1: Valutazione processi attivi all’istante t = 1 1 = 8 + 2 = 10 0. −1 ·2=0+0=0 6 9 τ1 τ2 j1 j2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Figura 3. 3} + 8+1 · 6 = 12 6 next_r1 (8) = next_r2 (8) = ˜0 = a2 + c2 + Ia (8. 5) = 1 + 2 + 0 + 0 = 3 = d1 = d0 f 1 1 1 Ia (1. 5−6 5−9 − 1 · 1 + max 0. EDF + TBS∗ next_r1 (1) = 1+1 ·6=6 6 next_r2 (1) = 1+1 ·9=9 9 31 ˜0 = a1 + c1 + Ia (1. 5) + If (1. −1 ·2=0+0=0 6 9 τ1 τ2 j1 j2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Figura 3.

9) + If (1.32 CAPITOLO 3. 5−3 5−5 − 1 · 2 + max 0.7 Schedulare i seguenti processi. 9−3 9−5 − 1 · 2 + max 0. 27 d0 1 = max{1. 5) + If (1. 6) = 2 è attivo solo τ1 all’istante t = 1 If (1. 9) = 1 + 2 + 2 + 1 = 6 = d1 = d0 f 1 1 1 Ia (1. 27 next_r2 (1) = 1+1 ·3=3 3 next_r1 (1) = 1+1 ·5=5 5 ˜0 = a1 + c1 + Ia (1. τ1 φi Ci Ti 0 2 5 τ2 0 1 3 ai ci j1 1 2 j2 5 3 Up = 2 1∼ + = 0. 5) = 1 + 2 + 0 + 0 = 3 = d3 = d2 f 1 1 1 Ia (1. 0} + 2 =1+8=9 0. −1 ·1=0+0=0 5 3 . 5) = max 0. 6) = 1 + 2 + 2 + 0 = 5 = d2 = d1 f 1 1 1 Ia (1. 6) = max 0. 5) = 0 non ci sono processi attivi all’istante t = 1 If (1. PROCESSI MISTI τ1 τ2 j1 j2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Esercizio 3. −1 ·1=0+1=1 5 3 ˜1 = a1 + c1 + Ia (1. 73 5 3 Us = 1 − 0. −1 ·1=0+0=0 5 3 ˜2 = a1 + c1 + Ia (1. 6−5 6−3 − 1 · 2 + max 0. 9) = 2 è attivo solo τ1 all’istante t = 1 If (1. 6) + If (1. 9) = max 0. 73 = 0.

17) = 5 + 3 + 3 + 5 = 16 = d3 = d2 f 2 2 2 Ia (5. 19) = max 0. 21) + If (5. 21) = 3 entrambi i processi sono attivi all’istante t = 5 If (5. 17) = 3 entrambi i processi sono attivi all’istante t = 5 If (5. 17 − 10 17 − 6 − 1 · 2 + max 0. 19) + If (5. 16) = 3 entrambi i processi sono attivi all’istante t = 5 If (5. 17) + If (5. 16 − 10 16 − 6 − 1 · 2 + max 0.3: Valutazione processi attivi all’istante t = 1 . 9} + 5+1 · 5 = 10 5 3 = 9 + 12 = 21 0. 17) = max 0. 17) = 5 + 3 + 3 + 5 = 16 = d4 = d3 f 2 2 2 Ia (5. 21 − 10 21 − 6 − 1 · 2 + max 0. 21) = max 0. −1 ·1=2+3=5 5 3 τ1 τ2 j1 j2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Figura 3. 16) = max 0. −1 ·1=2+4=6 5 3 ˜2 = a2 + c2 + Ia (5. 27 5+1 ·3=6 3 33 next_r1 (5) = next_r2 (5) = ˜0 = a2 + c2 + Ia (5. EDF + TBS∗ d0 2 = max{5.6. 17) + If (5.3. 21) = 5 + 3 + 3 + 8 = 19 = d1 = d0 f 2 2 2 Ia (5. 19 − 10 19 − 6 − 1 · 2 + max 0. 19) = 5 + 3 + 3 + 6 = 17 = d2 = d1 f 2 2 2 Ia (5. 19) = 3 entrambi i processi sono attivi all’istante t = 5 If (5. −1 ·1=4+4=8 5 3 ˜1 = a2 + c2 + Ia (5. −1 ·1=2+3=5 5 3 ˜3 = a2 + c2 + Ia (5.

PROCESSI MISTI τ1 τ2 j1 j2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t Figura 3.4: Valutazione processi attivi all’istante t = 5 τ1 τ2 j1 j2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 t .34 CAPITOLO 3.

1: Firm Figura 4.2: Critico Figura 4.1.3: SRT Figura 4.4: Non RT 35 .1 Modello Simboli • λ frequenza media di arrivo delle richieste • c carico medio della richiesta • ρ = λ · c carico • Vi (fi ) valore del processo • tipi di processo: Vi (fi ) Vi (fi ) Vi (fi ) Vi (fi ) di t di −∞ t di t t Figura 4.1 4.Capitolo 4 Gestione dell’overload 4.

= >1 3 5 4 5 ρ(3) = max = max ρ(6) = max = max ⇒ no overload ⇒ overload . j1 ai ci di 6 2 9 j2 3 3 11 j3 1 6 10 j1 j2 j3 1 2 3 4 5 6 7 8 9 10 11 12 t ρ(1) = max = 6 <1 9 c3 (1) d3 − 1 ⇒ no overload c2 (3) + c3 (3) c3 (3) . ρ(t) = max i|di ≤dk ci (t) k |jk attivo dk − t se ρ(t) > 1 siamo in presenza di overload.36 CAPITOLO 4.1 Calcolare il fattore di load negli istanti t = 1. d1 − 6 d2 − 6 d3 − 6 2 6 3 6 . Esercizio 4. t = 3 e t = 6.2 Workload Fattore di load da calcolare negli istanti t di attivazione dei processi presenti nel sistema. . GESTIONE DELL’OVERLOAD 4. d2 − 3 d3 − 3 7 4 7 . = <1 8 7 8 c1 (6) c1 (6) + c2 (6) + c3 (6) c1 (6) + c3 (6) . .

WORKLOAD Esercizio 4.2 Calcolare il fattore di load negli istanti t = 1. t = 4 e t = 7. . =1 3 4 ρ(2) = max Esercizio 4. = <1 2 5 5 2 4 ρ(3) = max 0.4.3 Calcolare il fattore di load negli istanti t = 1. t = 2 e t = 3. j1 j1 ai ci di 1 4 6 j2 4 2 7 j3 2 2 4 j4 7 3 11 j4 1 2 3 4 5 6 7 8 9 10 11 12 t j2 j3 ρ(1) = 4 <1 5 5 2 . 37 j1 ai ci di 1 2 4 j2 3 2 6 j3 2 2 7 j1 j2 j3 1 2 3 4 5 6 7 8 9 10 t ρ(1) = 2 <1 3 ⇒ no overload ⇒ no overload ⇒ no overload 3 1 3 . t = 2. 4 2 = 5 >1 4 ⇒ no overload ⇒ overload ρ(2) = max .2.

3 DOVER i Vi . cioè φDOVER = 0.38 CAPITOLO 4. sia max φA ΓA ≥ φA Γ∗ DOVER è un algoritmo on–line ottimo in situazioni di overload. DOVER . Due set di task • privileged : ogni volta che viene fatta preemption su un task questo diventa privilegiato • waiting : ogni volta che un task è schedulato a causa di un LST tutti i task ready diventano waiting All’istante t = LSTz se z non è il processo che EDF schedulerebbe • EDF → jcurr • LST → jz si verifica la seguente condizione Vz > (1 + √ k ) · (Vcurr + Vpriv ) • se è soddisfatta eseguo z . cioè il suo tempo rimanente di computazione è uguale al tempo rimanente fino alla sua deadline. Come EDF tranne quando un professo jz reggiunge LSTz (last start time). metto curr tra i pronti – se non ho ancora terminato z e t = LSTx verifico la seguente condizione Vx > (1 + ∗ se è verificata scarto z ∗ se non è verificata scarto x • se non è verificata scarto z dove k= V V V = max Vi ci V = min Vi ci √ k ) · Vz i|i è attivo a t i|i è attivo a t . Massimizza ΓA = Dato Γ∗ (valore ottimo della schedulazione qualora l’algoritmo fosse chiaroveggente). GESTIONE DELL’OVERLOAD 4. 25.

<1 = 14 13 14 6 3 6 . . ma non è stato necessario verificare nessuna condizione in quanto 1.3. = >1 9 2 4 5 4 curr = j2 1 1 17 1 . Nota. . =1 10 5 7 6 10 2 6 7 . 3 2 5 3 V = 17 5 priv = {j5 } V = min ⇒ no overload ⇒ no overload ⇒ no overload ⇒ no overload ⇒ overload jz = j3 1 1 17 1 . . <1 = 12 9 12 9 5 6 . non c’era overload 2. j1 j1 ai ci di Vi 1 3 15 1 j2 6 2 8 1 j3 5 5 10 17 j4 0 3 14 1 j5 3 3 12 1 j2 j3 j4 j5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 t ρ(0) = 3 <1 14 5 5 2 . 3 2 5 3 V = 1 3 ρ(1) = max ρ(3) = max ρ(5) = max ρ(6) = max t=6 V = max 3 · 17 5 k= 17 > 1+ 3 · 17 5 · (1 + 1) ∼ = 8. 39 ⇒ verificato A t = 6 viene eseguito j3 e scartato j2 (in quanto era anche quest’ultimo in LST). DOVER Esercizio 4. . All’istante t = 5 il processo j3 era in LST. .4. il processo j3 era quello che EDF avrebbe mandato in esecuzione . . .4 39 Calcolare il fattore di load negli istanti notevoli e riportare la schedulazione dei seguenti processi.

j1 j1 ai ci di Vi 0 2 3 3 j2 2 3 10 1 j3 4 3 8 2 j4 6 3 9 15 j5 8 2 10 7 j2 j3 j4 j5 1 2 3 4 5 6 7 8 9 10 t ρ(0) = 2 <1 3 3 ρ(2) = < 1 8 ρ(4) = max 3 4 3 .40 Esercizio 4. 3 3 3 15 3 priv = {j2 } ⇒ no overload ⇒ no overload ⇒ no overload ⇒ overload ρ(6) = max t=6 jz = j4 1 2 15 .5 CAPITOLO 4. . =2>1 4 2 3 curr = j3 1 2 15 . 6 ⇒ verificato A t = 6 viene eseguito j4 e j3 è inserito tra i processi pronti. = <1 6 4 4 5 1 4 . . 3 3 3 1 3 V = max V = min k= 3 · 15 = 15 3 15 > 1 + √ V = V = 15 · (2 + 1) ∼ = 14. . GESTIONE DELL’OVERLOAD Calcolare il fattore di load negli istanti notevoli e riportare la schedulazione dei seguenti processi. 3 3 3 15 3 curr = j4 jx = j3 1 2 15 . . t=7 1 2 15 . 3 3 3 1 3 V = max V = min k= 3 · 15 = 15 3 V = V = . .

3. 3 3 2 1 3 t=8 1 15 7 . . DOVER 2> 1+ √ 15 · 15 ∼ = 73 ⇒ non verificato 41 A t = 7 viene eseguito j4 e j3 è scartato. 2 1 2 =2>1 ⇒ overload jx = j5 1 15 7 .4. . . 3 3 2 curr = j4 V = max V = min k= 3 · 15 = 15 3 7> 1+ √ V = 15 3 V = 15 · 15 ∼ = 73 ⇒ non verificato A t = 8 viene eseguito j4 e j5 è scartato. . ρ(8) = max 4 1 4 .

Parte II Linguaggio C 42 .

che vanno inclusi a seconda delle funzioni e strutture che si intende usare.h. Assegnazione indirizzo 3.h. In tipo. Connessione/Attesa di una connessione 4.h. Se il valore del descrittore è pari a “ −1”. viene indicato il tipo di comunicazione. come dice lo stesso nome del parametro. Quest’ultimo può essere usato anche con le funzioni relative ai file. netdb.h. in pratica. (la variabile errno contiene il codice d’errore appropriato). int tipo. Stabilire una connessione fra due socket. In <sys/socket. unistd. allora la creazione del socket non è andata a buon fine Il parametro dominio indica la famiglia di protocolli da usare. sys/types. sys/time. In C vi sono diverse funzioni e strutture apposite per la creazione e l’uso dei socket. Chiusura socket int socket (int dominio. Creazione del socket 2. l’equivalente dell’indirizzo di rete di un processo. La tipica modalità di utilizzo dei socket è la seguente: 1.Capitolo 5 Comunicazione di rete Un socket è. Le si possono trovare negli header sys/socket. cioè in che modo debbano essere scambiati i dati. Tre delle possibili famiglie sono AF_UNIX (protocolli interni di Unix). netinet/in. Può assumere diversi valori fra cui SOCK_STREAM (connessione permanente e bidirezionale basata su un flusso di byte: i dati vengono mantenuti in 43 . int protocollo) Crea un socket e ne restituisce un descrittore.h> sono definiti anche gli altri.h. Scambio dati 5. e quindi dare inizio ad una sessione. Tutti gli esempi riguardano i protocolli usati da internet (AF_INET). significa mettere in condizione di comunicare due processi “affacciati” sulla rete.h. AF_ISO (protocolli ISO) e AF_INET (protocolli usati da internet).

allora il thread continuerà con la propria esecuzione. non affidabile al 100% perché la connessione non è continua e quindi i pacchetti stessi possono essere duplicati e/o non arrivare in ordine). Sia la struttura che i valori che può assumere sa_family. Con un socket bloccante.h. AF_FILE. si avrà la struttura sockaddr_in. 0. F_SETFL. a seguito di una chiamata alla funzione di attesa per una connessione. il ciclo non continuerà e si bloccherà fino all’arrivo di una richiesta di connessione. Questo valore va conservato perché serve per ogni riferimento al socket creato. senza bloccarsi. un protocollo ben preciso. COMUNICAZIONE DI RETE ordine e non sono persi o duplicati) e SOCK_DGRAM (scambio di datagram. il protocollo. fino all’arrivo di una richiesta di connessione.h. Il modo di rendere un socket non bloccante è il seguente (si assume che il descrittore del socket sia nella variabile intera con nome sock): eventuale_errore = fcntl (sock. Vediamo come è fatta la struttura sockaddr: struct sockaddr { unsigned short int sa_family. ovvero pacchetti di byte di lunghezza massima fissata. Nel caso di AF_INET. non è presente alcuna richiesta di connessione. invece. Il socket creato è bloccante per default. incluso in sys/socket. Se al momento della verifica. indica il particolare protocollo da usare con il socket. Il contenuto del campo sa_data dipende dalla particolare famiglia di indirizzi usata. int lunghezza_record_indirizzo) bind assegna un indirizzo al socket. Per utilizzare. è il descrittore del socket. Per capire meglio il significato. // Dati dell’indirizzo. come già detto. char sa_data[14]. In caso di errore viene restituito il valore “ −1” (la variabile errno conterrà il codice d’errore appropriato). NONBLOCK). invece. non si ha una attesa indefinita.h (che quindi andrà . Il valore restituito. // Famiglia degli indirizzi. cioè il protocollo usato è quello di default per la combinazione di dominio e tipo specificata con gli altri due parametri. definita in netinet/in. si può guardare il file /etc/protocols contenente i numeri associati ai tipi di protocolli possibili.44 CAPITOLO 5. Con un socket non bloccante. Fra le famiglie possibili ci sono AF_UNSPEC. Infine. Un socket è bloccante quando. }. int bind (int descrittore_socket. AF_INET (internet). Normalmente assume valore nullo (0). AF_UNIX. si pensi ad un ciclo while in cui all’interno vi è una attesa per una connessione. struct sockaddr∗ indirizzo. si trovano nel file bits/socket. blocca il thread in cui è stata creata.

unsigned short int sin_port. La funzione che consente questa conversione è htons. sock = socket (AF_INET. 0). int sock. Quindi bisogna convertire il numero della porta voluto e poi assegnarlo al campo sin_port. eventuale_errore = bind (sock. INADDR_LOOPBACK (loopback sull’host locale).sin_family = AF_INET. per mezzo di una conversione esplicita di formato. //Numero casuale. Per quel che riguarda la porta da usare.. int eventuale_errore.sin_port = htons (123). struct sockaddr_in { unsigned short int sin_family. }. bisogna fare attenzione al fatto che l’ordine dei bit usato in internet è diverso da quello usato normalmente dal computer... }. // Campo per adattare la dimensione di sockaddr_in a quella della struttura // sockaddr. SOCK_STREAM.45 incluso) ed equivalente. .. (struct sockaddr∗ ) &temp.sin_addr. // Indirizzi internet. sizeof (temp)).h) ci sono INADDR_ANY (vengono accettati dati da qualunque parte vengano). // Famiglia degli indirizzi. struct in_addr sin_addr. alla precedente: struct in_addr { unsigned int s_addr. La famiglia degli indirizzi è AF_INET. struct sockaddr_in temp. //Creazione del socket. Un tipico modo di usare la struttura sockaddr_in è il seguente: //. Fra gli indirizzi internet utilizzabili nel campo sin_addr (definiti in netinet/in. temp. //. temp. INADDR_BROADCAST (per mandare dati a tutti gli host). // Numero della porta (16 bit).s_addr = INADDR_ANY. unsigned char sin_zero[sizeof (struct sockaddr) sizeof (unsigned short int) sizeof (unsigned short int) sizeof (struct in_addr)]. temp.

e quello aperto cercasse di mandare dati a seguito della funzione write (o di altre funzioni). struct hostent ∗ indirizzo_host. La modalità di chiusura può assumere tre valori.sin_port = htons (321). //Porta d’ascolto sul server a cui ci si vuole connettere.. allora si sarebbe in presenza di un errore.h> //. Se vale “ 0”. int sock. int modalita_chiusura) La funzione shutdown causa la chiusura totale o solo parziale di una connessione full-duplex (bidirezionale) sul socket associato al descrittore.sin_family = AF_INET. int lunghezza_record_indirizzo) La funzione connect cerca (solo se SOCK_STREAM) di effettuare la connessione fra il socket passato come parametro con il socket in ascolto all’indirizzo specificato. Con il valore “ 1”. int eventuale_errore. struct sockaddr∗ indirizzo_server. il socket non potrà più ricevere messaggi e neanche mandarne. //. temp. il socket non potrà più spedire messaggi. Se uno venisse chiuso e l’altro no.. int shutdown (int descrittore_socket. si otterrebbe un errore. Se l’operazione non va a buon fine. Se il risultato della chiamata a close fosse “ −1”. Per spiegarne l’uso. struct sockaddr_in temp. //Nel caso di IPv4 o IPv6. in indirizzo IPv4 o un indirizzo IPv6. //Se hp contiene il puntatore nullo.. con il valore “ 2”.. Riceve in ingresso il nome dell’host che puo’ essere //un nome.inventato. indirizzo_host = gethostbyname (nome. la funzione close deve essere chiamata su entrambi i socket in comunicazione. un esempio è più efficace: #include <netdb. . //Numero casuale. COMUNICAZIONE DI RETE int close (int descrittore_socket) close consente di chiudere la comunicazione sul socket passato in descrittore_socket. temp. allora il socket indicato non potrà più ricevere dati. il campo indirizzo_host->h_addr contiene il nome stesso. allora la chiamata a gethostbyname è fallita. //gethostbyname restituisce una struttura di tipo hostent in cui mette //l’indirizzo IP. Ovviamente. il risultato della chiamata a questa funzione è “ −1”. int connect (int descrittore_socket. In fine.it ). //Tipo di indirizzo.46 CAPITOLO 5.

il comportamento di default (per default i socket sono bloccanti) prevede che il processo venga bloccato fino all’arrivo di una nuova. nel campo relativo //all’indirizzo. int dimensione_coda) Mentre il socket è in ascolto. Listen si occupa di definire la dimensione massima di questa coda (dimensione_coda). è di mettere le richieste in una coda di attesa. essere gestita con questo nuovo socket. if (h_errno == NO_RECOVERY) printf(“non recoverable name server error occurred \n”). indirizzo_host->h_length). aspettando contemporaneamente altre connessioni (e servendole se sono già nella coda). ne possono arrivare altre. if (h_errno == NO_ADDRESS) printf(“name is valid but no has IP address \n”).47 if (indirizzo_host == 0) { printf(“Gethostbyname fallito \n”). allora vi è stato un errore. if (h_errno == HOST_NOT_FOUND) printf(“host not found \n”). . Come al solito. } //Copio l’indirizzo nella struttura di tipo sockaddr_in. La funzione Listen si applica solo ai socket di tipo SOCK_STREAM o SOCK_SEQPACKET. (struct sockaddr∗ ) &temp. int accept (int descrittore_socket. allora. int listen (int descrittore_socket. anche in assenza di connessioni pendenti. crea un nuovo socket con le stesse proprietà di quello rappresentato da descrittore_socket e restituisce un nuovo descrittore. Una volta che un socket è stato creato (socket). &temp. Come sempre. In indirizzo vengono messi i dati relativi al socket che ha richiesto la connessione. se il valore restituito e’ “ −1”. Seguendo il metodo già indicato. exit(1). è possibile servire la connessione accettata. È possibile rendere il socket non bloccante per modificare il comportamento di default di accept. //Connessione del socket eventuale_errore = connect (sock. accept prende la prima connessione disponibile sulla coda delle connessioni pendenti. accept restituisce il valore “ −1” e la variabile errno ne contiene il codice. La connessione può. Se non ci sono connessioni presenti nella coda.sin_addr. Mentre viene servita una di queste richieste. bcopy (indirizzo_host->h_addr. collegato (bind) e messo in ascolto (listen). Il procedimento adottato per tenere conto di questo fatto. Mediante un fork sul processo che gestisce la connessione. si forza accept a verificare la presenza di una connessione ed a sbloccare immediatamente il processo. può ricevere delle richieste di connessione. sizeof(temp)). allora. int∗ lunghezza_record_indirizzo) Ha il compito di accettare una connessione. struct sockaddr∗ indirizzo. in caso di errore.

. Questa funzione può essere usata solamente in presenza di una connessione. In caso di insuccesso. La struttura sockaddr è descritta con la funzione bind. const void∗ buffer. Vediamo un esempio di utilizzo di getsockname. ed il socket è bloccante (vedi “Il modo di rendere un socket non bloccante”). const void∗ buffer. int dimensione_buffer. int recv (int descrittore_socket. altre due funzioni simili a recv: sono recvfrom e recvmsg. In uscita conterrà un puntatore alla dimensione di tale struttura. Cioè restituisce il record contenente. //. eventuale_errore = getsockname (sock. altrimenti lo zero. unsigned int opzioni) Serve a ricevere messaggi da un socket e può essere usato solamente in presenza di una connessione. altrimenti restituisce “ 0”. Se non è presente alcun messaggio in arrivo. int eventuale_errore. è “ −1”. int dim = sizeof (temp). Il parametro dimensione_buffer non è altro che la dimensione del buffer.. allora recv attende fino all’arrivo di un messaggio. ad esempio nel caso di sockaddr_in. altrimenti è il numero di caratteri ricevuti.. Esistono. //. (struct sockaddr∗ ) &temp. struct sockaddr_in temp.. Il parametro lunghezza_record_indirizzo deve puntare alla dimensione della struttura sockaddr. &dim). int sock. la famiglia di indirizzi. Il risultato della chiamata a questa funzione. In caso di errore. il numero della porta. la funzione send restituisce il valore “ −1”.. Il messaggio ottenuto è contenuto nella memoria puntata da buffer. Il parametro buffer contiene il messaggio e deve avere una dimensione non inferione a lunghezza_messaggio (cioè alla dimensione del messaggio da spedire). COMUNICAZIONE DI RETE int send (int descrittore_socket. comunque. int getsockname (int descrittore_socket. gli indirizzi internet con cui il socket interagisce. opzioni può essere posto a “ 0”. int lunghezza_messaggio. in caso di errore. opzioni può essere posto a “ 0”.48 CAPITOLO 5. viene restituito il valore “ −1”. int∗ lunghezza_record_indirizzo) Permette di ottenere tramite indirizzo le informazioni sull’indirizzo locale del socket.struct sockaddr∗ indirizzo. unsigned int opzioni) Con send è possibile inviare messaggi dal socket rappresentato da descrittore al socket con cui è connesso.

Questa funzione si occupa della conversione dal formato internet per numeri di tipo unsigned short int.49 //In temp ci sono le informazioni sul protocollo. Questa funzione si occupa della conversione al formato internet per numeri di tipo unsigned short int. Questa funzione si occupa della conversione dal formato internet per numeri di tipo unsigned short int. unsigned long int ntohl (unsigned long int valore) Su internet i numeri sono rappresentati con un ordine diverso di bit rispetto a quello dell’elaboratore.. unsigned short int ntohs (unsigned short int valore) Su internet i numeri sono rappresentati con un ordine diverso di bit rispetto a quello dell’elaboratore.. . unsigned short int htons (unsigned short int valore) Su internet i numeri sono rappresentati con un ordine diverso di bit rispetto a quello dell’elaboratore. unsigned long int htonl (unsigned long int valore) Su internet i numeri sono rappresentati con un ordine diverso di bit rispetto a quello dell’elaboratore. porta e indirizzi //. Questa funzione si occupa della conversione al formato internet per numeri di tipo unsigned short int.

Il processo figlio avrà una copia esatta di tutti i segmenti di memoria del processo padre. con tecniche di copy-on-write non verrà occupata memoria fisica fino al momento in cui uno dei due processi non effettuerà una scrittura. un numero maggiore di 0 nel processo padre (il valore restituito è proprio il PID del figlio) o un valore minore di 0 nel caso in cui non sia stato possibile creare un nuovo processo (ad esempio per un eccessivo numero di processi attualmente attivi).Capitolo 6 Programmazione parallela Una fork in programmazione è la modalità attraverso cui un processo crea in memoria una copia di sé stesso: la copia prenderà il nome di processo figlio. Comunque. Più in generale. una fork in un ambiente multithreading significa che un thread di esecuzione è stato duplicato. Non sono ereditati i lock sui files. Quando un processo effettua la chiamata fork() verrà creato un nuovo spazio di indirizzamento. Nei sistemi operativi UNIX e Unix-like il processo padre ed il processo figlio possono scegliere le istruzioni da eseguire tramite il valore di ritorno della chiamata di sistema fork(). Sia il processo padre che il figlio possono proseguire la loro esecuzione indipendentemente l’uno dall’altro. il PID del figlio • nel thread del figlio. 0 50 . mentre il processo originale verrà chiamato processo padre. Valore di ritorno La funzione fork() ritorna in caso di successo: • nel thread del padre. Il valore di ritorno della chiamata fork() vale 0 nel processo figlio. mentre la ricezione dei segnali provoca i comportamenti standard. pid_t fork (void) Descrizione La funzione fork() crea un processo figlio che differisce dal genitore solamente per il suo PID (Process IDentifier) e PPID (Parent Process ID).

* la variabile pid contiene il pid del processo figlio */ } //. In questa situazione la variabile errno è settata con il codice di errore appropriato.. pid = fork(). Termina l’esecuzione del processo. Valore di ritorno La funzione exit() non ritorna. 4. . tutti gli stream aperti (compresi stdin. pid_t pid. tutte le funzioni registrate con le funzioni atexit() e on_exit() sono chiamate nell’ordine inverso alla loro registrazione. //... if (pid < 0) { //gestione errore } else if (pid == 0) { //processo figlio } else { /* processo padre. viene chiamata la funzione _exit().. ritornando il valore di status al parent. Esempio #include <unistd. Quindi la funzione exit() esegue in sequenza le seguenti operazioni: 1. void exit (int status) Descrizione La funzione exit() effettua il termine normale del programma.51 Se la funzione fork() fallisce. 2. ritorna −1 e non viene generato nessun processo figlio. 3.h> //.. tutti gli stream aperti vengono scaricati tramite la funzione della libreria standard fflush(). stdout e stderr) vengono chiusi impiegando le funzioni della libreria standard..

int∗ status. • WUNTRACED specifica di ritornare anche se i child sono fermati (stop). allora la funzione ritorna immediatamente e ciascuna risorsa del child viene liberata. waitpid() torna 0 se è stato impiegato WNOHANG e non ci sono figli che hanno terminato. Il valore del pid può essere uno dei seguenti: < −1: la funzione attende ciascun child avente il process group ID uguale al valore assoluto del pid. 0: la funzione attende ciascun child avente il process group ID uguale a quello del processo corrente. le funzioni wait() e waitpid() memorizzano l’informazione dello stato nell’area di memoria puntata da questo argomento. e lo stato non deve venire riportato. Valore di ritorno In caso di successo le funzioni wait() e waitpid() ritornano il process ID del child che termina.52 CAPITOLO 6. . > 0: la funzione attende il child avente il process ID corrispondente al valore del pid. Se il processo corrente esegue la funzione di waitpid() e il child identificato dal pid è in stato di zombie. allora la funzione ritorna immediatamente e ciascuna risorsa del child viene liberata. mentre ci sono uno o più child in stato di zombie. Quando un child termina il processo. Il paramentro options può valere zero o può essere in OR con i seguenti valori costanti: • WNOHANG specifica il ritorno immediato se i child non sono usciti. int options) Descrizione La funzione wait() sospende il processo corrente finché un figlio (child) termina o finché il processo corrente riceve un segnale di terminazione o un segnale che sia gestito da una funzione. PROGRAMMAZIONE PARALLELA pid_t wait (int∗ status) pid_t waitpid (pid_t pid. allora il child assume lo stato di “zombie” ossia di processo “defunto”. −1: la funzione attende ciascun child analogamente alla funzione wait(). Se status non è NULL. Tornano −1 in caso di errore e errno viene settato in modo appropriato. Se il processo corrente esegue la funzione di wait(). senza che il parent abbia atteso la sua terminazione attraverso la funzione di wait(). La funzione waitpid() sospende il processo corrente finché il figlio (child) corrispondente al pid passato in argomento termina o finché il processo corrente riceve un segnale di terminazione o un segnale che sia gestito da una funzione.

p In questo caso.. const char∗ arg. execvl(). const char∗ arg. execvp() se hanno successo non effettuano ritorno al chiamante. Le funzioni con il nome non comprendenti la lettera e. Ogni stringa di ambiente è del formato parametro = valore (p. execvl().. L’array envp[] è terminato da un elemento a NULL. pathname viene ricercato in base alla variabile di ambiente PATH. pathname è un programma eseguibile (binario) o uno script che dovrà sostituire il processo corrente. fanno ereditare l’ambiente del processo attuale il quale è contenuto nella variabile esterna environ. Se la variabile PATH non è specificata. Il primo elemento (argv[0]) deve contenere il nome del programma da invocare.e. char∗ const argv[]) Descrizione Le funzioni execl().) int execle (const char∗ pathname. . execlp(). pathname viene per default ricercato nelle directory /bin e /usr/bin. Nel nome della funzione chiamata sono contenuti dei caratteri che indicano sia il tipo di argomenti accettati e sia il tipo di comportamento dalla funzione stessa. execvp() sostituiscono il processo corrente con un nuovo processo..53 int execl (const char∗ pathname. All’ultimo argomento valido deve seguire un puntatore a NULL. In caso contrario il valore −1 viene tornato e la variabile errno viene settata con il valore appropriato. Il primo argomento è convenzionalmente il nome del programma che verrà eseguito.. .. v La funzione accetta un vettore di argomenti.. e La funzione accetta fra i suoi parametri un array di stringhe dell’ambiente (environment) che deve essere passato al pathname da eseguire. TERM = vt100). char∗ const envp[]) int execv (const char∗ pathname. execle(). char∗ const argv[]) int execvp (const char∗ pathname. L’ultimo argomento valido deve essere seguito da un elemento contenente un puntatore a NULL. l La funzione accetta una lista di argomenti. execlp().. al programma individuato da pathname. . const char∗ arg. In realtà le funzioni sono una interfaccia per la funzione execve() a cui si rimanda per ulteriori approfondimenti.) int execlp (const char∗ pathname. Valore di ritorno Le funzioni execl(). . se il pathname non contiene il carattere slash /. execle().

Parte III Statecharts 54 .

1 Linguaggio Statecharts è un linguaggio semiformale di modellazione.1 Simboli • Stato N ome_stato – Stati concorrenti Stato_1 Stato_2 Posso trovarmi contemporaneamente in Stato_1 e Stato_2 – Transizione tra stati Stato_1 Clausola Stato_2 La clausa è una formula logica con operatori ¬. ∨. 7. dove lo Stato deve essere concorrente rispetto alla posizione di Clausola 55 .1.Capitolo 7 Statecharts 7. ∧ e con letterali di due tipi: ∗ Evento ∗ Condizione sugli stati: In(Stato ).

il piano desiderato incrementando questo di 1.56 – Gerarchia di stati Stato_padre Stato_f iglio_1 Stato_f iglio_2 CAPITOLO 7. si può trovare in uno dei quattro piani (considerare il tempo di transizione da un piano a un altro trascurabile dal punto di vista della specifica e non specificare lo stato della porta durante il movimento. L’ascensore può essere fermo oppure in movimento.1 (9 punti) Specificare mediante il formalismo degli statecharts il seguente problema senza utilizzare variabili. Qualora l’ascensore sia in movimento. l’ascensore diventa fermo. . Inoltre. premendo set con la porta chiusa e l’ascensore fermo quando il piano selezionato è il piano 1. la porta può essere aperta oppure chiusa. Il controllo dell’ascensore è basato sull’utilizzo di due pulsanti set e start dove. STATECHARTS – Stato di storia N ome_stato Quando ritorno nello stato riprendo dall’ultimo stato figlio in cui mi trovavo. Esiste una selezione iniziale del piano data di default (scelta dallo studente) e la selezione non viene a cancellarsi a fronte di eventi quali l’apertura o la chiusura delle porte o start.2 Esercizi (tratti da temi d’esame) Esercizio 7. la selezione è ciclica: schiacciando set quando il piano selezionato è il piano 3 si seleziona il piano 0. in quanto viene assunto chiuso). Si ha un ascensore che può muoversi attraverso quattro piani numerati da 0 (piano terra) a 3. il pulsante set permette di selezionare il piano a cui si vuole andare e il pulsante start permette di far partire l’ascensore. – Stato iniziale N ome_stato ⇐ • Evento Evento_1 7. Qualora sia fermo. si seleziona il piano 2. Il pulsante set permette di selezionare. Ad esempio. Qualora l’ascensore abbia raggiunto il piano selezionato. solo qualora l’ascensore sia fermo e la porta sia chiusa. in linea di principio. Premendo il pulsante start con la porta chiusa l’ascensore va in movimento.

7. set. il robot pulisce un’area finché non si è presentato l’evento pulito. e. entra all’interno della stanza.2 (9 punti) Specificare mediante il formalismo degli statecharts senza utilizzare variabili il problema di coordinare due robot pulitori (R1 e R2) per lavare il pavimento di una stanza (S). • non siano mai presenti due robot nella stessa area contemporaneamente. Il funzionamento di ogni robot. (Suggerimento: si specifichi prima il funzionamento dei robot quando lavano la stanza singolarmente. il robot si sposta in magazzino). • tutte le aree vengano lavate una sola volta.2. • R2 inizi a lavare la stanza S partendo dall’area A4 e si muova verso l’area A1. il robot si ferma e si sposta nell’area da pulire successiva (qualora si trovi nell’ultima area. Il criterio con cui il robot lava la stanza è il seguente: la stanza (S) viene divisa in quattro aree (A1-A2-A3-A4) contigue e le aree vengono lavate in successione una dopo l’altra (le stanze vengono lavate o nell’ordine A1-A2-A3-A4 o nell’ordine A4-A3-A2-A1). • i tempi di passaggio dei robot tra due aree contigue e tra una generica area e il magazzino siano trascurabili ai fini della specifica. lava la stanza e quando la stanza è completamente pulita torna nel magazzino. Le aree possono essere sporche in vario modo richiedendo così tempi diversi per poter essere pulite. In sintesi. Gli stati di default possono essere assegnati liberamente purché consistenti. quando lava da solo la stanza. è il seguente: si attiva dal magazzino a fronte dell’evento start. chiudi_porta. (Consiglio: si risolva l’esercizio in modo incrementale. start. Gli unici eventi conosciuti dal sistema sono: apri_porta. Il passaggio del robot da un’area alla successiva è basato sull’evento pulito: questo viene generato ogni qual volta l’area che il robot sta lavando diventi pulita. e poi quando lavano la stanza in modo coordinato. appena si presenta tale evento. e si richiede di modificare tale funzionamento al fine di permettere ai due robot di lavare il pavimento in modo coordinato. • R1 inizi a lavare la stanza S partendo dall’area A1 e si muova verso l’area A4. l’ascensore va in movimento e si ferma subito. prima con soli 3 piani e poi lo si estenda al caso in cui i piani siano 4.) Esercizio 7.) . Si specifichi il funzionamento coordinato dei due robot in modo tale che: • R1 e R2 agiscano contemporaneamente. ESERCIZI (TRATTI DA TEMI D’ESAME) 57 Qualora il piano selezionato sia il piano in cui l’ascensore si trova. Viene fornito il funzionamento di ogni robot quando questo lava la stanza da solo.

• premere il pulsante di OK (evento click_ok). il sistema controlla i dati. Solo nel campo correntemente attivato è possibile inserire caratteri.58 Esercizio 7. attivare il campo password (evento click_pw). una tastiera e un mouse. a fronte dell’inserimento di caratteri (evento flusso_di_caratteri). • qualora sia attivo il campo nome. Si ha un sistema di log-in munito di un video. ma cooperanti nell’assemblaggio del prodotto finale. e il sistema verifica la correttezza dei dati inseriti per regolarne l’accesso. descritti sotto. • qualora sia il campo nome che il campo password siano non vuoti. in un insieme di stati. il sistema mostra un’avviso (avviso_dati_mancanti) e attiva l’ultimo stato attivo prima di aver premuto OK. ognuno dei quali dedicato ad un pezzo di uno specifico tipo. tramite un sistema a nastro.4 (10 punti) Formalizzare attraverso gli Statecharts il seguente problema. L’utente può inserire i propri dati (nome. Si ha una catena di montaggio costituita da tre robot. Il sistema può trovarsi o in uno stato in cui il campo nome è attivo (nome_attivo). Ogni robot i-esimo è schematizzabile considerando il suo stato (attendi_pezzo. All’avvio del sistema i campi sono vuoti (per ogni campo esiste lo stato vuoto) e. il campo selezionato diventa non vuoto (non_vuoto). All’avvio lo stato di default è nome_attivo. e genera un evento true se i dati sono corretti e false se i dati sono scorretti.3 (9 punti) CAPITOLO 7. A fronte di true mostra un avviso di login (avviso_login). • qualora uno tra il campo nome e il campo password non sia vuoto. L’obiettivo è coordinare i tre robot nell’assemblaggio del pezzo. a fronte di un false mostra un’avviso (avviso_dati_sbagliati) e attiva l’ultimo stato attivo prima di aver premuto OK. Tramite il mouse è poi possibile: • qualora sia attivo il campo password. e un pulsante di OK. oppure il campo password è attivo (pw_attivo). Ogni robot è collegato a sua volta a un macchinario che porta. i singoli pezzi al robot. il sistema mostra un’avviso (avviso_nome_mancante oppure avviso_pw_mancante) e attiva lo stato relativo al campo mancante. Esercizio 7. oppure in uno stato (controllo) in cui il sistema verifica la correttezza dei dati immessi. A video viene proiettata una schermata costituita da un campo nome. prendi_pezzo. Premendo il pulsante di Ok è possibile: • qualora sia il campo nome che il campo password siano vuoti. attivare il campo nome (evento click_nome). impila_pezzo) e lo stato del tipo di pezzo i-esimo portato dal sistema . ancora. in cui vengono segnalati degli avvisi all’utente. password) premere il pulsante di Ok. oppure. un campo password. STATECHARTS Specificare mediante il formalismo degli statecharts senza utilizzare variabili il seguente problema.

si consiglia di schematizzare il prodotto in vari stati. . il pezzo3. I pezzi dei tre robot devono essere impilati in un particolare ordine per poter assemblare il prodotto finale. Se il tipo di pezzo i-esimo è presente. La stanza è divisa. e terzo. qualora tutti i pezzi siano stati impilati). deve prima essere impilato il pezzo1. Nello specifico: ci sono due robot uguali che alloggiano in un magazzino e che devono periodicamente pulire una stanza S.esimo. Ogni volta che arriva un pezzo per il robot i. infine. allora il robot i-esimo può prenderlo.7. La coordinazione è tale che nessuna area che è stata pulita viene pulita nuovamente e che non ci possono essere due robot nella stessa area. se il pezzo2 è stato impilato. se il pezzo1 è stato impilato. ESERCIZI (TRATTI DA TEMI D’ESAME) 59 a nastro al robot i-esimo (pezzo_presente. Gli unici eventi che i robot riconoscono sono start e pulito (generato quando l’area che il robot sta pulendo è diventata pulita).5 (10 punti) Sia data la formalizzazione basata su Statecharts riportata in figura dove si descrive la coordinazione tra due robot pulitori (R1 e R2). e. secondo. Per poter coordinare in modo efficiente i tre robot. Esercizio 7. viene generato l’evento pezzo-i e lo stato del relativo tipo di pezzo passa da pezzo_mancante a pezzo_presente (il sistema è fatto in modo tale che un pezzo può arrivare solo se nessun pezzo di quel tipo è presente). poi il pezzo2. pezzo_mancante).2. ai fine del lavaggio. se nessun pezzo è stato impilato. primo. in quattro aeree (A1-A4) e i robot sono coordinati in modo tale che il robot R1 inizia a pulire la stanza a partire dall’area A1 e prosegue scendendo (rispetto alla figura) verso l’area A4 e il robot R2 inizia dall’area A2 e prosegue verso l’area A1. ad esempio (vuoto. Nello specifico. e conseguentemente il tipo di pezzo i-esimo diventa mancante.

Il trasmettitore può trasmettere un solo pacchetto per volta e. una volta che l’acqua è stata cambiata. Durante il cambio dell’acqua. qualora in quell’area sia presente R2. A3. R1 si accorgerà che l’acqua è pulita in quanto viene a generarsi l’evento acqua_pulita. Si consiglia di tenere traccia dello stato di R1 prima di andare in L. ma che non ha concluso di pulire in quanto è dovuto andare a cambiare l’acqua. aspettare il messaggio che confermi la corretta consegna del pacchetto e. andare a cambiare l’acqua (in una stanza denominata L). Così. qualora non arrivi tale messaggio. la possibilità che un pacchetto non venga consegnato correttamente e venga quindi ritrasmesso e 2.waiting) oppure in invio (S . . Ogni volta che almeno una coda (in questo caso solo Q1) è in WP ed è presente un pacchetto da inviare. Il mezzo trasmissivo viene utilizzato con mutua esclusività da alcune code a priorità (Q – queue) il cui obiettivo è gestire l’invio di un pacchetto: recuperare il pacchetto.sending). Una volta terminata la trasmissione il mezzo trasmissivo ritorna nello stato W e conseguentemente la coda transisce in WA. Si richiede di estendere lo statechart dato per cogliere due aspetti: 1. di andare a pulire un’area che R1 ha cominciato a pulire. in invio (S . inviarlo al mezzo trasmissivo. cioè quando è in W.60 CAPITOLO 7.6 (10 punti) Si vuole specificare tramite il formalismo degli Statechart senza l’utilizzo di variabili la trasmissione di pacchetti TCP su rete da parte un singolo host. A fronte dell’evento ack1 la coda transisce da WA a WP. al fine di ridurre il tempo di lavaggio della stanza. Una volta in WS. qualora la trasmissione del singolo pacchetto si concluda. Così R1 deve. STATECHARTS Si pone il problema che R1 ha un guasto al serbatoio d’acqua e non può immagazzinare la quantità d’acqua necessaria per pulire (si assume che la quantità immagazzinata dal serbatoio può non essere sufficiente neanche per pulire una singola area). il pacchetto viene automaticamente assegnato a Q1 e quindi questa transisce da WP a WS. viene generato un evento sent. R1 tornerà a pulire l’area che stava pulendo al momento in cui si è generato l’evento acqua_sporca oppure. tornerà in magazzino. In figura è fornito lo statechart che specifica la situazione in cui sia presente una sola coda Q1 e la rete sia affidabile. Nel caso ci sia una sola coda. viene generato un evento packet che viene comunicato a tutte le code. Il mezzo trasmissivo è costituito da un trasmettitore T che può essere in attesa (W . Esercizio 7. La coda si può trovare: in attesa dell’arrivo di un pacchetto (WP – waiting for a packet). quando necessario (cioè appena si presenta l’evento acqua_sporca). la coda Q1 transisce in S qualora il mezzo trasmissivo sia disponile. rinviare il pacchetto. la presenza di due code concorrenti. M. in attesa di accedere al mezzo trasmissivo (WS – waiting for sending). usando uno stato concorrente con stati: A1.sending) e in attesa del messaggio di corretta consegna del pacchetto (WA – waiting for acknoledgment). E’ permesso a R2. Formalizzare tale problema modificando la figura sopra aggiungendo gli stati necessari e modificando le condizioni di transizione. A2.

Una volta inviato un pacchetto tramite la coda Q1 e non si abbia ricevuto il messaggio di conferma entro una scadenza prefissata. Il numero massimo di ritrasmissioni è 2. in attesa di poter ritentare l’accesso al mezzo trasmissivo (W) e in trasmissione dei dati sul mezzo trasmissivo (PT). analogamente se entrambe le due code sono in attesa di accedere al mezzo trasmissivo viene preferita la coda Q1. Una volta che arriva un pacchetto. La transizione da W a MA è attivata a fronte di un evento timeoutHi. Le due code funzionano in modo analogo in parallelo. Qualora c’è almeno un pacchetto in coda. Si utilizzi uno stato contatore C1 per tenere traccia del numero di trasmissioni di un pacchetto. dove i indica il numero dell’host.7 (10 punti) Si vuole specificare tramite il formalismo degli Statecharts il meccanismo con cui la tecnologia Ethernet gestisce l’accesso al mezzo trasmissivo. Qualora il mezzo trasmissivo sia libero l’host prende possesso di questo e trasmette (quindi passa a PT). l’host passa da WP a MA. nel tentativo di accedere al mezzo trasmissivo. Si introduca una nuova coda Q2. Per descrive il funzionamento dell’host si utilizza inoltre una coda di pacchetti capace di contenere al massimo tre pacchetti. Viene però data precedenza a Q1: se è disponile un pacchetto ed entrambe le code lo possono gestire viene preferita la coda Q1. ESERCIZI (TRATTI DA TEMI D’ESAME) 61 1. in trasmissione sul mezzo per poter avere l’accesso (stato MA).2. H2. Il mezzo trasmissivo può essere in uso da una coppia di host (blocked) o libero (free). H3) e il mezzo trasmissivo (denotato con medium). questo viene tolto dalla coda. Si considerino tre host (denotati con H1. Finita la trasmissione (evento sentHi) lo stato dell’host può passare . A fronte di timeout1 il pacchetto viene ritrasmesso. 2.7. Esercizio 7. Qualora invece il mezzo trasmissivo sia occupato l’host passa a W. dopodichè la coda gestisce un altro pacchetto. Gli host possono essere in attesa dell’arrivo di pacchetti (stato WP). viene generato un evento timeout1. Una volta cominciata la trasmissione del pacchetto. questo entra in coda: l’evento che segnala l’arrivo del pacchetto è incomingHi.

e senza l’utilizzo di variabili. In modo analogo vengono gestite le transizioni tra attesa e merendina2. I pulsanti utilizzabili dall’utente sono: start. E’ possibile selezionare . La transizione da merendina1 ad attesa avviene in automatico. Esercizio 7. merendina2. La chiave può essere inserita (stato inserita) o non inserita (stato non_inserita) nella macchina distributrice. merendina1. il programma non può essere cambiato se non tramite il pulsante reset (ciononostante la cottura può essere sospesa aprendo il forno).9 (10 punti) Si vuole specificare tramite il formalismo degli Statecharts. La merendina1 ha un costo pari a 2 euro. oppure può trovarsi in uno stato (beep) in cui allerta l’utente del forno emettendo un suono. STATECHARTS in MA qualora ci siano altri pacchetti in coda. Il sistema di controllo del forno si basa principalmente sulla selezione del programma e sul timer. Inizialmente si suppone che il numero di merendine sia pari al massimo. in questo caso però il costo di una merendina2 è di 1 euro. La macchina distributrice può essere in tre soli stati: attesa. Nella chiave è presente il credito. esiste almeno una merendina1 nella macchina e nella chiave è presente un credito sufficiente per acquistare la merendina1. ad esempio col programma 4 la cottura dura 4 minuti. Ogni utente è munito di una chiave magnetica contenente il proprio credito. In merendina1 la macchina fa prendere all’utente una merendina1. non in funzione. oppure in WP qualora non ci siano pacchetti in coda. Il numero di merendine scende ogni volta che una merendina viene comprata (si veda sotto per le condizioni da considerare) e ritorna al massimo ogni volta che viene ricaricata (evento ricarica). Per ogni tipo di merendina la macchina contiene al massimo 2 merendine. Il nome del programma fa riferimento alla durata della cottura. il funzionamento di una macchina distributrice di merendine. e senza l’utilizzo di variabili. La particolarità del sistema di controllo è che. Esercizio 7. Questo può essere al massimo di 5 euro e scende ogni qual volta si compra una merendina del costo della merendina comprata (si veda sotto per le condizioni da considerare) e sale di un euro ogni qualvolta la chiave è inserita e si verifica l’evento 1euro. La macchina contiene due tipi di merendine: merendina1 e merendina2. Ci sono due possibili programmi (4 e 8) e un programma fittizio (0) che identifica il fatto che non è stato selezionato alcun programma. reset e set. Il forno può essere aperto o chiuso (gli eventi apri e chiudi regolano le corrispettive transizioni). il forno può essere: in funzione.62 CAPITOLO 7. Il mezzo trasmissivo transisce da free a blocked quando almeno un host passa a PT e da blocked a free quando nessun host è in PT. l’utente ha premuto il pulsante 1 (evento pulsante1). La transizione da attesa a merendina1 è possibile se: la chiave è inserita. Riportare lo statechart di un generico host i e del mezzo trasmissivo. In attesa attende che l’utente scelga la merendina da comprare. una volta selezionato un programma di cottura e fatto partire il forno.8 (10 punti) Si vuole specificare tramite il formalismo degli Statecharts. Quando è chiuso. il funzionamento di un forno a microonde.

Ogni qual volta un processo i è in execution e richiede una risorsa X.2. Infine. Gli eventi che guidano le transizioni da execution a ready sono generati dallo scheduler e sono: dispatch_i e preempt_i. La transizione da 0 a spento è automatica. l’uso di due risorse (A e B) da parte di due processi periodici (1 e 2). Inoltre. execution o wait. Si vuole che a metà cottura e a fine cottura il forno passi dallo stato in funzione allo stato beep e successivamente allo stato non in funzione (questa ultima transizione avviene in automatico). e non ci sono programmi di cottura da terminare.11 (10 punti) Si vuole specificare tramite il formalismo degli Statecharts il funzionamento di un ascensore in un palazzo in Israele. viene generato un evento i. il forno va in funzione. e senza l’utilizzo di variabili. Esercizio 7.7.10 (10 punti) Si vuole specificare tramite il formalismo degli Statecharts.freeX (quet’ultimo evento viene generato quando un processo i in esecuzione libera la risorsa X). l’ascensore può trovarsi su 3 piani (1. e così via sono regolate da un evento timer (questo evento si attiva automaticamente ogni 2 minuti di cottura effettiva).requireX e i. Una risorsa X può trovarsi o libera (free) o occupata (hold). L’uso del pulsate set è ciclico: se premuto una volta permette di selezionare il programma 4. tutte le funzionalità del forno vengono azzerate. È necessario modellizzare lo stato delle risorse e l’uso delle risorse da parte di ogni singolo processo. in quest’ultimo si riconoscono due sottostati: waitingA e waitingB (corrispondenti all’attesa della risorsa A e B rispettivamente). dove al sabato l’ascensore si muove autonomamente senza nessun intervento da parte degli utenti. Le transizioni da free a hold sono guidate dagli eventi i. L’ascensore può essere fermo o in movimento (le condizioni che guidano le transizioni tra questi stati sono descritti in seguito). 2. indipendentemente dallo stato in cui si trova il forno. Un generico processo i può trovarsi nello stato di ready. il timer passa da spento allo stato corrispondente al programma. e così via. se premuto il tasto reset. è chiuso. le transizioni da 8 a 6. se premuto una seconda volta permette di selezionare il programma 8. Una volta selezionato un programma e attivato il forno.requireX. 3) . Qualora la risorsa è occupata (vedi sotto) il processo passa a waitingX. da 6 a 4. La sospensione a metà cottura ha la finalità di permettere all’utente di “girare” l’alimento da cuocere. Premendo il pulsante start. se premuta un’altra volta il programma 0. Esercizio 7. Per poter gestire una cottura si modellizzi il timer: può essere spento oppure in uno stato da 0 a 8 (si considerino solo i pari). ESERCIZI (TRATTI DA TEMI D’ESAME) 63 un programma tramite l’uso del pulsante set solo se il forno non è in funzione. qualora sia stato impostato un programma diverso da 0. Via via che passa il tempo (evento timer) lo stato del timer viene aggiornato. Si presuppone che un processo non possa aspettare di accedere contestualmente a più di una risorsa (un processo può però utilizzare entrambe le risorse). L’uso delle risorse da parte di un processo i viene modellizzata con uno statechart costituito da un numero di stati pari al numero di combinazioni di risorse utilizzate dal processo.

La transizione verso un credito maggiore è attivata dall’evento gettone e dal fatto che la tessera sia inserita. qualora sia a 1 seleziona 2. Esercizio 7.12 (10 punti) Si vuole modellizzare tramite il formalismo degli StateCharts il funzionamento di un distributore di videocassette.64 CAPITOLO 7. Qualora sia a 0 seleziona 1. Il distributore offre una interfaccia la cui schermata principale è la home. Una volta scelto un film i (evento sel_film_i) si possono verificare alcuni casi: se non ci sono copie disponibili non avvengono transizioni. Al sabato l’ascensore passa da fermo a in movimento appena il piano impostato è diverso da quello corrente. Precisamente. Si introduca un macrostato giorno per gestire il giorno della settimana dove un evento (Event_day) fa cambiare il giorno della settimana. selezionare tramite il pulsante set (da considerare come evento) il piano desiderato. può passare alla schermata scelta (evento scegli) da cui scegliere il film da prendere. Ogni tessera ha caricato un certo credito che può essere 0. Gli eventi che attivano queste due transizioni sono inserisci (da out a in) ed estrai (da in a out). questa può essere in oppure out. fino a 3. dove i è un parametro. Al sabato inoltre il pulsante set e il pulsante start non hanno effetto. se il credito non è sufficiente viene visualizzata la schermata dicendo che il credito è insufficiente e si ritorna a scelta. quando l’ascensore è fermo. Si consideri ora il problema di modificare il sistema di controllo per permettere di gestire il sabato.1. Una volta impostato il piano desiderato e premuto il tasto start (da considerare come evento). anche senza aver inserito la propria tessera. e infine da 3 a 0.2. STATECHARTS più il piano terra (0). se la tessera non è inserita viene visualizzata la schermata in cui si richiede di inserire la tessera e si ritorna a scelta. Si introduca un macrostato direzione che descriva la direzione dell’ascensore (Up e Down) e tale che quando in discesa l’ascensore raggiunge il piano 0 la direzione diventa Up e quando invece in salita raggiunge il piano 3 la direzione diventa Down. In questo caso l’ascensore si muoverà ovviamente verso il piano impostato. allora autonomamente il sistema di impostazione seleziona il prossimo piano in cui andare. Il funzionamento dell’ascensore in questo caso è: si muove piano per piano in modo tale che. Si supponga che per ogni film possa contenere un massimo di tre copie. La transizione verso un credito negativo è attivata dal verificarsi di una transazione. Da questa un utente. una volta che l’ascensore ha raggiunto un piano e si è fermato. Nella transizione da in ad out è necessario inoltre che non ci sia alcuna transazione in atto (vedi sotto). se l’ascensore non si trova al piano impostato. La transizione da un piano all’altro è possibile solo se l’ascensore è in movimento. allora va in movimento. il pulsante set permette di passare ciclicamente da 0 a 1.3. Il distributore può contenere diversi film e per ognuno di questi più copie. da 2 a 3. La transizione verso un numero maggiore di copie è attivata dall’evento restituito. altrimenti viene . Ogni utente registrato ha una tessera. Si specifichino gli stati relativi a un film generico i. È presente inoltre un sistema di impostazione del piano ad uso dell’utente. a quel punto seleziona 2 e riscende piano per piano fino a 0. da 1 a 2. L’utente può.

) Nello specifico: un meccanico può trovarsi in svita. In aspetta il meccanico sta aspettando che la propria gomma venga rimossa oppure ha finito di avvitare la propria gomma e sta aspettando che tutte le altre gomme siano state cambiate. Le transizioni sono attivate dai seguenti eventi: svitata. dove j. indipendentemente da cosa stia facendo. Una volta svitata la gomma. e avvita. la transizione inversa è attivata quando tutte le gomme sono state cambiate). da_avvitare. Un’auto può essere ferma o in_movimento (l’evento pit_stop attiva la transizione da in_movimento a ferma. aiutak. un ulteriore meccanico (il cui comportamento non è da modellare) si occupa di rimuovere la gomma che è stata svitata e montare la gomma nuova. avvitata. Ogni gomma può trovarsi in: da_svitare. si ritorna alla home. k. se il meccanicoi sta aiutando un altro meccanico e la gomma i è stata rimossa. (L’assunzione è che meccanici diversi possono impiegare tempi diversi per avvitare/svitare e rimuovere le gomme. La particolarità del problema è che ogni meccanico addetto a svitare/avvitare una specifica gomma può aiutare i meccanici addetti a svitare/avvitare le altre gomme. . In un qualunque istante di tempo venga estratta la tessera. allora il meccanicoi va subito ad avvitare quest’ultima gomma. da_rimuovere. In questo stato il meccanicoi può aiutare il meccanicoj che in quell’istante sta svitando o avvitando la propria gomma j (indicare gli stati come: aiutaj.7. La macchina ripartirà quando tutte le gomme sono state cambiate. aspetta. pronta. Inoltre. Una volta che una macchina si ferma. per ogni gomma si attiva un meccanico (meccanicoi) che prima svita e poi avvita la gomma. Esercizio 7. rimossa. aiutal. ESERCIZI (TRATTI DA TEMI D’ESAME) 65 attivata la transazione e si ritorna alla home.2.13 (10 punti) Si vuole modellare tramite il formalismo degli StateCharts il coordinamento di un gruppo di meccanici durante il pit-stop di un’auto da corsa. e l sono indici).

Sign up to vote on this title
UsefulNot useful