Home.md
... ...
@@ -0,0 +1,37 @@
1
+
2
+# Tre bel panino wiki
3
+
4
+Raccolta di appunti, info e documentazione per il mio server e i miei servizi.
5
+
6
+## TODO
7
+
8
+- Montare telecamere (Frigate o Shinobi): Un sistema NVR (Network Video Recorder) locale per gestire, registrare e visualizzare i flussi video delle tue telecamere IP.
9
+- Riconoscimento facciale AI (CompreFace o Double Take): Un'integrazione di intelligenza artificiale che analizza i flussi video (spesso abbinata a Frigate) per identificare volti noti, auto o animali, attivando automazioni specifiche.
10
+- Diagramma networking casa
11
+- Diagramma servizi server
12
+- Monitoraggio uptime e risorse (Uptime Kuma + Grafana/Prometheus): Una suite di controllo: Uptime Kuma per avere una dashboard stile "semaforo" sui servizi attivi, e Grafana per grafici dettagliati sull'uso di CPU, RAM e disco del server.
13
+- overseerr -> seerr
14
+- Refactor server Plex: maybe, dischi in raid 0
15
+- Reverse proxy di tutto (Nginx Proxy Manager, Traefik o Caddy)
16
+- IDS/IPS + Firewall + Wireshark (OPNsense + Suricata/CrowdSec): Un sistema di difesa avanzato dove il firewall blocca le porte, Suricata/CrowdSec fanno da sensori per rilevare e bannare automaticamente gli hacker (IDS/IPS).
17
+- Controllo cancello automatico (ESPHome/Shelly via Home Assistant): La "domotizzazione" del cancello tramite un relè locale (es. Shelly), che ti permette di aprirlo da smartphone, tramite geofencing o dal cruscotto dell'auto (Android Auto/CarPlay).
18
+- DNS (AdGuard Home vs Pi-hole vs BIND): Il sistema di risoluzione dei nomi a dominio. Qual è il migliore? BIND è complesso ed enterprise; AdGuard Home oggi è spesso preferito a Pi-hole perché supporta DoH/DoT (DNS over HTTPS/TLS) nativamente e ha un'interfaccia più moderna. (uno per servere per failover)
19
+- Hosting immagini (Immich o Nextcloue Memories): Un'alternativa self-hosted identica a Google Foto. Consiglio: Usa immich (piu veloce)
20
+- Home Assistant (HAOS): compatibile con molti sistemi (Zigbee, Wi-Fi, Apple, Google, sensori vari).
21
+- Trello (Planka, Kanboard o Focalboard): Piattaforme Kanban per la produttività. Consiglio planka
22
+- Firewall (pfSense o OPNsense): Un router/firewall software di livello enterprise (da installare su un mini-PC dedicato) da mettere "a monte" di tutto per gestire le tue reti (VLAN), le VPN (WireGuard) e blindare l'accesso a internet.
23
+- Wallabag: Il tuo raccoglitore personale "leggi più tardi" (tipo Pocket), che estrae il testo e le immagini dagli articoli web, ripulendoli da pubblicità e distrazioni per farteli leggere comodamente anche offline.
24
+- Minecraft server (Pterodactyl o Pelican)
25
+
26
+## Servizi da hostare
27
+
28
+- Gluetun: Un client VPN containerizzato che funge da "colla" sicura per instradare e proteggere il traffico di rete degli altri tuoi container Docker.
29
+- Mealie: Un gestore di ricette e pianificatore di pasti con un'interfaccia moderna e la comodissima funzione di importazione automatica dagli URL.
30
+- Grocy: Un vero e proprio sistema gestionale (ERP) per la casa, ideale per tracciare l'inventario della dispensa, le date di scadenza e le faccende domestiche.
31
+- Firefly III: Un solido manager per le finanze personali che ti permette di tracciare conti, spese e budget mantenendo i tuoi dati finanziari privati.
32
+- Paperless-ngx: Un archivio digitale intelligente che utilizza l'OCR per scansionare, leggere, indicizzare e organizzare in automatico tutti i tuoi documenti e PDF.
33
+- Planka: Un'elegante e reattiva alternativa open source a Trello per gestire task e progetti tramite bacheche Kanban.
34
+- Dozzle: Un visualizzatore web leggerissimo per leggere, cercare e monitorare in tempo reale i log dei tuoi container Docker senza toccare la riga di comando.
35
+- Kurrier: Un workspace moderno e unificato di nuova generazione per gestire comodamente email, calendari, contatti e storage dal browser.
36
+- Termix: Una piattaforma web per la gestione dei server (ottima alternativa self-hosted a Termius) che offre terminale SSH, tunneling, file manager remoto e gestione Docker.
37
+- Authentik (Autentik): Un potente provider di identità (IdP) che funge da Single Sign-On (SSO) per centralizzare l'autenticazione e blindare l'accesso ai tuoi servizi esposti.
_Sidebar.md
... ...
@@ -0,0 +1,3 @@
1
+**Uni**
2
+
3
+- [Prova](./sistemi.md)
home.md
... ...
@@ -1,46 +0,0 @@
1
----
2
-title: Homepage
3
-description: Home page
4
-published: true
5
-date: 2026-02-20T12:49:33.190Z
6
-tags:
7
-editor: markdown
8
-dateCreated: 2026-02-18T10:11:56.309Z
9
----
10
-
11
-# Tre bel panino wiki
12
-
13
-Raccolta di appunti, info e documentazione per il mio server e i miei servizi.
14
-
15
-## TODO
16
-
17
-- Montare telecamere (Frigate o Shinobi): Un sistema NVR (Network Video Recorder) locale per gestire, registrare e visualizzare i flussi video delle tue telecamere IP.
18
-- Riconoscimento facciale AI (CompreFace o Double Take): Un'integrazione di intelligenza artificiale che analizza i flussi video (spesso abbinata a Frigate) per identificare volti noti, auto o animali, attivando automazioni specifiche.
19
-- Diagramma networking casa
20
-- Diagramma servizi server
21
-- Monitoraggio uptime e risorse (Uptime Kuma + Grafana/Prometheus): Una suite di controllo: Uptime Kuma per avere una dashboard stile "semaforo" sui servizi attivi, e Grafana per grafici dettagliati sull'uso di CPU, RAM e disco del server.
22
-- overseerr -> seerr
23
-- Refactor server Plex: maybe, dischi in raid 0
24
-- Reverse proxy di tutto (Nginx Proxy Manager, Traefik o Caddy)
25
-- IDS/IPS + Firewall + Wireshark (OPNsense + Suricata/CrowdSec): Un sistema di difesa avanzato dove il firewall blocca le porte, Suricata/CrowdSec fanno da sensori per rilevare e bannare automaticamente gli hacker (IDS/IPS).
26
-- Controllo cancello automatico (ESPHome/Shelly via Home Assistant): La "domotizzazione" del cancello tramite un relè locale (es. Shelly), che ti permette di aprirlo da smartphone, tramite geofencing o dal cruscotto dell'auto (Android Auto/CarPlay).
27
-- DNS (AdGuard Home vs Pi-hole vs BIND): Il sistema di risoluzione dei nomi a dominio. Qual è il migliore? BIND è complesso ed enterprise; AdGuard Home oggi è spesso preferito a Pi-hole perché supporta DoH/DoT (DNS over HTTPS/TLS) nativamente e ha un'interfaccia più moderna. (uno per servere per failover)
28
-- Hosting immagini (Immich o Nextcloue Memories): Un'alternativa self-hosted identica a Google Foto. Consiglio: Usa immich (piu veloce)
29
-- Home Assistant (HAOS): compatibile con molti sistemi (Zigbee, Wi-Fi, Apple, Google, sensori vari).
30
-- Trello (Planka, Kanboard o Focalboard): Piattaforme Kanban per la produttività. Consiglio planka
31
-- Firewall (pfSense o OPNsense): Un router/firewall software di livello enterprise (da installare su un mini-PC dedicato) da mettere "a monte" di tutto per gestire le tue reti (VLAN), le VPN (WireGuard) e blindare l'accesso a internet.
32
-- Wallabag: Il tuo raccoglitore personale "leggi più tardi" (tipo Pocket), che estrae il testo e le immagini dagli articoli web, ripulendoli da pubblicità e distrazioni per farteli leggere comodamente anche offline.
33
-- Minecraft server (Pterodactyl o Pelican)
34
-
35
-## Servizi da hostare
36
-
37
-- Gluetun: Un client VPN containerizzato che funge da "colla" sicura per instradare e proteggere il traffico di rete degli altri tuoi container Docker.
38
-- Mealie: Un gestore di ricette e pianificatore di pasti con un'interfaccia moderna e la comodissima funzione di importazione automatica dagli URL.
39
-- Grocy: Un vero e proprio sistema gestionale (ERP) per la casa, ideale per tracciare l'inventario della dispensa, le date di scadenza e le faccende domestiche.
40
-- Firefly III: Un solido manager per le finanze personali che ti permette di tracciare conti, spese e budget mantenendo i tuoi dati finanziari privati.
41
-- Paperless-ngx: Un archivio digitale intelligente che utilizza l'OCR per scansionare, leggere, indicizzare e organizzare in automatico tutti i tuoi documenti e PDF.
42
-- Planka: Un'elegante e reattiva alternativa open source a Trello per gestire task e progetti tramite bacheche Kanban.
43
-- Dozzle: Un visualizzatore web leggerissimo per leggere, cercare e monitorare in tempo reale i log dei tuoi container Docker senza toccare la riga di comando.
44
-- Kurrier: Un workspace moderno e unificato di nuova generazione per gestire comodamente email, calendari, contatti e storage dal browser.
45
-- Termix: Una piattaforma web per la gestione dei server (ottima alternativa self-hosted a Termius) che offre terminale SSH, tunneling, file manager remoto e gestione Docker.
46
-- Authentik (Autentik): Un potente provider di identità (IdP) che funge da Single Sign-On (SSO) per centralizzare l'autenticazione e blindare l'accesso ai tuoi servizi esposti.
linguaggi/s02/20260226.md
... ...
@@ -0,0 +1,107 @@
1
+# Gestione memoria (slide 36)
2
+
3
+scrivi le def di regola di scope dinamico e statico in s02
4
+
5
+### Il display
6
+
7
+Alternativa alla catena statica per implementare scope statico (e' piu veloce ma richiede mem in piu (per l'array))
8
+
9
+Si puo ridurre il costo h ad una costante usando la tecnica del display
10
+
11
+- la catena statica viene rappresentata mediante un array
12
+ - i-esimo elem dell array = punt all'RdA del sottoprogramma di livello di annidamento i attivo per ultimo
13
+- quindi: - `Display[1]=RdA` di una proc P di top level - `Display[2]=RdA` di una proc Q dichiarata in P - ... - `Display[2]=RdA` della proc attiva in questo momento (dichiarata dentro quella che si trova in `Display[i-1]`)
14
+
15
+Se il sottoprogramma corrente è annidato a livello i, un oggetto che è in uno scope esterno di h livelli può essere trovato guardando il punt a RdA nel display alla posizione j = i - h
16
+
17
+Esempio:
18
+![20260226_2026-02-26_13-27-05](assets/imgs/20260226_2026-02-26_13-27-05.png)
19
+
20
+Se proc corrente annidata a livello i, lo scope esterno di h livelli si ottiene in `Display[i - h]`
21
+Con Display in memoria un oggetto è trovato con due accessi, uno per il display e uno per l’oggetto
22
+![20260226_2026-02-26_13-27-34](assets/imgs/20260226_2026-02-26_13-27-34.png)
23
+
24
+![20260226_2026-02-26_13-30-25](assets/imgs/20260226_2026-02-26_13-30-25.png)
25
+
26
+Display o catena statica ?
27
+• Rari annidamenti di profondità > 3, quindi lunghezza max di catena statica = 3
28
+• Tecniche di ottimizzazione possono migliorare gli accessi alle catene usate più frequentemente (tenendo nei registri i puntatori)
29
+• Il display è più costoso da mantenere della catena statica nella sequenza di chiamata ...
30
+• Conclusione: display poco usato nelle implementazioni moderne…
31
+
32
+### Scope dinamico
33
+
34
+Con scope dinamico l’associazione nomi-oggetti denotabili dipende
35
+– dal flusso del controllo a run-time
36
+– dall’ordine con cui i sottoprogrammi sono chiamati - La regola generale è semplice: l’associazione corrente per un nome è quella determinata per ultima nell’esecuzione (non ancora distrutta).
37
+
38
+Implementazione ovvia:
39
+
40
+- Memorizzare i nomi negli RdA
41
+- Ricerca per nome risalendo la pila
42
+- Esempio: chiamate A,B,C,D
43
+
44
+![20260226_2026-02-26_13-32-49](assets/imgs/20260226_2026-02-26_13-32-49.png)
45
+
46
+Variante: A-list
47
+Le associazioni sono memorizzate in una struttura apposita (manipolata come una pila)
48
+Es: chiamate A B C D
49
+![20260226_2026-02-26_13-34-18](assets/imgs/20260226_2026-02-26_13-34-18.png)
50
+(in grigio le associazioni non attive)
51
+In pratica se ho x a livello A e x al livello B, quando parto da B o da sotto B risalendo trovo x(x deve essere attiva = visibile dal blocco corrente)
52
+quando mi sposto (es da A a C) devo rendere non visibili le var di altri blocchi (es. B non e' visibile da C o D)
53
+
54
+Per ogni record che alloco sulla pila devo esplicitare le var visibili
55
+nei libri la regola di visibilita' viene prima della regola di scope (nella realta' dipende)
56
+
57
+le associazioni non visibili lo sono per due casi:
58
+
59
+1. sono state riscritte
60
+2. sono invisibili secondo la regola di visibilita'
61
+
62
+Costi delle A-list
63
+
64
+- Molto semplice da implementare
65
+- Occupazione mem (nomi presente esplicitamente)
66
+- costo di gestione (ingresso uscita da blocco e inserzione rimozione blocchi dalla pila)
67
+- tempo di accesso (lineare nella profondita della a list)
68
+
69
+Possiamo ridurre il tempo d’accesso medio, aumentando il tempo di ingresso/uscita da blocco..
70
+
71
+#### Tabella centrale dei riferimenti, CRT
72
+
73
+evita le lunghe scansioni delle A list
74
+una tabella mantiene tutti i nomi distinti del programma
75
+
76
+- se i nomi sono noti statitcamente si puo accedere all elemento della tabella in tempo costante
77
+- altrimenti accesso hash
78
+
79
+Ad ogni nome e' associata la lista delle associazioni di quel nome
80
+
81
+- la piu recente e' la prima
82
+- le altre (disattivate) seguono
83
+
84
+Tempo di accesso costante
85
+
86
+![20260226_2026-02-26_14-19-03](assets/imgs/20260226_2026-02-26_14-19-03.png)
87
+
88
+![20260226_2026-02-26_14-22-03](assets/imgs/20260226_2026-02-26_14-22-03.png)
89
+
90
+nell'ultima tabella v e'dichiarato non visibile (0)
91
+
92
+#### Costi della CRT
93
+
94
+Gestione più complessa di A-list
95
+Meno occupazione di memoria:
96
+– se nomi noti staticamente, i nomi non sono necessari
97
+– in ogni caso, ogni nome memorizzato una sola volta
98
+
99
+Costo di gestione
100
+– ingresso/uscita da blocco (manipolazione di tutte le liste dei nomi presenti nel blocco)
101
+Tempo di accesso
102
+– costante (due accessi indiretti)
103
+Possiamo ridurre il tempo d’accesso medio, aumentando il tempo di ingresso/uscita da blocco...
104
+
105
+Es. esrcizio
106
+
107
+Si assuma che un generico linguaggio imperativo a blocchi. Il blocco A contenga una chiamata alla funzione f. Il numero dei record di attivazione (RdA) presenti run time sulla pila fra il RdA di A e quello della chiamata di f e' fissato staticamente o puo valere dinamicamente? Motivare la risoposta
linguaggi/s02/20260303.md
... ...
@@ -0,0 +1,371 @@
1
+# Strutturare il controllo
2
+
3
+Controllo del flusso
4
+
5
+**Espressioni**:
6
+
7
+- notazioni
8
+- valutazione
9
+- problemi
10
+
11
+**Comandi**
12
+
13
+- assegnamento
14
+- sequenziale
15
+- condizionale
16
+
17
+**Comandi iterativi**
18
+**Ricorsione**
19
+
20
+## Espressioni
21
+
22
+Un’espressione un’entità sintattica la cui valutazione produce un valore oppure non termina, nel qual caso l’espressione è indefinita.
23
+– infissa a + b
24
+– prefissa (polacca) + a b
25
+– postfissa (polacca inversa) a b +
26
+
27
+### Semantica delle espressioni: notazione infissa
28
+
29
+Precedenza fra gli operatori:
30
+
31
+a + b \* c ** d ** e / f ??
32
+if A < B and C < D then ??
33
+(in Pascal Errore se A,B,C,D non sono tutti booleani)
34
+
35
+Di solito operatori aritmetici precedenza su quelli di confronto che hanno precedenza su quelli logici (nono pascal)
36
+APL, Smalltalk: tutti gli op hanno eguale precedenza (si devono usare le parentesi)
37
+
38
+Associativita'
39
+
40
+15 - 4 - 3 ?? (15 -4) -3
41
+5 ** 2 ** 3 ?? 5 ** (2 ** 3)
42
+
43
+Non sempre ovvio (apl: 15-4-3 diventa 15-(4-3))
44
+
45
+### Semantica delle espressioni: notazione postfissa
46
+
47
+Molto piu semplice della infissa
48
+
49
+- non servono le regole di precedenza
50
+- non servono regole di associativita'
51
+- non servono parentesi
52
+- valutazione semplice usando una pila
53
+
54
+Valutazione usando una pila
55
+
56
+1. Leggi il prossimo simbolo dell’exp. e mettilo sulla pila
57
+2. Se il simbolo letto è un operatore:
58
+ – applica a operandi immediatamente precedenti sulla pila,
59
+ – memorizza il risultato in R,
60
+ – elimina operatore ed operandi dalla pila
61
+ – memorizza il valore di R sulla pila.
62
+3. Se la sequenza da leggere non è vuota torna a (1).
63
+4. Se il simbolo letto un operando torna a (1).
64
+
65
+### Semantica delle espressioni: notazione prefissa
66
+
67
+Molto piu semplice della infissa:
68
+
69
+- no regole di precedenza
70
+- no regole di associativita
71
+- no parentesi
72
+- valutazione smplce usando una pila (piu complicata di quella postfissa, dobbiamo contare gli operandi che vengono letti)
73
+
74
+## Valutazione delle espressioni
75
+
76
+• Le espressioni internamente sono rappresentate da
77
+alberi
78
+• Visite diverse dell’albero producono le varie notazione
79
+lineari:
80
+– Simmetrica -> infissa
81
+– Anticipata -> prefissa
82
+– Differita -> postfissa
83
+
84
+A partire dall'albero il compilatore prodice il codice oggetto oppure l'interprete valuta l'espressione
85
+In entrambi i casi l'ordine di valutazione delle sottoespressioni e' importante per vari motivi:
86
+– Effetti collaterali (modifiche di var che non sono )
87
+– Aritmetica finita (overflow)
88
+– Operandi non definiti ()
89
+– Ottimizzazione
90
+
91
+Es:
92
+`a+f(b)) * (c+f(b))`
93
+
94
+se f(n) = {x++ return x}
95
+chiamate diverse della stessa funzione possono provocare una modifica di valori e channo effetti diversi.
96
+Altro es:
97
+`a+f(b)) * (c+f(b))`
98
+Se f modifica b il risultato da sinistra a destra e diverso di quello da destra a sinistra
99
+• In alcuni linguaggi non sono ammesso funzioni con effetti laterali nelle espressioni
100
+• In Java è specificato chiaramente l’ordine (da sinistra a destra)
101
+
102
+### Operandi non definiti
103
+
104
+in C:
105
+
106
+```c
107
+a == 0 ? b : b/a
108
+```
109
+
110
+presuppone una valutazione **lazy**: si valutano solo gli op strettamente necessari.
111
+E'importante sapere se il ling adotta una valutazione lazy oppure **eager** (tutti gli operandi sono comunque valutati)
112
+
113
+### Valutazione corto-circutio
114
+
115
+Nel caso delle espressioni booleane spesso la vlutazione lazy è detta corto-circuito:
116
+
117
+```c
118
+a == 0 || b/a > 2
119
+```
120
+
121
+– Con valutazione lazy (corto circuito, come in C) => VERO
122
+– Con valutazione eager => possibile errore
123
+
124
+Visto che eager controlla tutti i parametri puo stare facendo una divisione con zero se a=0
125
+
126
+```
127
+p := lista;
128
+while (p <> nil ) and (pˆ.valore <> 3) do
129
+p := pˆ.prossimo;
130
+```
131
+
132
+(in pascal da errore)
133
+
134
+## Comandi
135
+
136
+Un comando e'un entita' la cui valutazione non necessariamente restituisce un valore, ma puo avere un affetto collaterale
137
+
138
+- effetto collaterale: modifica stato della computazione senza restituire un valore
139
+
140
+I comandi:
141
+
142
+- sono tipici del paradigma imperativo
143
+- non sono presenti nei paradigmi funzionali e logici
144
+- in alcuni casi restituiscono un valore
145
+
146
+## Variabili
147
+
148
+Nei ling imperativi (pascal, c, Ada...) la variabile e' modificabile (contenitore di val, normalmente di un certo tipo ed ha un nome)
149
+
150
+Il val nel contenitore puo essre modificato mediante il comando di assegnamento
151
+
152
+### Assegnamento
153
+
154
+`x:=2`
155
+`X = X +1` si noti il diverso ruolo delle X
156
+
157
+- la X di sinistra e'un **l-value**, ossia un valore che denota una locazione (e puo comparire a sinistra di un assegnamento)
158
+- la X di destra e'un **r-value** ossia un valore puo'essere contenuto in una locazione (e puo comparire a destra di un assegnamento)
159
+
160
+In generale
161
+exp1 Opass exp2
162
+
163
+Normalmente la valutazione di un assegnamento non restituisce un valore ma produce un ``side effect’’ (effetto collaterale)
164
+– In alcuni linguaggi l’assegnamento resituisce anche un valore. In C:
165
+x= 2 restituisce 2 quindi possiamo scrivere Y = X = 2
166
+
167
+### Modelli di variabile diversi
168
+
169
+Linguaggi funzionali (Lisp, ML, Haskell, Smalltalk): modello analogo a quella della matematica. Una variabile denota un valore e non è modificabile
170
+• Linguaggi logici: modello analogo a quello dei funzionali, ma con la possibilità di modificare (entro certi limiti) il valore associato alla variabile
171
+• Clu: modello a oggetti, chiamato anche modello a riferimento
172
+• Java:
173
+– variabile modificabile per i tipi primitivi (interi, booleani ecc.)
174
+– modello a riferimento per i tipi classe
175
+
176
+### Modello a riferimento
177
+
178
+na variabile è un riferimento ad un valore, che ha un nome X ----> 2
179
+Analogo alla nozione di puntatore, ma senza le possibilità di manipolazione delle locazioni dei puntatori: le locazioni qui possono essere manipolate solo implicitamente
180
+
181
+![20260303_2026-03-03_14-16-18](assets/imgs/20260303_2026-03-03_14-16-18.png)
182
+A destra, se gli oggetti riferiti da X e Y sono modificabili (es.oggetti Java) modifiche fatte attraverso la X si riflettono sull’oggetto riferito da Y
183
+
184
+### Operatori di assegnamento
185
+
186
+X := X+1
187
+
188
+- doppio accesso alla locazione di a (a meno di ottimizzazione del compilatore)
189
+- poco chiaro; in alcuni casi puo’ causare errori
190
+ ![20260303_2026-03-03_14-17-40](assets/imgs/20260303_2026-03-03_14-17-40.png)
191
+
192
+### Espressioni e comandi (l. imperativi)
193
+
194
+lgol 68: expression oriented
195
+– non c’e’ nozione separata di comando
196
+– ogni procedura restituise un valore
197
+
198
+Pascal: comandi separati da espressioni
199
+– un comando non puo’ comparire dove e’ richiesta un’espressione
200
+– e viceversa
201
+
202
+C: comandi separati da espressioni
203
+– espressioni possono comparire dove ci si aspetta un comando
204
+– assegnamento (=) permesso nelle espressioni
205
+
206
+### Ambiente e memoria
207
+
208
+Due variabili diverse possono denotare lo stesso oggetto (aliasing)
209
+– come si rappresenta questa situazione in termini di stato ?
210
+– la semplice funzione Stato: Nomi ---> Valori non basta
211
+
212
+La semantica dei linguaggi imperativi usa:
213
+– Ambiente: Nomi ----> Valori Denotabili
214
+– Memoria: Locazioni ---> Valori Memorizzabili
215
+
216
+Nei linguaggi imperativi sono presenti tre importanti domini semantici:
217
+– Valori Denotabili (quelli a cui si può dare un nome)
218
+– Valori Memorizzabili (si possono memorizzare)
219
+– Valori Esprimibili (risultato della valutazione di una exp.)
220
+
221
+> Nota: I linguaggi funzionali usano sono l’ambiente
222
+
223
+### Comandi per il controllo sequenza
224
+
225
+Comandi per il controllo sequenza esplicito
226
+– ;
227
+– blocchi
228
+– goto
229
+Comandi condizionali
230
+– if
231
+– case
232
+Comandi iterativi
233
+– iterazione determinata (for)
234
+– iterazione indeterminata (while)
235
+
236
+### Comando sequenziale e blocchi
237
+
238
+C1 ; C2 (significa che viene prima eseguito c1 e poi c2)
239
+– E’ il costrutto di base dei linguaggi imperativi
240
+– Ha senso solo se ci sono side-effects
241
+– in alcuni linguaggi il ``;’’ più che un comando sequenziale è un
242
+terminatore
243
+
244
+Algol 68, C: Il valore di un comando composto e’ quello dell’ultimo comando.
245
+
246
+Comando composto
247
+– può essere usato al posto di un comando semplice
248
+– Algol 68, C (no distinzione espressione-comando): il valore di un comando composto e’ quello dell’ultimo comando
249
+
250
+````{ begin
251
+… …
252
+} end```
253
+````
254
+
255
+### GOTO
256
+
257
+Acceso dibattito negli anni 60 sull'utilita del goto
258
+Alla fine considerato dannoso
259
+
260
+## Programmazione strutturata
261
+
262
+- GOTO sconfitto perche'considerato contrario alla programmazione strutturata
263
+- Nata negli anni 70 antesignana della programmazione OOP
264
+
265
+Caratteristiche:
266
+
267
+- design top down
268
+- codice modulare
269
+- nomi identificatori significativi
270
+- uso esteso commenti
271
+- tipi di dato strutturato
272
+- comandi per il controllo strutturato
273
+- ...
274
+
275
+### Comandi di controllo strutturati
276
+
277
+Un solo punto di ingressoe un solo punto d'uscita
278
+
279
+- la scansione lineare del testo corrisponde al flusso di esecuzione
280
+- fondamentale per la comprensione del codice
281
+
282
+Comandi strutturati
283
+
284
+- for if while case
285
+- non e'il caso del goto
286
+
287
+Permette codice strutturato e non spaghetti code
288
+
289
+### Comando condizionale
290
+
291
+`if B then C_1 esle C_2`
292
+
293
+Introdotto con algol 60
294
+Varie regole per evitare ambiguita' in presenza di if annidati (es. `if B then C1 else C2 endif`)
295
+
296
+Case:
297
+Discendente del goto di fortran e del switch di algol 60
298
+
299
+- Molte versioni nei vari linguaggi
300
+
301
+Il case, in confronto all'if-then-else e' piu leggibile e piu efficiente se compilato bene
302
+
303
+## Iterazione
304
+
305
+iterazione e ricorsione sono due meccanismi fondamentali che permettono di ottenere formalismi di calcolo Turing completi. Senza di essi avremmo automi a stati finiti.
306
+
307
+Iterazione:
308
+
309
+- indeterminata: cicli controllati logicamente (while, repeat)
310
+- determinata: cicli controllati numericamente (for, do) con numero di ripetizioni del ciclo determinate all'inizio di esso
311
+
312
+### Iterazione indeterminata
313
+
314
+```
315
+while condizione do comando
316
+```
317
+
318
+Introdotto in Algol-W rimasto in pascal e moli altri linguaggi
319
+
320
+In pascal esiste anche la versione post-test:
321
+
322
+```
323
+repeat comando until codizione
324
+```
325
+
326
+Equivalente a `while not condizione do comando`
327
+
328
+L'iterazione e'indeterminata perche'il numero di iterazioni non e' noto a priori.
329
+L'iterazione indeterminata permette il potere espressivo di una MdT
330
+
331
+### Iterazione determinata
332
+
333
+```
334
+for indice := inizio TO fine BY passo DO
335
+...
336
+END
337
+```
338
+
339
+Non si possono modificare: _indice, inizio, fine, passo_ all'interno del loop
340
+e'determinato (al momento dell'exec del ciclo) il numero di ripetizioni del ciclo
341
+Il potere espressivo e'minore rispetto all'iterazione indeterminata: non si possono esprimere computazioni che non terminano
342
+In molti ling (es il C) il _for_ non e'un costrutto di iterazione determinata (in C il for e' un while mascherato)
343
+
344
+#### Semantica del for
345
+
346
+Supponendo passo positivo:
347
+
348
+1. valuta le espressioni inizio e fine e ``congela’’ i valori ottenuti
349
+2. inizializza I con il valore di inizio;
350
+3. se I > fine termina l’esecuzione del for altrimenti
351
+ - si esegue corpo e si incrementa I del valore di passo;
352
+ - si torna a (3).
353
+
354
+In alcuni lig se il passo e'negativo si usa una sistassi diversa: downto (Pascal), reverse (ada)
355
+Per non fare istruzioni diverse, si puo usare un IC:
356
+IC = `(fine - inizio + passo) / passo`
357
+
358
+#### Cicli controllati numericamente
359
+
360
+I vari lig differiscono nei seguenti aspetti:
361
+
362
+1. possibilita' di **modificare gli indici**
363
+2. **Numero di iterazioni** (dove avviene il controllo `indice<fine`)
364
+3. incremento **negativo**
365
+4. **valore** di indice al termine del ciclo
366
+5. possibilita di salto dall'esterno all'interno
367
+
368
+(il do in fortran permette quasi tutto, con conseguenti problemi di leggibilita')
369
+
370
+Se in un ling c'e' solo il for allora esso non e'turing completo (manca la possibilita' di fare loop infiniti)
371
+Se considerassimo solo le exec finite e' possibile usare solo il for? NO -> funz di hackerman
linguaggi/s02/assets/imgs/20260226_2026-02-26_13-27-05.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_13-27-05.png differ
linguaggi/s02/assets/imgs/20260226_2026-02-26_13-27-34.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_13-27-34.png differ
linguaggi/s02/assets/imgs/20260226_2026-02-26_13-30-25.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_13-30-25.png differ
linguaggi/s02/assets/imgs/20260226_2026-02-26_13-32-49.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_13-32-49.png differ
linguaggi/s02/assets/imgs/20260226_2026-02-26_13-34-18.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_13-34-18.png differ
linguaggi/s02/assets/imgs/20260226_2026-02-26_14-19-03.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_14-19-03.png differ
linguaggi/s02/assets/imgs/20260226_2026-02-26_14-22-03.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260226_2026-02-26_14-22-03.png differ
linguaggi/s02/assets/imgs/20260303_2026-03-03_14-16-18.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260303_2026-03-03_14-16-18.png differ
linguaggi/s02/assets/imgs/20260303_2026-03-03_14-17-40.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/20260303_2026-03-03_14-17-40.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-08-26.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-08-26.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-14-25.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-14-25.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-56-59.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-56-59.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-02-00.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-02-00.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-10-03.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-10-03.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-23-46.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-23-46.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-31-11.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-31-11.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png differ
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png
... ...
Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png differ
linguaggi/s02/controllo.md
... ...
@@ -0,0 +1,123 @@
1
+# Controllo
2
+
3
+# Controllo
4
+
5
+## Ricorsione
6
+
7
+Metodo alternativo all'iterazione.
8
+Una funz (procedura) e' ricorsiva se e'definita in termini di se stessa.
9
+
10
+```c
11
+int fatt (int n){
12
+ if (n<=1)
13
+ return 1;
14
+ else
15
+ return n* fatt(n-1);
16
+}
17
+```
18
+
19
+la definizione di una funzione ricorsiva e' analoga alla definizione induttiva di una funzione:
20
+
21
+- il valore F su un argomento e'definito in termini dei valori di F su argomenti piccoli.
22
+
23
+Nei programmi sono possibili definizioni non "corrette":
24
+
25
+```c
26
+int fie1(int n){
27
+ if (n==1) return fie1(1);
28
+}
29
+```
30
+
31
+ovvero `fie(1) = fie(1)`
32
+
33
+Nota: la ric e' possibile in qualisiasi ling che permetta:
34
+
35
+- funz (o procedure) che possono chiamare se stesse
36
+- gestione dinamica della mem (pila)
37
+
38
+### Ricorsione in coda
39
+
40
+Una chiamata di `g` in `f` si dice _chiamata in coda_ (o tail call) se `f` restituisce il val restituito da g senza ulteriore computazione.
41
+Quindi `f` e'tail recursive se contiene solo chiamate in coda:
42
+
43
+```
44
+function tail_rec (n: integer): integer
45
+begin … ; x:= tail_rec(n-1) end
46
+```
47
+
48
+Non ric in coda:
49
+
50
+```
51
+function non_tail_rec (n: integer): integer
52
+begin … ; x:= non_tail_rec(n-1); y:= g(x) end
53
+```
54
+
55
+> Nota:
56
+>
57
+> 1. **non server allocazione dinamica della mem con pila**: basta un unico RdA
58
+> 2. Piu' efficiente
59
+> 3. Possibile la generazione di codice tail-recursive usando continuation passing style
60
+
61
+##### Es. Caso del fattoriale
62
+
63
+Converto la seguente funz ric in funz ric in coda:
64
+
65
+```c
66
+int fatt(int n){
67
+ if (n<=1) return 1;
68
+ else return n* fattrc(n-1,n*res);
69
+}
70
+```
71
+
72
+Sol:
73
+
74
+```c
75
+int fattrc(int n, int res){
76
+ if (n<=1) return res;
77
+ else return fattrc(n-1,n*res);
78
+}
79
+```
80
+
81
+##### Altro es:
82
+
83
+Numeri di fibonacci
84
+Definzione induttiva:
85
+
86
+- fib(0) = 0
87
+- fib(1) = 1
88
+- fib(n) = fib(n-1) + fib(n-2)
89
+
90
+Versione con ric non in coda
91
+
92
+```c
93
+int fib(int n){
94
+ if (n==0)
95
+ return 1;
96
+ else
97
+ if(n==1)
98
+ return 1;
99
+ else
100
+ return fib(n-1) + fib(n-2);
101
+}
102
+```
103
+
104
+Complessita' lineare in tempo e spazio (O(n))
105
+
106
+Versione ric in coda:
107
+
108
+```c
109
+int fibrc(int n, int res1, int res2){
110
+ if (n==0)
111
+ return res2;
112
+ else
113
+ if(n==1)
114
+ return res2;
115
+ else
116
+ return fibrc(n-1,res2,res1+res2);
117
+}
118
+```
119
+
120
+Complessita':
121
+
122
+- in tempo lineare in n
123
+- in spazio costante (un solo RdA)
linguaggi/s02/sottoprogrammi_ed_eccezioni.md
... ...
@@ -0,0 +1,414 @@
1
+# Sottoprogrammi
2
+
3
+Un linguaggio senza parametri puo'esistere? Si (es. assembly)
4
+
5
+## Astrazione
6
+
7
+- identificare proprietà importanti di cosa si vuole descrivere
8
+- concentrarsi sulle questioni rilevanti e ignorare le altre
9
+- cosa è rilevante dipende dallo scopo del progetto
10
+
11
+Voglio asseganare a un gruppo di istruzioni un nome e fare fare a questo gruppo di istruzioni delle op su dei paramentri che passo. Il codice diventa piu astratto e piu leggibile
12
+
13
+Nota: I LP sono essi stessi astrazioni del calcolatore sottostante
14
+
15
+Astrazione sul controllo e sui dati
16
+
17
+### Astrazione sul controllo
18
+
19
+Sono per es: sottoprogrammi, blocchi, parametri
20
+
21
+```
22
+double P (int x) {
23
+ double z;
24
+ /* CORPO DELLA FUNZIONE
25
+ return expr;
26
+}
27
+```
28
+
29
+![sottoprogrammi_ed_eccezioni_2026-03-10_14-08-26](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-08-26.png)
30
+
31
+### Astrazione del controllo
32
+
33
+Fornisce astrazione funzionale al progetto:
34
+
35
+- ogni componente fornisce servizi al suo ambiente
36
+- la sua astrazione descrive il comportamente esterno
37
+- e nasconde i dettagli interni necessari a produrlo
38
+
39
+Interazione limitata al comportamento esterno
40
+
41
+Comunicazione attraverso:
42
+
43
+- parametri
44
+- ambiente globale (ma distrugge l’astrazione)
45
+
46
+### Astrazione sui dati
47
+
48
+Tipo di dato = valori e operazioni (`integer = [-maxint..maxint]` e ` {+,-,*,div,mod}`)
49
+La rappresentazione (implementazione) dei dati delle operazioni inaccessibile all’utente, perché protetta da una capsula che la isola
50
+
51
+> Nota: impossibile nel linguaggi più vecchi
52
+>
53
+> - FORTRAN, Pascal, C
54
+
55
+### Parametri
56
+
57
+Terminologia
58
+
59
+- dichiarazione/definizione `int f (int n) {return n+1}` n si dice parametro formale
60
+ ![sottoprogrammi_ed_eccezioni_2026-03-10_14-14-25](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-14-25.png)
61
+
62
+Nota: Una funz comunica con il chiamante (return)
63
+
64
+#### Modalita' di passaggio dei parametri
65
+
66
+Per valore:
67
+
68
+- il val dell'attuale e'assegnato al formale, che si comporta come una var locale
69
+- pragmatica: main -> proc
70
+- attuale qualsiasi; modifiche al formale non passano all'attuale
71
+
72
+Per riferimento:
73
+
74
+- viene passato un riferimento (indirizzo) all'attuale; i riferimenti al formale sono referimenti all'attuale (aliasing)
75
+- pragmatica: main <-> proc
76
+- attuale: variabile; modifiche al formale passano all'attuale
77
+
78
+##### Es passaggio per valore:
79
+
80
+```c
81
+void foo (int x) { x = x+1; }
82
+ …
83
+ y = 1;
84
+ foo(y+1);
85
+```
86
+
87
+dopo foo y vale comunque 1.
88
+
89
+- Il formale x è una var locale (sulla pila)
90
+- Alla chiamata, l’attuale y+1 è valutato ed il valore è assegnato al formale x
91
+- Nessun legame tra x nel corpo di foo e y nel chiamante
92
+- Al ritorno da foo, x viene distrutto (tolto dalla pila)
93
+- Non è possibile trasmettere info da foo al chiamante mediante il parametro
94
+- Costoso per dati grandi: copia
95
+- Java, Scheme, Pascal (default), C e Java (unico modo);
96
+
97
+##### Es: passaggio per riferimento
98
+
99
+```c
100
+void foo (reference int x){ x = x+1;}
101
+ …
102
+ y = 1;
103
+ foo(y);
104
+```
105
+
106
+dopo foo y vale 2.
107
+
108
+- viene passato un riferimento (indirizzo; puntatore)
109
+- Il formale x è un alias di y
110
+- L’attuale deve essere un L-valore (“una variabile”)
111
+- Al ritorno da foo, viene distrutto il (solo) legame tra x e l’indirizzo di y
112
+- Trasmissione bidirezionale tra chiamante e chiamato
113
+- Efficiente nel passaggio, ma indirezione nel corpo
114
+- Pascal (var); in C simulato passando un puntatore…
115
+
116
+### Passaggio per risultato:
117
+
118
+simile al passaggio per riferimento.
119
+
120
+```c
121
+void foo (result int x) {x = 8;}
122
+ …
123
+ y = 1;
124
+ foo(y);
125
+```
126
+
127
+- Il formale x è una var locale (sulla pila)
128
+- Al ritorno da foo, il valore di x è assegnato all’attuale y
129
+- Nessun legame tra x nel corpo di foo e y nel chiamante
130
+- Al ritorno da foo, x viene distrutto (tolto dalla pila)
131
+- Non è possibile trasmettere info dal chiamante a foo mediante il parametro
132
+- Costoso per dati grandi: copia
133
+- Ada: out
134
+
135
+### Passaggio per valore/risultato:
136
+
137
+Insieme valore+risultato.
138
+Pragmatica: main ↔ proc
139
+
140
+Esiste(-va) in Algol-W:
141
+void foo (value-result int x)
142
+{ x = x+1; }
143
+…
144
+y = 8;
145
+foo(y);
146
+qui y vale 9
147
+• Il formale x è a tutti gli effetti una var locale (sulla pila)
148
+• Alla chiamata, il valore dell’attuale è assegnato al formale
149
+• Al ritorno, il valore del formale è assegnato all’attuale
150
+• Nessun legame tra x nel corpo di foo e y nel chiamante
151
+• Al ritorno da foo, x viene distrutto (tolto dalla pila)
152
+• Costoso per dati grandi: copia
153
+• Ada: in out (ma solo per dati piccoli; per dati grandi passa riferimento)
154
+
155
+### Valore e riferimento: morale
156
+
157
+Passaggio per valore:
158
+• semantica semplice: il corpo non ha necessità di conoscere come la procedura verrà chiamata (trasparenza referenziale)
159
+• implementazione abbastanza semplice
160
+• potenzialmente costoso il passaggio; efficiente il riferimento al parametro formale
161
+• necessità di altri meccanismi per comunicare main ← proc
162
+• Passaggio per riferimento:
163
+• semantica complessa; aliasing
164
+• implementazione semplice
165
+• efficiente il passaggio; un po’ più costoso il riferimento al parametro formale (un indiretto)
166
+
167
+### Valore, e non riferimento
168
+
169
+I vantaggi del passaggio per valore:
170
+
171
+- in particolare la trasparenza referenziale suggeriscono linguaggi con passaggio solo per valore
172
+ più meccanismi separati per ottenere il passaggio per
173
+ riferimento:
174
+ puntatori in C
175
+ variabili in modello a riferimento (tipi classe) in Jav
176
+
177
+### Passaggio per nome
178
+
179
+Regole di copia:
180
+
181
+- una chiamata alla procedura P e' la stessa cosa che eseguire il corpo di P dopo aver sostituito i parametri attuali al posto dei parametri formali
182
+
183
+La macro espansione viene realizzata in modo semanticamente corretto
184
+In algol-w era il default:
185
+
186
+```algol
187
+
188
+int y;
189
+void foo (name int x) {x= x + 1; }
190
+…
191
+y = 1;
192
+foo(y);
193
+```
194
+
195
+foo esegue `y=y+1`
196
+
197
+Caso piu complicato
198
+![sottoprogrammi_ed_eccezioni_2026-03-10_14-56-59](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-56-59.png)
199
+conflitto di variabili!
200
+Le due variabili `y` e `y` rossa sono diverse. fie incrementa l'attuale (y) attraverso il formale x e crea e distrugge la nuova y rossa
201
+
202
+Soluzione:
203
+Viene passata una coppia: `<exp, amb>`
204
+• `exp` è il parametro attuale (testo, non valutato)
205
+• `amb` è l’ambiente di valutazione (in scoping statico)
206
+• Ogni volta che il formale è usato, `exp` è valutata in `amb`
207
+
208
+![sottoprogrammi_ed_eccezioni_2026-03-10_15-02-00](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-02-00.png)
209
+
210
+Altro esempio:
211
+
212
+```java
213
+void fie (int x, int y) {
214
+ x = x+1;
215
+ y = 1;}
216
+…
217
+int i = 1;
218
+int[] A = new int[5];
219
+A[1]=4;
220
+fie (i,A[i]);
221
+```
222
+
223
+![sottoprogrammi_ed_eccezioni_2026-03-10_15-10-03](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-10-03.png)
224
+Passaggio per nome
225
+il corpo della proc viene riscritto al posto della chiamata e sostituisco le var con quelle in input
226
+
227
+La i e `A[i]` sono valutate nel main (il loro amb)
228
+
229
+quand arrivo al punto A[i] (ovvero y) = 1 visto che prima i e' stato incrementato allora andro' a modificare anche la i di A[i] quindi diventa A[2] = 1
230
+
231
+```
232
+f(nome x)
233
+ y = x
234
+ y = x
235
+ y = x
236
+
237
+z = 1
238
+f(z++)
239
+```
240
+
241
+con passaggio per nome la sostituzione viene fatta ogni volta che viene trovato il param corrispondente
242
+
243
+quindi diventa:
244
+
245
+```
246
+f(nome x)
247
+ y = z++
248
+ y = z++
249
+ y = z++
250
+
251
+z = 1
252
+f(z++)
253
+```
254
+
255
+quindi y diventa 4 (o 3, in base a quando viene fatto z++)
256
+
257
+#### Implementazione passaggio per nome
258
+
259
+Come passare la coppia <exp,env>?
260
+– un puntatore al testo di exp
261
+– un puntatore di catena statica (sullo stack) al record di
262
+attivazione del blocco di chiamata
263
+
264
+cioè una chiusura (perché chiude un’espressione: elimina le sue variabili libere legandole nell’ ambiente del chiamante)
265
+
266
+Le chiusure servono a passare funzioni come argomenti ad altre
267
+procedure
268
+Parametro per nome = funzione nascosta senza argomenti che valuta il parametro nell’ambiente del chiamante (un thunk, nel gergo Algol)
269
+
270
+![sottoprogrammi_ed_eccezioni_2026-03-10_15-23-46](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-23-46.png)
271
+
272
+### Funzioni di ordine superiore
273
+
274
+Alcuni linguaggi permettono di:
275
+– passare funzioni come argomenti di procedure
276
+– restituire funzioni come risultato di procedure
277
+• Entrambi i casi: come gestire l’ambiente della funzione ?
278
+• Caso più semplice
279
+– Funzioni come argomento
280
+– Occorre un puntatore al record di attivazione all’interno della pila: passa una chiusura !
281
+• Caso più complicato
282
+– Funzione restituita da una chiamata di procedura
283
+– Occorre mantenere il record di attivazione della funzione
284
+restituita: disciplina a pila non funziona!!
285
+
286
+![sottoprogrammi_ed_eccezioni_2026-03-10_15-31-11](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-31-11.png)
287
+
288
+in scope dinamico la x dentro la f puo velere 7 (se pero si valuta lo scope di f quando viene chiamata e non quando viene passata) quindi guardo il suo ambiente quando viene chiamata non passata. Questa regola si chiama regola di shallow binding
289
+Altrimenti (nel caso in cui io valuti l'ambiente della funz quando essa viene passata e non quand o viene chiamata), ovvero alla riga `g(f)` quindi la x vale 5. Questa regola si chiama deep binding
290
+
291
+#### i funarg problems: downward
292
+
293
+Quando una procedura viene passata come parametro si crea un riferimento tra un nome (h) e una procedura (f)
294
+
295
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-20-03.png)
296
+
297
+```
298
+nt x=4; int z=0;
299
+int f (int y){
300
+return x*y;}
301
+void g ( int h(int n) ) {
302
+int x;
303
+x = 7;
304
+z = h(3) + x ;
305
+end;
306
+…
307
+{int x = 5;
308
+g(f);
309
+}
310
+```
311
+
312
+deep binding: quando nel corpo di g vado ad usare f (quando andro a chiamare f da dentro g) essa avra' delle var non locali (x) che valuto nell'ambiente che c'e al momento della chiamata della funz alla quale f e' stata passata
313
+Ricapitolando: il bind viene fatto quando g chiama f
314
+shallow binding: il bind viene valutato dentro g quando f viene eseguito
315
+
316
+![ ottoprogrammi_ed_eccezioni_2026-03-19_13-29-10](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-29-10.png)
317
+
318
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-35-52.png)
319
+
320
+#### Chiusure
321
+
322
+Passare dinamicamente sia il legame col codice della funzione, che il suo ambiente non locale,cioè una chiusura `<code, env>`
323
+Alla chiamata di una procedura passata per parametro
324
+– alloca (come sempre) il record di attivazione
325
+– prendi il puntatore di catena statica dalla chiusura
326
+
327
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-37-08.png)
328
+
329
+#### Riassumendo: parametri funzioni (e per nome)
330
+
331
+Chiusure per mantenere puntatore all’ambiente statico del corpo di una funzione
332
+
333
+Alla chiamata, il puntatore di catena statica determinato mediante la chiusura
334
+
335
+Tutti i puntatori di catena statica puntano sempre indietro nella pila
336
+– record di attivazione possono essere “saltati” per accedere a var non locali
337
+– de-allocazione dei record di attivazione secondo stretta politica a pila (lifo: last-in-first-out)
338
+
339
+### Scope dinamico: implementazione
340
+
341
+Shallow binding:
342
+– non necessita di alcuna attenzione
343
+• per accedere a x, risali la pila
344
+• uso delle strutture dati solite (A-list, CRT)
345
+
346
+Deep binding
347
+– usa necessariamente qualche forma di chiusura per “congelare” uno scope da riattivare più tardi
348
+
349
+### Deep e shallow binding con scope statico
350
+
351
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-50-43.png)
352
+
353
+#### Esercizio:
354
+
355
+![sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_13-51-17.png)
356
+
357
+#### Esercizio in classe
358
+
359
+```
360
+{void foo (int f(), int n){
361
+ int m = 10;
362
+ int fie(){ write (n,m)}
363
+ if (n==0) f();
364
+ else {m=30;
365
+ foo(fie,0);
366
+ }
367
+ }
368
+ int g(){
369
+ write(10);
370
+ }
371
+ foo(g,1);
372
+}
373
+```
374
+
375
+si dica cosa stampa in frammento con shallow e deep bindig
376
+deep binding:
377
+
378
+- n=1 e m=30
379
+
380
+shallow binding:
381
+
382
+- Es: spiegare vantaggi e svantaggi scope statico e scope dinamico
383
+ scope statico: vantaggio: maggiore chiarezza del codice (trasparenza referenziale) e la stessa funz chiamata in tempi diversi con stessi param non cambiano il risultato
384
+ svantaggi: difficile da implementare (catena)
385
+ scope dinamico: impl facile, svantaggio: progr molto meno comprensibili
386
+
387
+#### upward funarg problema
388
+
389
+Alcuni linguaggi (eg funzionali) permettono di restituire una funzione
390
+Se la funzione ha variabili locali queste devono sopravvivere indipendentemente dalla struttura a pila: hanno vita indefinitamente lunga
391
+
392
+![sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-16-59.png)
393
+
394
+![sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42](assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-19_14-18-42.png)
395
+
396
+(la pila va dall'alto verso il basso)
397
+
398
+**Morale: funzioni come risultato**
399
+• Uso delle chiusure, ma…
400
+• I record di attivazione persistono indefinitamente
401
+– perdita proprietà della pila (lifo)
402
+• Come implementare la “pila” in questo caso:
403
+– non deallocare esplicitamente
404
+– record di attivazione sullo heap
405
+– le catene statica e dinamica collegano i record
406
+– invoca il garbage collector quando necessario
407
+
408
+domande orale:
409
+quasi mai esercizi
410
+domande sui concetti del corso es per verdere se siamo in geado di esporre gli arg tecnici es
411
+cos'e un tipo di dato, cos'e una variabile, siegami in dettaglio come funz l'impl del meccanismo di deep binding con le chiusure
412
+
413
+differenza tra meccanismo di invocazione di un mentodo e chiamata di funz in un ling imperativo.
414
+i ling oop in cosa sono meglio dei ling normali (procedurali?)
linguaggi/s03/alg_dei_tipi.md
... ...
@@ -0,0 +1,145 @@
1
+---
2
+title: Algebra dei Tipi
3
+---
4
+
5
+# Sistemi dei tipi
6
+
7
+Ogni linguaggio di programmazione ha un proprio **sistema di tipi** cioe' info e regole che governano i tipi e i loro valori, chiamati abitanti (inhabitants) del tipo
8
+
9
+## Tipi base (primitivi)
10
+
11
+Sono tutti i tipi che definiscono i val denotabili del linguaggio. Es. 42, 3.14 'A' (int, float, char).
12
+Il modo in cui caratterizziamo 42 e int dipende dal ling che stiamo usando, in java si usano 4 byte per rappresentare un int (corrisponde a tutti i num interi da $-2^{32}$ a $2^{31}-1)
13
+In rust dovremmo specificare ulteriormete il tipo di intero che ci intererssa memorizzare (i32, u32)
14
+
15
+### Tipo Unit (vs Void)
16
+
17
+L'unico abitante del tipo Unit e' l'unita' singoletto (rapp anche come ()) e di solito e' associato a op il cui tipo di ritorno non e' utilizzabile (es. quando devo inviare cose, stampare qualcosa a schermo) devo avvisare che ho finito, lo faccio ritornando unit.
18
+
19
+Linguaggi come Java o C hanno un concetto simile all'unita col tipo unit, il `void` che pero' presenta differenze con unit. Non possiamo ne ottenere ne passare void (mentre con unit si). Java ha dovuto mettere un output a void (ritorna null).
20
+
21
+### Booleani
22
+
23
+Valori: solo true e false
24
+
25
+operazioni: principali operazioni logiche, come la congiunzione (&), la disgiunzione (|), la negazione (!), l'uguaglianza (==)
26
+
27
+In c originale non c'erano
28
+
29
+### Tipi di caratteri
30
+
31
+valori: insieme di codici di caratteri (es. ascii, unicode)
32
+operazioni: =, ><
33
+
34
+### Tipi Interi
35
+
36
+val: sottoinsieme finito di numeri interi, fissato al momento della definizione del linguaggio
37
+
38
+operazioni:
39
+
40
+### Reali
41
+
42
+valori: un sottoinsime finito tra i num reali, tramite rappresentazione a virgola mobile e fissa
43
+
44
+- i num a virgola fissa riservano bit specifici per gli interi e decimali. A virgola mobile no.
45
+
46
+### Enumeration types
47
+
48
+Un tipo di enumerazione consiste in un iniseme finito di costanti, ciascuna caratterizzata da yn proprio nome. C, rust, java forniscono la stessa sintassi ad es:
49
+
50
+```c
51
+enum rogueOne {Jean, Cassian, A, B, C }
52
+```
53
+
54
+introducono un nuovo tipo chiamato rogueOne costituito da un insieme di 5 elementi, ciascuno con un proprio nome.Le operazioni disponibili sugli enum consistono in
55
+confronti e in un meccanismo per ottenere tutti i valori o passare da uno all'altro. Da un punto
56
+di vista pragmatico, gli enum presentano due vantaggi: 1) aiutano la leggibilità, poiché i nomi dei
57
+valori costituiscono una chiara forma di auto-documentazione del programma e 2) permettono
58
+al controllo di tipo di verificare che una variabile con enumerazione assuma solo i valori corretti.
59
+
60
+Non tutti i linguaggi integrano gli enum in modo sicuro, ad esempio in C la scrittura sopra
61
+è uno zucchero sintattico per
62
+
63
+```c
64
+typedef int RogueOne; const RogueOne Jyn=0, Cassian=1, .....;
65
+```
66
+
67
+che equipara gli interi ai RogueOne e impedisce di distinguerli (e di verificarne la correttezza).
68
+
69
+### Extensional vs Intensional types
70
+
71
+Gli interi (e i float, i chars, ...) rispetto agli enum hanno una differenza importante: l'utente specifica gli enum in modo estensionale, cioè elencando tutti i possibili abitanti di quel tipo. Al contrario, i linguaggi specificano gli interi, i float e così via in modo intensionale, cioè mediante predicati che definiscono la loro appartenenza ad alcuni domini di valori possibili (ad esempio, numeri interi a 32 bit, numeri in virgola mobile, caratteri UNICODE).
72
+
73
+Si usano sistemi intesionali quando si dispone di un insieme definito di prop che indentificanop solo gli abitanti (val validi) del tipo che sto definendo (vantaggio: risparmio di mem)
74
+
75
+Estensionale quando e'piu efficiente (per spazio e computazione) specificare gli a bitanti del tipo o non esiste un iniseme chiaro di regole che li definiscono
76
+
77
+## Tipi composti
78
+
79
+Gli enum sono kinds (possono creare tipi) mentre i tipi sono es arrayInt, int, char. Gli enum devono essere istanziati per diventare tipi.
80
+Possiamo creare nuovi tipi componendo quelli di base.
81
+Nelle enumerazioni di C, abbiamo creato insiemi di elementi denominati, che corrispondono a numeri interi, ma sono possibili altre strutture, tra cui le più basilari sono: array, insiemi e puntatori.
82
+
83
+### Array
84
+
85
+Anche gli array sono kinds (non esiste il tipo array ma esiste il tipo array di interi, float ecc). Un array denota un insieme di elementi di un certo tipo, ciascuno indicizzato da almeno una ** chiave identificativa** di uyn certo tipo (quando si usano 2 o piu chaivi si parla di array multidimensionali).
86
+La nozione piu comune di array assume chiavi come num interi non negativi all'interno di un intervallo [0-n] per n+1 elementi. Altri tipi di array (mappe) permettono di creare **array associativi**, permenttono all' utente di fissare sia il tipo delle chiavi che quello degli elementi.
87
+
88
+**tabella sintassi dichiarazione int in C, java e rust**
89
+int x[3] int[] x let x: [i32;3]
90
+x[0] = 0 // posso farlo solo in c, in java devo prima istanziarlo
91
+int x[3] = {0,0,0} x = new int[3] x = [0,0,0]
92
+
93
+Sia il C che Rust fissano nella dichiarazione del tipo la dimensione dell'array (3), mentre Java astrae da questo e lascia che sia l'inizializzazione a definire la dimensione dell'array (ne parleremo in seguito).
94
+La maggior parte dei linguaggi (tra cui C, Java e Rust) estendono le dichiarazioni di array lineari a quelle a più chiavi
95
+int x[10][10] int[][] x let x: [[i32;10];10]
96
+
97
+In C posso fare il lookup di una val di una cella di un array che ho appena creato ma a cui non ho ancora associato un val (leggo celle di memoria scritte da chissa' chi, possono contenere info sensibili)
98
+L'op piu semplice da fare su un arrau e' la selezione di un elem tramite il suo indice. La notazione e' `a[e]` dove `a` e' la var di tipo array e `e` e' l'espressione. Per array multidimensionali sono `a[e][e][e]` o `a[e,e,e]` (per ling che hanno sia array multidimensionali che array di array). Altre op (su array di interi) sono: assegnazione (=), confronti (==, <,>) e le op aritmetiche
99
+Poiché conoscono il tipo di indice degli array, i linguaggi safe verificano che ogni accesso a un elemento dell'array avvenga davvero entro i suoi “limiti” (si fa solo a runtime).
100
+
101
+Un array viene solitamente memorizzato in una porzione contigua di memoria. Per un array monodimensionale, l'allocazione segue l'ordine degli indici. Per gli array multidimensionali, esistono principalmente due tecniche, chiamate ordine di riga (row major) e ordine di colonna (column major).
102
+![alg_dei_tipi_2026-03-31_14-57-02](assets/imgs/alg_dei_tipi_2026-03-31_14-57-02.png)
103
+![alg_dei_tipi_2026-03-31_14-57-13](assets/imgs/alg_dei_tipi_2026-03-31_14-57-13.png)
104
+Nell'ordine di riga, due elementi sono contigui se differiscono di uno nell'ultimo indice. Nell'ordine per colonna, due elementi sono contigui se differiscono di uno nel primo indice. L'ordine di riga è un po' più comune di quello per colonna, soprattutto perché gli accessi per riga sono più frequenti di quelli per colonna. In generale, il principio di località del caricamento in funzione dei cache-miss favorisce gli algoritmi che esplorano gli array per righe con ordine di riga e viceversa per l’ordine di colonna.
105
+
106
+#### Dimensione array
107
+
108
+Il numero di dimensioni e i loro intervalli determinano la forma di un array. Un aspetto importante della definizione di un linguaggio è decidere se e quando fissare la forma degli array. Se la forma è fissa, possiamo decidere di definirla in fase di compilazione (per i linguaggi compilati, come in C e Rust) o quando elaboriamo la dichiarazione (a tempo di esecuzione). In alternativa, possiamo avere array dinamici, la cui forma è determinata e cambia in fase di esecuzione (come in Java).
109
+![alg_dei_tipi_2026-03-31_15-01-09](assets/imgs/alg_dei_tipi_2026-03-31_15-01-09.png)
110
+
111
+In un array statico conosciamo la dimensione necessaria per memorizzare l'array (l'offset tra il primo e l'ultimo elemento dell'array), quindi l'accesso a un elemento dell'array è simile all'accesso a variabili di tipo scalare (salvo alcuni calcoli necessari, ad esempio, quando si accede ad array multidimensionali).
112
+![alg_dei_tipi_2026-03-31_15-05-46](assets/imgs/alg_dei_tipi_2026-03-31_15-05-46.png)
113
+Se decidiamo di definire l'array quando elaboriamo la sua dichiarazione, conosceremo la sua forma (fissa) nel momento in cui il controllo raggiunge la dichiarazione dell'array. Un esempio di questo tipo è se la dimensione dipende dal valore di una variabile. Possiamo allocare l'array nello stack frame del blocco che ne contiene la definizione. Tuttavia, poiché conosciamo la dimensione dell'array solo quando carichiamo il frame, non possiamo preallocare in modo sicuro lo spazio nello stack: una stima errata sprecherebbe memoria o si sovrapporrebbe ad altre variabili statiche. Per ovviare a questo problema, si utilizza l'heap e si memorizza nel frame il puntatore all'inizio della regione di memoria. Il descrittore di tale array prende il nome di dope vector, utilizzato anche nel caso di array dinamici (con alcuni elementi aggiuntivi nel dope vector per tenere traccia del suo stato).
114
+
115
+Lo stack frame ha molte piu cose (devo tenere conto di una var dimensione ecc)
116
+
117
+### Tipi insieme
118
+
119
+Struttura di dati senza ordine con valori unici dello stesso tipo.
120
+
121
+Le operazioni possibili sugli insiemi includono il **test di inclusione** e le operazioni di manipolazione degli insiemi: **unione, intersezione, differenza e complemento**.
122
+
123
+L'estrazione e' un op strana perche' sono liste senza ordine quindi devo pescare a caso i val. Il caso in informatica non esiste quindi chi ha il seed dell'estrazione sa predire l'estrazione successiva.
124
+
125
+#### Rappresentazione in memoria di un insieme
126
+
127
+Un modo efficiente per rappresentare un insieme è un array di bit di lunghezza pari alla cardinalità del tipo di base (es set di elementi da 0 a 7, cardinalita' 8). Questo array è chiamato **array caratteristico** e, in esso, il bit -esimo indica se l’elemento -esimo del tipo base (dato un ordinamento standard) appartiene all'insieme. Questa rappresentazione permette di eseguire in modo efficiente le operazioni sugli insiemi (operazioni bit-a-bit sulla macchina fisica), ma non è adatta a grandi sottoinsiemi di tipi base. Per ovviare a questo problema, i linguaggi spesso limitano i tipi che si possono usare come tipi base di un insieme oppure scelgono rappresentazioni alternative, ad esempio tramite tabelle hash, bilanciando velocità e occupazione di memoria (perche' se ho un ash come tipo base ho campi molto grandi ma facili da trovare)
128
+
129
+Esempio array caratteristico:
130
+Immagina che il tuo tipo base siano i numeri da 0 a 7 (cardinalità = 8). Il linguaggio crea un array di 8 bit.
131
+Se il tuo insieme è {1, 4, 5}, l'array sarà:
132
+Valore (Indice i) 0 1 2 3 4 5 6 7
133
+Bit (1=Presente, 0=Assente) 0 1 0 0 0 0
134
+
135
+Fare l'unione o l'intersezione tra due insiemi diventa una semplice operazione bit-a-bit (OR, AND) a livello di processore. È istantaneo.
136
+I l limite? Se il tipo base fosse "Tutti i numeri interi a 32 bit". L'array dovrebbe avere 2^{32} bit (circa 512 Megabyte di memoria) per un singolo insieme, anche se contiene solo tre numeri! Uno spreco enorme.
137
+
138
+Esempio con tabelle Hash (Il workaround moderno)
139
+
140
+Quando il tipo base è grande (come stringhe, o numeri interi generici), i linguaggi moderni (come Python, Java, C#) abbandonano l'array di bit e usano le Tabelle Hash.
141
+
142
+Una piccola correzione al tuo ultimo appunto: Non è che hai un "hash come tipo base", ma usi una Tabella Hash come struttura dati sottostante.
143
+In pratica, passi il tuo valore (es. la stringa "Ciao") a una funzione di hash, che lo trasforma in un numero. Quel numero diventa l'indirizzo di memoria dove salvare il dato.
144
+
145
+ Il compromesso: Occupa un po' più di memoria rispetto all'array di bit puro ed è impercettibilmente più lenta nelle operazioni logiche, ma risolve il problema dello spreco di spazio, permettendoti di creare insiemi di qualsiasi tipo di dato senza far esplodere la RAM.
linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_14-57-02.png
... ...
Binary files /dev/null and b/linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_14-57-02.png differ
linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_14-57-13.png
... ...
Binary files /dev/null and b/linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_14-57-13.png differ
linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_15-01-09.png
... ...
Binary files /dev/null and b/linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_15-01-09.png differ
linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_15-05-46.png
... ...
Binary files /dev/null and b/linguaggi/s03/assets/imgs/alg_dei_tipi_2026-03-31_15-05-46.png differ
linguaggi/s03/introducton-to-types.md
... ...
@@ -0,0 +1,62 @@
1
+---
2
+title: Introduzione ai Tipi
3
+---
4
+
5
+# Introduzione ai Tipi
6
+
7
+Una definizione plausibile di sistema di tipi in informatica è:
8
+
9
+```
10
+Un metodo sintattico praticabile per dimostrare
11
+l'assenza di determinati comportamenti del
12
+programma, fatto classificando le unità sintattiche in
13
+base ai tipi di valore che assumono.
14
+```
15
+
16
+### Type-checking
17
+
18
+Il vantaggio più famoso dei tipi è il type-checking, cioè la possibilità di usare i tipi per rilevare errori di programmazione.
19
+
20
+Il type-checking e' una specie di dim di un teorema. Prende le dichiarazioni dei tipi come def di teoremi o regole su quello che succede nel programma. Controllando ogni passaggio del programma (staticamente) se non ho errori la prova ha avuto successo, altrimenti errore.
21
+
22
+### Safety
23
+
24
+la “safety” si riferisce alla capacità di un linguaggio di garantire l'integrità delle sue astrazioni (ovvero effettua i controlli sulle sue astrazioni). I linguaggi “safe” sono anche detti a tipizzazione forte o strongly typed (e quelli non sicuri a tipizzazione debole o weakly typed).
25
+
26
+Un ling strongly typed significa che le astrazioni sono garantite da linguaggio
27
+Il c e' weakly typed es. negli array posso accedere a pos che non fanno parte degli array (es accedo alla pos 5 di un array di 4 elem)
28
+In java (strongly typed) ha controllo su enum e controllo su array (out of bound exception)
29
+typescript e' strongly typed
30
+Un ling strongly typed ti impedisce di fare cose, uno weakly typed no (meno)
31
+
32
+I tipi possono contribuire a migliorare l'efficienza dei programmi. Nei linguaggi safe, i tipi aiutano a migliorare l'efficienza eliminando molti dei controlli dinamici per garantire la sicurezza. I moderni compilatori ad alte prestazioni si basano molto sulle informazioni raccolte dal type-checker per ottimizzare la generazione del codice.
33
+
34
+Nota: in java un bool occupa 2 byte (colpa della jvm)
35
+
36
+## Dynamic vs Static Typing
37
+
38
+Un ling e' tipato **staticamente** se possiamo controllare i tipi sul testo del programma, senza doverlo eseguire (es. in fase di compilazione). Il compilatore puo' eliminare le annotazioni di tipo (e i relativi controlli) dal codice generato (perche' tanto sono giusti e quindi non devono essere controllati a runtime).
39
+
40
+Si parla di linguaggi tipati **dinamicamente** quando il controllo dei tipi avviene durante l'esecuzione del programma. In particolare, il controllo dinamico dei tipi richiede che ogni valore abbia un descrittore di esecuzione che ne specifichi il tipo e che, a ogni operazione, il runtime verifichi che il programma esegua operazioni solo su operandi del tipo corretto.
41
+
42
+## Manifest vs Inferred typing
43
+
44
+La tipizzazione statica o dinamica riguarda il momento in cui un ling (interpretato o compilato) esegue il controllo dei tipi. Il tipaggio manifesto o inferito determina la quantita' di informazioni sui tipi che il programma deve inserire nei suoi programmi.
45
+Un linguaggio con **manifest typing** richiede che il programma annoti tutti i tipi di variabili e operazioni. Un linguaggio con inferred typing non ha bisogno di annotazioni, in quanto dispone di algoritmi che deducono i tipi dal contesto.
46
+
47
+Il **tipaggio manifesto e inferito sono uno spettro** determinato da fattori ergonomici e algoritmici. Ad esempio,leggendo il programma x=5 noi (come programmatori) possiamo dedurre che il tipo di x potrebbe essere intero. il bilanciamento tra tipi manifesti e tipi inferiti non è una decisione netta e riguarda il bilanciamento tra supporto/impegno che un linguaggio offre/richiede ai programmatori.
48
+
49
+## Dynamic vs Static Typing
50
+
51
+I linguaggi a tipaggio dinamico non sono per forza interpretati.
52
+Quindi, la richiesta di scegliere tra un linguaggio a tipaggio dinamico e uno a tipaggio statico non riguarda la quantità di informazioni che i programmatori devono fornire sui tipi (manifesti o inferiti) o se i programmi sono interpretati o compilati (implementazione). Invece, i fattori principali che possono orientare la scelta tra i due approcci sono la correttezza, le prestazioni e l'espressività del programma.
53
+
54
+Il tipaggio statico significa trovare gli errori prima di eseguire il programma. Questo elimina la necessità di annotare i termini e di eseguire controlli a tempo di esecuzione e permette alcune ottimizzazioni, aumentando le prestazioni. Tuttavia, i linguaggi a tipaggio statico hanno un “difetto” comune: a seconda dell'espressività dei tipi e dell'accuratezza dell'algoritmo di type-checking, possono rifiutare programmi che verrebbero eseguiti correttamente (ad esempio, il codice sulla destra). Ciò è dovuto all'indecidibilità dei programmi (terminazione), che rende impossibile sapere quali rami verranno eseguiti o meno e costringe il type- checking a considerare tutti i possibili stati di calcolo.
55
+
56
+```
57
+int x
58
+if(e) x=“A”
59
+else x = 5
60
+```
61
+
62
+se `e` e' falsa, questo codice verrebbe eseguito correttamente ma il controllo statico boccia questa implementazione.
sistemi/s02/20260225.md
... ...
@@ -0,0 +1,411 @@
1
+# Architettura dei sistemi Operativi
2
+
3
+descrive quali sono le varie componenti del so e come queste sono collegate tra loro
4
+
5
+L'architettura dei so da diversi punti di vista
6
+
7
+- servizi forniti (visione utente non tanto la persona quanto i programmi)
8
+- interfaccia di sistema (visione programmatore)
9
+- componenti di sistema (visione progettista so)
10
+
11
+## Componenti di un sistema operativo
12
+
13
+ Gestione dei processi
14
+ Gestione della memoria principale: ram o mem interna processore
15
+ Gestione della memoria secondaria: dischi
16
+ Gestione file system: stato che si colloca al disopra della mem secondaria e ci permette di vedere le cose nella mem secondaria
17
+ Gestione dei dispositivi di I/O
18
+ Supporto multiuser: moduli all'interno del so che creano l'astrazione multiutente (sono info di corredo che vengono aggiunte per creare multiutenti)
19
+ Networking
20
+ Inter Process Communication (IPC)
21
+
22
+### Gestione processi
23
+
24
+- un processo e' un programma in esecuzione (l'attivita di un programma in esecuzione).
25
+- il sistema operativo e' responsabile delle seguenti attivita'
26
+ - creazione e terminazione dei processi
27
+ - sospensione e riattivazione dei processi
28
+ - gestione deadlock
29
+ - comunicazione tra processi
30
+ - sincronizzazione tra processi
31
+
32
+### Memoria Principale
33
+
34
+- e' un array di byte indirizzabili singolarmente
35
+- ci sono istruzioni per accedere a un singolo byte o di piu fino al (non ho capito) es. un processore da x64 puo accedere a 1-16-64 byte in blocchi
36
+- è un deposito di dati facilmente accessibile alla CPU (econdiviso con i controller dei dispositivi di I/O se DMA)
37
+
38
+il sistema operativo e' responsabile delle seguenti attivita:
39
+
40
+- tenere traccia di quali parti della mem sono usate da chi
41
+- decidere quali processi caricare quando diventa disponibile spazio in mem
42
+- allocare e deallocare lo spazio di memoria quando necessario
43
+- usare mem secondaria per ampliare la mem principale (vitual memory, swap) se una pagina non viene usata da un po viene messa in mem secondaria
44
+
45
+### Memoria Secondaria
46
+
47
+Poiché la memoria principale è volatile e troppo piccola per
48
+contenere tutti i dati e tutti i programmi in modo
49
+permanente, un computer è dotato di memoria secondaria
50
+ In generale, la memoria secondaria è data da hard disk,
51
+dischi ottici, dischi allo stato solido, etc.
52
+Si accede a blocchi (nella mem primaria si accede a byte)
53
+
54
+Il sistema operativo e' responsabile delle seguenti attivita riguardanti la gestione della memoria secondaria:
55
+
56
+- gestione partizionamento
57
+- gestione dell'accesso efficiente e affidabile (RAID) Nota: raid viene usato per velocita'. Si usa per sparpagliare i dati su vari dischi cosi da ridurre il tempo di ritardo medio delle richieste. Facendo raid semplice si va piu veloci come performance ma si ottiene un sistema piu fragile i dischi si rompono prima
58
+- ordinamento efficiente delle richieste (disk scheduling)
59
+
60
+### Gestione dell'I/O
61
+
62
+Un interfaccia per la gestione dei device driver
63
+Un insieme di driver per dispositivi hw specifici
64
+Un sistema di gestione buffer per il caching delle informazioni
65
+
66
+Per ogni op di io un dirver va in funzione due volte (alla fine dell'op di io quando deve essere inviato l'interrrupt e per la richiesta )
67
+
68
+### Gestione del file system
69
+
70
+Un file e' l'astrazione informatica di un archivio di dati
71
+(il concetto di file e' indipendente dal media sul quale viene memorizzato)
72
+Un file system e' composto da un insieme di file
73
+un fs e' anche quello contenuto in una chiavetta (quando si fa mount viene visto il file system della chiavetta)
74
+Il sistema operativo e' responsabile delle seguenti attivita':
75
+
76
+- creazione e cancellazione file
77
+- creazione e cancellazione di directory
78
+- manipolazione di file e directory
79
+- codifica dei file system su una sequenza di blocchi
80
+
81
+### Supporto multiuser - protezione
82
+
83
+Il termine protezione si riferisce al meccanismo per controllare gli accessi dei processi alle risorse del sistema e degli utenti
84
+Il meccanismo di protezione sw deve:
85
+
86
+- gestire l'identita' del proprietario del processo (uid gid)
87
+- gestire chi può fare cosa (per ogni utente per ogni risorsa memorizzare cosa puo’ essere fatto e cosa no)
88
+- Fornire un meccanismo di attuazione della protezione
89
+
90
+### Networking
91
+
92
+- consente
93
+ - di fare comunicare processi in esecuzione su piu elaboratori
94
+ - di condividere risorse
95
+- quali servizi
96
+ - protocolli di comunicazione a basso livello
97
+ - ip
98
+ - tcp,udp
99
+- servizi di comunicazione ad alto livello
100
+ - file system distribuiti (nfs,smb)
101
+
102
+## Architettura dei sistemi operativi - struttura del programma sistema operativo
103
+
104
+### Sommario
105
+
106
+ Sistemi con struttura semplice
107
+ Sistemi con struttura a strati
108
+ Microkernel
109
+ Macchine virtuali
110
+ Progettazione di un sistema operativo
111
+
112
+Ora vediamo come le componenti del so sono collegate tra loro
113
+
114
+progettazione di un so:
115
+sistemi molto efficienti sono poco modulari
116
+ sistemi molto modulari sono meno efficienti
117
+
118
+### Struttura dei so
119
+
120
+Divisi in due grandi famiglie
121
+
122
+- struttra semplice
123
+- struttura a strati
124
+
125
+Sistemi a struttura semplice (o senza struttura)
126
+
127
+- in alcuni casi sono so che non hanno struttura progettata a priori
128
+- possono essere descritti come una collezione di procedure, ognuna delle quali puo chiamaer altre procedure
129
+- tipicamente sono so semplici e limitati
130
+
131
+MS-DOS Free-DOS
132
+![20260225_2026-02-25_11-59-43](assets/imgs/20260225_2026-02-25_11-59-43.png)
133
+
134
+MS-DOS
135
+
136
+- Commenti
137
+  le interfacce e i livelli di funzionalità non sono ben separati
138
+  le applicazioni possono accedere direttamente alle routine
139
+ di base per fare I/O
140
+  come conseguenza, un programma sbagliato (o "maligno")
141
+ può mandare in crash l'intero sistema
142
+- Motivazioni:
143
+  i progettisti di MS-DOS erano legati all'hardware dell'epoca
144
+  8086, 8088, 80286 non avevano la modalità protetta (kernel)
145
+
146
+nessun controllo di accessi in memoria (l'uso piu comune sel tsr era quello di inserire dei virus, lol)
147
+I giochi cercavano di bypassare il so e accedere direttamente alle risorse (es gpu)
148
+Un errore del programma (visto che non cerano controllo di accessi in memoria) poteva causare il crash del sistema
149
+
150
+UNIX
151
+Le prime versioni facevano un po cagare
152
+diviso in due parti (kernel e programmi di sistema)
153
+Il kernel e' delimitato:
154
+
155
+- in basso dall'hw
156
+- in alto dal livello delle system call
157
+
158
+Motivazioni
159
+
160
+- anche Unix inizialmente fu limitato dalle limitazioni
161
+ hardware...
162
+- ... ma ha un approccio comunque più strutturato
163
+
164
+![20260225_2026-02-25_12-06-05](assets/imgs/20260225_2026-02-25_12-06-05.png)
165
+
166
+### Sistemi con struttura dati a strati
167
+
168
+Il so e' strutturato tramite un insieme di strati (layer)
169
+
170
+Ogni strato:
171
+e' basato sugli strati inferiori
172
+offre servizi agli strati superiori
173
+
174
+Motivazioni:
175
+il vantaggio principale e'la modularita:
176
+
177
+- encapsulation e data hiding
178
+- abstract data types
179
+ Vengono semplificate le frasi di implementazione, debugging e ristrutturazione del sistema
180
+
181
+![20260225_2026-02-25_12-10-35](assets/imgs/20260225_2026-02-25_12-10-35.png)
182
+Esempi:
183
+
184
+The O.S. (Dijkstra) 5) Programmi utente 4) Gestione I/O 3) Console device/driver 2) Memory management
185
+
186
+1. CPU Scheduling
187
+2. Hardware
188
+
189
+Venus os 6) Programmi utente 5) Device driver e scheduler 4) Memoria virtuale 3) Canali di I/O 2) CPU Scheduling
190
+
191
+1. Interprete di istruzioni
192
+2. Hardware
193
+
194
+Problema dei sistemi con struttura a strati
195
+
196
+- tendono a essere meno efficienti (ogni stato tende ad aggiungere overhead)
197
+- occorre studiare accuratamente la struttura dei layer
198
+ - le funzionalita previste al layer N devono essere implementate utilizzando esclusivamente i servizi dei livelli inferiori
199
+- in alcuni casi questa limitazione puo essere difficile da superare
200
+- esempio: meccanismi di swapping di memoria
201
+ - Win: swap area è un file in memoria
202
+ - Linux: swap area ha una partizione dedicata
203
+
204
+risultato: si tende a trovare un compromesso tra i due mondi
205
+
206
+OS/2
207
+![20260225_2026-02-25_12-16-13](assets/imgs/20260225_2026-02-25_12-16-13.png)
208
+Nota: scrivi due righe su window subsystem for linux
209
+Computer HW/SW architecture (Myers)
210
+Grafico di myers
211
+ISA e'il codice macchina per fare le op macchina (instruction set architucture)
212
+Alla fine l'hw e' linguaggio
213
+![20260225_2026-02-25_12-16-42](assets/imgs/20260225_2026-02-25_12-16-42.png)
214
+
215
+### politiche e meccanismi
216
+
217
+Separazione della politica dai meccanismi
218
+
219
+- la politica decide cosa deve essere fatto
220
+- i meccanismi attuano la decisione
221
+
222
+E un concetto fondamentale di software engineering
223
+
224
+- la componente che prende le decisioni politiche puo essere completamente diversa da quella che implementa i meccanismi
225
+- rende possibile
226
+ - cambiare la politica senza cambiare i meccanismi
227
+ - cambiare i meccanismi senza cambiare la politica
228
+
229
+Nei sistemi a microkernel (si chiamano cosi perche cercano di fare fare meno cose al kernel) si implememntano nei kernel
230
+
231
+Esempio: MINIX
232
+
233
+- il gestore della memoria è un processo esterno al kernel decide la memoria da allocare ai processi ma non accede direttamente alla memoria del sistema può accedere però alla propria memoria (è un processo come tutti gli altri)
234
+- quando deve attuare delle operazioni per implementare la politica decisa lo fa tramite chiamate specifiche al kernel (system task)
235
+
236
+Controesempio: MacOS <=9 (non Mac OS X)
237
+
238
+- in questo sistema operativo, politica e meccanismi di gestione dell'interfaccia grafica sono stati inseriti nel kernel
239
+- svantaggi: - un bug nell'interfaccia grafica puo mandare in crash lintero sistema
240
+ Windows 9x non e'differente
241
+
242
+### Organizzazione del kernel
243
+
244
+Esistno 3 categorie principali di kernel
245
+
246
+Kernel Monolitici
247
+
248
+- Un aggregato unico (e ricco) di procedure di gestione
249
+ mutuamente coordinate e astrazioni dell’HW
250
+
251
+Micro Kernel
252
+
253
+- Semplici astrazioni dell’HW gestite e coordinate da un kernel
254
+ minimale, basate un paradigma client/server, e primitive di
255
+ message passing
256
+
257
+Kernel Ibridi
258
+
259
+- Simili a Micro Kernel, ma hanno componenti eseguite in kernel
260
+ space per questioni di maggiore efficienza
261
+
262
+(+ ExoKernel, AnyKernel)
263
+
264
+### Organizzazione del kernel
265
+
266
+Kernel Monolitici
267
+
268
+- Un insieme completo e unico di procedure mutuamente correlate e coordinate
269
+ System calls
270
+ Implementano servizi forniti dal kernel, tipicamente realizzati in moduli eseguiti in kernel mode
271
+
272
+Esiste modularità, anche se l’integrazione del codice, e il fatto che tutti i moduli sono eseguiti nello stesso spazio, è tale da rendere tutto l’insieme un corpo unico in esecuzione
273
+
274
+### Organizzazione del kernel
275
+
276
+Kernel Monolitici:
277
+
278
+Efficienza
279
+
280
+- L’alto grado di coordinamento e integrazione delle routine
281
+ permette di raggiungere ottimi livelli di efficienza
282
+
283
+Modularità
284
+
285
+- I più recenti kernel monolitici (Es. LINUX) permettono di effettuare il caricamento (load) di moduli eseguibili a runtime
286
+- Possibile estendere le potenzialità del kernel, solo su richiesta
287
+- Esempi di Kernel monolitici: LINUX, FreeBSD UNIX
288
+
289
+### Microkernel o sistemi client/server
290
+
291
+problema: i kernel continuano a crescere in complessita
292
+idea: rimuover dal kernel tutte le parti non essenziali e implementarle come processo a livello utente
293
+Esempio: per accedere a un file un processo interagisce con il processo gestore del file system
294
+Un kernel perfetto avrebbe solo 2 system calls (send e recieve)
295
+Es: AIX, BeOS, L4, Mach, Minix, MorphOS, QNX, RadiOS, VSTa
296
+cosa si perde? efficienza (tante richieste)
297
+
298
+**Quali funzionalità deve offrire un microkernel?**
299
+
300
+- funzionalità minime di gestione dei processi e della memoria
301
+- meccanismi di comunicazione per permettere ai processi clienti di chiedere servizi ai processi serventi
302
+
303
+**La comunicazione è basata su message passing**
304
+il microkernel si occupa di smistare i messaggi fra i vari processi
305
+
306
+Quelli di gnu volevano fare un microkernel, avevano fatto tutto il sistema ma mancava il kernel. Linus riusci per opportunita e tempo a batterli
307
+
308
+**System call di un s.o. basato su microkernel**
309
+Tramite queste due system call, è possibile implementare l'API standard di gran parte dei sistemi operativi
310
+
311
+```c
312
+int open(char* file, ...)
313
+{
314
+msg = < OPEN, file, ... >;
315
+send(msg, file-server);
316
+fd = receive(file-server);
317
+return fd;
318
+}
319
+```
320
+
321
+Vantaggi
322
+
323
+- il kernel risultante è molto semplice e facile da realizzare
324
+- il kernel è più espandibile e modificabile
325
+ - per aggiungere un servizio: si aggiunge un processo a livello utente, senza dover ricompilare il kernel
326
+ - per modificare un servizio: si riscrive solo il codice del servizio stesso
327
+- il s.o. è più robusto
328
+ - se per esempio il processo che si occupa di un servizio cade, il resto del sistema può continuare ad eseguire
329
+- sicurezza
330
+ - è possibile assegnare al microkernel e ai processi di sistema livelli di sicurezza diversi
331
+- adattabilità del modello ai sistemi distribuiti
332
+ - la comunicazione può avvenire tra processi nello stesso sistema o tra macchine differenti
333
+
334
+Minix: Il kernel
335
+è dato dal gestore dei processi e dai task
336
+i task sono thread del kernel
337
+![20260225_2026-02-25_12-51-04](assets/imgs/20260225_2026-02-25_12-51-04.png)
338
+
339
+### Confronto tra kernel monolitici e microkernel
340
+
341
+- Monolitico
342
+ - Considerato obsoleto nel 1990...
343
+ - È meno complesso gestire il codice di controllo in un’unica area di indirizzamento (kernel space)
344
+ - È più semplice realizzare la sua progettazione (corretta)
345
+- Micro Kernel
346
+ - Più usato in contesti dove non si ammettono failure
347
+ - Es. QNX usato per braccio robot Space shuttle
348
+ - N.B. Flamewar tra L. Torwalds e A. Tanembaum riguardo alla soluzione migliore tra Monolitico e Micro Kernel https://en.wikipedia.org/wiki/Tanenbaum%E2%80%93Torvalds_debate
349
+
350
+### Kernel Ibridi
351
+
352
+Kernel Ibridi (Micro kernel modificati)
353
+
354
+- Si tratta di micro kernel che mantengono una parte di codice in “kernel space” per ragioni di maggiore efficienza di esecuzione
355
+- ...e adottano message passing tra i moduli in user space
356
+ N.B.
357
+- i kernel Ibridi non sono da confondere con Kernel monolitici in grado di effettuare il caricamento (load) di moduli dopo la fase di boot.
358
+
359
+### Windows NT e derivati
360
+
361
+Windows NT è dotato di diverse API
362
+
363
+- Win32, OS/2, Posix
364
+ Le funzionalità delle diverse API sono implementate tramite processi server
365
+ ![20260225_2026-02-25_12-55-35](assets/imgs/20260225_2026-02-25_12-55-35.png)
366
+
367
+### ExoKernel (kernel di sistemi operativi a struttura verticale)
368
+
369
+Approccio radicalmente modificato per implementare O.S.
370
+Motivazioni
371
+
372
+- Il progettista dell’applicazione ha tutti gli elementi di controllo per decisioni riguardo alle prestazioni dell’HW
373
+- Dispone di Libreria di interfacce connesse all’ExoKernel
374
+- Es. User vuole allocare area di memoria X o settore disco Y
375
+
376
+Limiti
377
+
378
+- Tipicamente non vanno oltre l’implementazione dei servizi di protezione e multiplazione delle risorse
379
+- Non forniscono astrazione concreta del sistema HW
380
+
381
+### AnyKernel
382
+
383
+Driver in user space
384
+
385
+- I driver possono essere caricati in user space
386
+- Rapido/sicuro sviluppo di driver
387
+- Il concetto può essere esteso a file system e stack di rete
388
+
389
+### Macchine virtuali
390
+
391
+E' un approccio diverso al multitasking
392
+
393
+- invece di creare l'illusione di molteplici processi che posseggono la propria CPU e la propria mememoria...
394
+- si crea l'astrazione di un macchina virtuale
395
+ Le macchine virtuali
396
+- emulano il funzionamento dell'hardware
397
+- è possibile eseguire qualsiasi sistema operativo sopra di esse
398
+ ![20260225_2026-02-25_12-58-43](assets/imgs/20260225_2026-02-25_12-58-43.png)
399
+
400
+Vantaggi:
401
+
402
+- consentono di far coesistere so differenti
403
+- possono fare funzionare so monotask in un sistema multitask e sicuro (es. linux in macos o windows e viceversa)
404
+
405
+Svantaggi:
406
+
407
+- soluzioni inefficienti
408
+- istruzioni hw di virtualizzazione (istruzioni VMX)
409
+- difficile condividere risorse
410
+
411
+es. storici IBM VM, la macchina virtuale java o python
sistemi/s02/20260226.md
... ...
@@ -0,0 +1,59 @@
1
+poniamo di avere una macchina A, se io riesco a creare un servizio B diverso da A ma posso usare B al posto di A allora B si chiama macchina virtuale
2
+
3
+La def di virtuale dipende dallo scopo
4
+
5
+per essere una macchina virtuale deve parlare lo stesso linguaggio della macchina reale
6
+La jwm e la wm di python non centrano niente con questa def di wm
7
+![20260226_2026-02-26_15-24-44](assets/imgs/20260226_2026-02-26_15-24-44.png)
8
+
9
+Vantaggi:
10
+
11
+- consentono di far coesistere so differenti (es progettare app per telefoni)
12
+ Svantaggi:
13
+- soluzione piu lenta di una reale (le istruzioni hw di virtualizzazione)
14
+- difficile condividere risorse
15
+
16
+### ABI vs ISA
17
+
18
+![20260226_2026-02-26_15-28-38](assets/imgs/20260226_2026-02-26_15-28-38.png)
19
+
20
+imma dx: virtualizzazione di sistema
21
+immagine a sx: virtualizzazione a liv di processo
22
+
23
+![20260226_2026-02-26_15-33-39](assets/imgs/20260226_2026-02-26_15-33-39.png)
24
+
25
+Esempi di VM
26
+Quemu e' una piattaforma di transimulation
27
+Qemu: PMV o SVM
28
+
29
+- cross emulation platform
30
+- dynamic translation
31
+
32
+Qemu + KVM: SVM
33
+
34
+- usa le unita di io virtuali QEMU
35
+- usa le istruzioni per virtualizzazione: intel VT-x e AMD SVM (velocita' praticamente uguali)
36
+
37
+quemu non virtualizza ma traduce. Taduce brani di codice per un processore in brani per un altro processore (non traduce tutto il codice ma pezzi che poi salva in cache)
38
+
39
+Velocita' 10-15 volte piu lento
40
+
41
+quando si avvia un installazione del so viene avviato un piccolo linux (se devo installare linux)che serve solo per l'installazione
42
+
43
+## Namespace
44
+
45
+I namespace isolano le risorse in modo che i processi posano vedere la propria versione del sistema.
46
+Ogni namespace isola un tipo di risorse. Es:
47
+
48
+- PID namespace → separate process trees
49
+- NET namespace → separate network interfaces and routing
50
+- MNT namespace → separate filesystem mount points
51
+- UTS namespace → separate hostname
52
+- IPC namespace → separate shared memory/message queues
53
+- USER namespace → separate user IDs
54
+
55
+System call specifiche
56
+
57
+- clone: crea un nuovo processo, con opportune flag vengono creati nuovi namespace e il processo creato fara parte di questi namespace (e.g. CLONE_NEWNET, CLONE_NEWPID…)
58
+- Setns: connette il processo chiamante a namespace esistenti
59
+- Unshare: muove il processo chiamante in un nuovo namespace
sistemi/s02/20260304.md
... ...
@@ -0,0 +1,433 @@
1
+# Namespace
2
+
3
+I namespace isolano le risorse in modo che i processi posano vedere la propria versione del sistema.
4
+Ogni namespace isola un tipo di risorse. Es:
5
+
6
+- PID namespace → separate process trees
7
+- NET namespace → separate network interfaces and routing
8
+- MNT namespace → separate filesystem mount points
9
+- UTS namespace → separate hostname
10
+- IPC namespace → separate shared memory/message queues
11
+- USER namespace → separate user IDs
12
+
13
+differenza con os virtualizzato:
14
+
15
+- si puo fare boot (macchine virtuali)
16
+- tutte queste pseudo macchine viirtuali (namespace) condividono il kernel con l'os
17
+
18
+System call specifiche:
19
+
20
+- Clone: crea un nuovo processo, con opportune flag vengono
21
+ creati nuovi namespace e il processo creato farà parte di questi namespace (e.g. CLONE_NEWNET, CLONE_NEWPID…)
22
+- Setns: connette il processo chiamante a namespace esistenti
23
+- Unshare: muove il processo chiamante in un nuovo namespace
24
+
25
+(I namespace servono per creare container):
26
+Un container e':
27
+
28
+- Un gruppo di processi che tramite namespace “vede”:
29
+- Una immagine di file system privata
30
+- Una propria configurazione di rete
31
+- Limiti di accesso alle risorse (cgroup)
32
+- Gestito da meccanismi di amministrazione a run-time (docker, runc, containerd)
33
+
34
+## Progettazione so
35
+
36
+Definizione del problema
37
+
38
+- definire gli obiettivi del sistema che si vuole realizzare
39
+- definire i "costraint" entro cui si opera
40
+- La progettazione sarà influenzata:
41
+- al livello più basso, dal sistema hardware con cui si va ad operare
42
+- al livello più alto, dalle applicazioni che devono essere eseguite dal sistema operativo
43
+- A seconda di queste condizioni, il sistema sarà...
44
+- batch, time-shared, single-user, multi-user, distribuito, general-purpose, real-time, etc...
45
+
46
+## Scheduler, processi e thread
47
+
48
+Un sistema operativo è un gestore di risorse (processore, memoria principale e secondaria, dispositivi)
49
+
50
+Per svolgere i suoi compiti, un sistema operativo ha bisogno di strutture dati per mantenere informazioni sulle risorse gestite
51
+Queste strutture dati comprendono:
52
+
53
+- tabelle di memoria
54
+- tabelle di I/O
55
+- tabelle del file system
56
+- tabelle dei processi
57
+
58
+![20260304_2026-03-04_11-44-50](assets/imgs/20260304_2026-03-04_11-44-50.png)
59
+
60
+### Processi
61
+
62
+Qual è la manifestazione fisica di un processo?
63
+
64
+1. il codice da eseguire (segmento codice)
65
+2. i dati su cui operare (segmenti dati)
66
+3. uno stack di lavoro per la gestione di chiamate di funzione, passaggio di parametri e variabili locali
67
+4. un insieme di attributi contenenti tutte le informazioni necessarie per la gestione del processo stesso
68
+ - incluse le informazioni necessarie per descrivere i punti 1-3
69
+
70
+Questo insieme di attributi prende il nome di descrittore del processo (process control block, PCB)
71
+
72
+#### PCB
73
+
74
+I PCB e' la tabella per la gestion dei processi:
75
+
76
+- contiene i descrittori dei processi (PCB)
77
+- ogni processo ha un PCB associato
78
+
79
+E' possibile suddividere le informazioni contenute nel descrittore in tre aree:
80
+
81
+- info di identificazione di processo
82
+- info di stato di processo]
83
+- info di controllo del processo
84
+
85
+**Informazioni di identificazione di un processo**
86
+identificatore di processo (process id, o pid)
87
+
88
+- può essere semplicemente un indice all'interno di una tabella di processi
89
+- può essere un numero progressivo; in caso, è necessario un mapping tra pid e posizione del relativo descrittore
90
+- molte altre tabelle del s.o. utilizzano il process id per identificare un elemento della tabella dei processi
91
+
92
+identificatori di altri processi logicamente collegati al processo
93
+
94
+- ad esempio, pid del processo padre
95
+
96
+id dell'utente che ha richiesto l'esecuzione del processo
97
+
98
+Informazioni di stato del processo
99
+
100
+- registri generali del processore
101
+- registri speciali, come il program counter e i registri di stato
102
+
103
+Informazioni di controllo del processo:
104
+
105
+- Informazioni di scheduling
106
+ - stato del processo (in esecuzione, pronto, in attesa)
107
+ - informazioni particolari necessarie dal particolare algoritmo di schuduling utilizzato (priorità, puntatori per la gestione delle code)
108
+ - identificatore dell'evento per cui il processo è in attesa
109
+
110
+- informazioni di gestione della memoria - Informazioni di configurazione della MMU, es. puntatori alle tabelle delle pagine, etc.
111
+- informazioni di accounting
112
+ - tempo di esecuzione del processo
113
+ - tempo trascorso dall'attivazione di un processo
114
+- informazioni relative alle risorse
115
+ - risorse controllate dal processo, come file aperti, device allocati al processo
116
+- informazioni per interprocess communication (IPC)
117
+ - stato di segnali, semafori, etc.
118
+
119
+In linux la struttura dati che contiene il PCB e' la struct task
120
+
121
+### Scheduler
122
+
123
+e' la componente piu importante del kernel. Gestisce l'avvicendamento dei processi
124
+
125
+- quando viene richiamato decide quale deve essere in exec
126
+- intervien quando viene richiesta una op di I/O e quando un op di io ternima.
127
+
128
+Nota: il termine scheduler viene usato utilizzato anche in altri ambiti (es. scheduler del disco), noi ci riferiamo allo scheduler del so
129
+
130
+Schedule: è la sequenza temporale di assegnazioni delle risorse da gestire ai richiedenti
131
+Scheduling: è l'azione di calcolare uno schedule
132
+Scheduler: è la componente software che calcola lo schedule
133
+
134
+#### Mode switching e context switching
135
+
136
+Tutte le volte che avviene un interrupt il processore e' soggetto a mode switching (mod utente -> mod supervisore)
137
+
138
+Durante la gestione dell'interrupt:
139
+
140
+- vengono intraprese le opportune azioni per gestire l'evento
141
+- viene chiamato lo scheduler
142
+- se lo scheduler decide di eseguire un altro processo, il sistema e' soggetto a context switching
143
+
144
+Operazioni durante un context switching
145
+
146
+- lo stato del processo attuale viene salvato nel PCB corrispondente
147
+- lo stato del processo selezionato per l'esecuzione viene caricato dal PCB nel processore
148
+ ![20260304_2026-03-04_12-03-42](assets/imgs/20260304_2026-03-04_12-03-42.png)
149
+
150
+so salva il pcb di p1, carica il codice del pcb p2 e lo esegue. Infine p2 lancia un interrupt e si torna a p1
151
+
152
+![20260304_2026-03-04_12-07-37](assets/imgs/20260304_2026-03-04_12-07-37.png)
153
+Dentro inizialize c'e' il main
154
+
155
+Stati dei processi:
156
+
157
+- Running: il processo è in esecuzione
158
+- Waiting: il processo è in attesa di qualche evento esterno (e.g., completamento operazione di I/O); non può essere eseguito
159
+- Ready: il processo può essere eseguito, ma attualmente il processore è impegnato in altre attività
160
+
161
+![20260304_2026-03-04_12-18-25](assets/imgs/20260304_2026-03-04_12-18-25.png)
162
+
163
+utte le volte che un processo entra nel sistema, viene posto in una delle code gestite dallo scheduler
164
+
165
+![20260304_2026-03-04_12-18-52](assets/imgs/20260304_2026-03-04_12-18-52.png)
166
+![20260304_2026-03-04_12-19-41](assets/imgs/20260304_2026-03-04_12-19-41.png)
167
+
168
+#### Gerarchia di processi
169
+
170
+Nella maggior parte dei sistemi operativi i processi sono organizzati in forma gerarchica. Quando un processo crea un nuovo processo, il processo creante viene detto padre e il creato figlio. Si viene così a creare un albero di processi
171
+
172
+Motivazioni:
173
+
174
+- semplificazione del procedimento di creazione di processi
175
+- non occorre specificare esplicitamente tutti i parametri e le caratteristiche
176
+- ciò che non viene specificato, viene ereditato dal padre
177
+
178
+![20260304_2026-03-04_12-24-16](assets/imgs/20260304_2026-03-04_12-24-16.png)
179
+
180
+#### Processi e Thread
181
+
182
+La nozione di processo discussa in precedenza assume che ogni processo abbia una singola “linea di controllo”
183
+
184
+- per ogni processo, viene eseguite una singola sequenza di istruzioni
185
+- un singolo processo non può eseguire due differenti attività contemporanemente
186
+ Esempi:
187
+- scaricamento di due differenti pagine in un web browser
188
+- inserimento di nuovo testo in un word processor mentre viene eseguito il correttore ortografico
189
+
190
+Tutti i sistemi operativi moderni
191
+
192
+- supportano l’esistenza di processi multithreaded
193
+- in un processo multithreaded esistono molte “linee di controllo”, ognuna delle quali può eseguire una diversa sequenza di istruzioni
194
+
195
+Esempi:
196
+
197
+- Associando un thread ad ogni finestra aperta in un web browser, è possibile scaricare i dati in modo indipendente
198
+
199
+Un thread è l’unità base di utilizzazione della CPU
200
+
201
+Ogni thread possiede
202
+
203
+- la propria copia dello stato del processore
204
+- il proprio program counter
205
+- uno stack separato
206
+
207
+I thread appartenenti allo stesso processo condividono:
208
+
209
+- codice
210
+- dati
211
+- risorse di I/O
212
+
213
+![20260304_2026-03-04_12-45-33](assets/imgs/20260304_2026-03-04_12-45-33.png)
214
+
215
+Benefici dei thread:
216
+
217
+- condivisione di risorse
218
+ - i thread condividono lo spazio di mem e le risorse allocate degli altri thread dello stesso processo
219
+ - condividere info tra thread logicamente correlati rende piu semplice l'implementazione di certe applicazioni
220
+
221
+Es: web browser (condivisione dei param di config tra i vari thread)
222
+
223
+- Economia:
224
+ - allocare mem e risorse pepr creare nuovi processi e' costoso
225
+ - fare context switching fra diversi processi e' costoso
226
+- gestire thread e' meno costoso (es. creare un thread in solaris richiede 1/30 del tempo richiesto per creare un processo nuovo)
227
+
228
+in ogni caso, abbiamo bisogno di processi distinti per applicazioni differenti
229
+
230
+### Multithreading: implementazione
231
+
232
+Due modi:
233
+
234
+- user thread (livello utente)
235
+- kernel thread (livello kernel)
236
+
237
+Oggi vengono usati di piu i kernel thread
238
+
239
+#### User thread
240
+
241
+Gli user thread vengono supportati sopra il kernel e vengono implementati dsa una thread library a livello utente
242
+
243
+Vantaggi:
244
+
245
+- implementazione molto efficiente
246
+
247
+Svantaggi:
248
+
249
+- se il kernel e' single threaded qualsiasi user thread che effettua una chiamata a sistema bloccante (es io) causa il blocco dell'intero processo
250
+
251
+#### Kernel thread
252
+
253
+Vengono supportati direttamente dal sistema operativo
254
+
255
+Vantaggi:
256
+
257
+- poiche e' il kernel a gestire lo scheduling dei thread, se un thread segue op di io il kernel puo' selezionare un altro thread in attesa di essere eseguito
258
+
259
+Svantaggi:
260
+
261
+- implementazione piu lenta --> richiede un passaggio da livello utente a livello supervisore
262
+
263
+### Modelli di multithreading
264
+
265
+Molti sistemi usano entrambe i tipi di thread, creando vari tipi di modelli di multithreading
266
+
267
+- Many-to-One
268
+- One-to-One
269
+- Many-to-Many
270
+
271
+#### Many-to-One Multithreading
272
+
273
+Un certo numero di user thread vengono mappati su un solo kernel thread
274
+Modello generalmente adottato da s.o. che non supportano kernel thread multipli
275
+![20260304_2026-03-04_13-01-32](assets/imgs/20260304_2026-03-04_13-01-32.png)
276
+
277
+#### One-to-One Multithreading
278
+
279
+Ogni user thread viene mappato su un kernel thread
280
+Può creare problemi di scalabilità per il kernel
281
+![20260304_2026-03-04_13-02-06](assets/imgs/20260304_2026-03-04_13-02-06.png)
282
+
283
+#### Many-to-Many Multithreading
284
+
285
+Riassume i benefici di entrambe le architetture
286
+Supportato da Solaris, IRIX, Digital Unix
287
+![20260304_2026-03-04_13-02-55](assets/imgs/20260304_2026-03-04_13-02-55.png)
288
+
289
+## Scheduling
290
+
291
+Per rapp uno schedule si usano i diagrammi di Gantt
292
+
293
+![20260304_2026-03-04_13-03-46](assets/imgs/20260304_2026-03-04_13-03-46.png)
294
+in questo esempio, la risorsa (es. CPU) viene utilizzata dal processo P1 dal tempo 0 a t1, viene quindi assegnata a P2 fino al tempo t2 e quindi a P3 fino al tempo t3
295
+
296
+Eventi che possono causare un context switch:
297
+
298
+1. quando un processo passa da stato running a stato waiting (system call bloccante, operazione di I/O)
299
+2. quando un processo passa dallo stato running allo stato ready (a causa di un interrupt)
300
+3. quando un processo passa dallo stato waiting allo stato ready
301
+4. quando un processo termina
302
+
303
+### Tipi di scheduler
304
+
305
+Uno scheduler si dice non-preemptive o cooperativo
306
+
307
+- se i context switch avvengono solo nelle cond 1 e 4
308
+- il controllo della risorsa viene trasferito solo se l'assegnatario attuale lo cede volontariamente
309
+ Uno scheduler si dice preemptive se:
310
+- i context switch possono avvenire in ogni condizione
311
+- è possibile che il controllo della risorsa venga tolto all'assegnatario attuale a causa di un evento
312
+
313
+Tutti gli scheduler moderni sono preemptive.
314
+
315
+Vantaggi dello scheduling cooperativo
316
+
317
+- non richiede alcuni meccanismi hardware come ad esempio timer programmabili
318
+ Vantaggi dello scheduling preemptive
319
+- permette di utilizzare al meglio le risorse
320
+
321
+#### Criteri di scelta di uno scheduler
322
+
323
+Utilizzo della risorsa (CPU)
324
+
325
+- percentuale di tempo in cui la CPU è occupata ad eseguire processi
326
+- deve essere massimizzato
327
+ Throughput
328
+- numero di processi completati per unità di tempo
329
+- dipende dalla lunghezza dei processi
330
+- deve essere massimizzato
331
+
332
+Tempo di turnaround
333
+
334
+- tempo che intercorre dalla sottomissione di un processo alla sua terminazione
335
+- deve essere minimizzato
336
+
337
+Tempo di attesa
338
+
339
+- il tempo trascurso da un processo nella coda ready
340
+- deve essere minimizzato
341
+- Tempo di risposta
342
+- tempo che intercorre fra la sottomissione di un processo e il tempo di prima risposta
343
+- particolarmente significativo nei programmi interattivi, deve essere minimizzato
344
+
345
+Vita di un processo:
346
+![20260304_2026-03-04_13-12-29](assets/imgs/20260304_2026-03-04_13-12-29.png)
347
+
348
+Durante l'esecuzione di un processo:
349
+
350
+- si alternano periodi di attività svoltedalla CPU (CPU burst)...
351
+- ...e periodi di attività di I/O (I/O burst)
352
+ I processi:
353
+- caratterizzati da CPU burst molto lunghi si dicono CPU bound
354
+- caratterizzati da CPU burst molto brevi si dicono I/O bound
355
+
356
+Algoritmi:
357
+
358
+- First Come, First Served
359
+- Shortest-Job First
360
+ - Shortest-Next-CPU-Burst First
361
+ - Shortest-Remaining-Time-First
362
+- Round-Robin
363
+
364
+#### First Come, First Served (FCFS)
365
+
366
+Algoritmo
367
+
368
+- il processo che arriva per primo, viene servito per primo
369
+- politica senza preemption
370
+
371
+Implementazione
372
+
373
+- semplice, tramite una coda (politica FIFO)
374
+
375
+Problemi
376
+
377
+- elevati tempi medi di attesa e di turnaround
378
+- processi CPU bound ritardano i processi I/O bound
379
+
380
+Esempio:
381
+
382
+- ordine di arrivo: P1, P2, P3
383
+- lunghezza dei CPU-burst in ms: 32, 2, 2
384
+- Tempo medio di turnaround: (32+34+36)/3 = 34 ms
385
+- Tempo medio di attesa: (0+32+34)/3 = 22 ms
386
+
387
+![20260304_2026-03-04_13-18-15](assets/imgs/20260304_2026-03-04_13-18-15.png)
388
+
389
+**Supponiamo di avere**:
390
+
391
+- un processo CPU bound
392
+- un certo numero di processi I/O bound
393
+- i processi I/O bound si "mettono in coda" dietro al processo CPU bound, e in alcuni casi la ready queue si puo svuotare
394
+- Convoy effect
395
+ ![20260304_2026-03-04_13-19-35](assets/imgs/20260304_2026-03-04_13-19-35.png)
396
+
397
+#### Shortest Job First (SJF)
398
+
399
+la CPU viene assegnata al processo ready che ha la minima durata del CPU burst successivo
400
+(politica senza preemption)
401
+
402
+Esempio
403
+
404
+- Tempo medio di turnaround: (0+2+4+36)/3 = 7 ms
405
+- Tempo medio di attesa: (0+2+4)/3 = 2 ms
406
+ ![20260304_2026-03-04_13-20-59](assets/imgs/20260304_2026-03-04_13-20-59.png)
407
+
408
+L'algoritmo SJF
409
+
410
+- è ottimale rispetto al tempo di attesa, in quanto è possibile dimostrare che produce il minor tempo di attesa possibile
411
+- ma è impossibile da implementare in pratica!
412
+- è possibile solo fornire delle approssimazioni
413
+- non possiamo conoscere la lunghezza del prossimo CPU burst.... ma conosciamo la lunghezza di quelli precedenti
414
+
415
+Calcolo approssimato della durata del CPU burst:
416
+
417
+- basata su media esponenziale dei CPU burst precedenti
418
+- sia tn il tempo dell'n-esimo CPU burst e тn la corrispondente previsione; тn+1 può essere calcolato come segue:
419
+ ![20260304_2026-03-04_13-24-44](assets/imgs/20260304_2026-03-04_13-24-44.png)
420
+
421
+Media esponenziale
422
+
423
+- svolgendo la formula di ricorrenza, si ottiene da cui il nome media esponenziale
424
+ ![20260304_2026-03-04_13-25-27](assets/imgs/20260304_2026-03-04_13-25-27.png)
425
+
426
+![20260304_2026-03-04_13-25-51](assets/imgs/20260304_2026-03-04_13-25-51.png)
427
+
428
+Shortest Job First "approssimato" esiste in due versioni:
429
+
430
+1. non preemptive
431
+ - il processo corrente esegue fino al completamento del suo CPU burst
432
+2. preemptive - il processo corrente può essere messo nella coda ready, se arriva un processo con un CPU burst più breve di quanto rimane da eseguire al processo corrente
433
+ - "Shortest-Remaining-Time First"
sistemi/s02/20260305.md
... ...
@@ -0,0 +1,460 @@
1
+# Scheduling
2
+
3
+## Scheduling round robin
4
+
5
+e'basato sul concetto di quanto di tempo (time slice)
6
+
7
+- un process non puo'essere in esecuzione per un tempo superiore alla durata del quanto
8
+
9
+Implementazione (1)
10
+
11
+- l'insieme dei processi pronti è organizzato come una coda
12
+- due possibilità:
13
+ - un processo può lasciare il processore volontariamente, in seguito ad un'operazione di I/O
14
+ - un processo può esaurire il suo quanto di tempo senza completare il suo CPU burst, nel qual caso viene aggiunto in fondo alla coda dei processi pronti
15
+- in entrambi i casi, il prossimo processo da esegure è il primo della coda dei processi pronti
16
+
17
+La durata del quanto di tempo è un parametro critico del sistema
18
+
19
+- se il quanto di tempo è breve, il sistema è meno efficiente perchè deve cambiare il processo attivo più spesso
20
+- se il quanto è lungo, in presenza di numerosi processi pronti ci sono lunghi periodi di inattività di ogni singolo processo,
21
+- in sistemi interattivi, questo può essere fastidioso per gli utenti
22
+
23
+Implementazione (2)
24
+
25
+- è necessario che l'hardware fornisca un timer (interval timer) che agisca come "sveglia" del processore
26
+- il timer è un dispositivo che, attivito con un preciso valore di tempo, è in grado di fornire un interrupt allo scadere del tempo prefissato
27
+- il timer viene interfacciato come se fosse un'unita di I/O
28
+
29
+![20260305_2026-03-05_15-26-01](assets/imgs/20260305_2026-03-05_15-26-01.png)
30
+
31
+round robin e' troppo democratico, tutti i processi hanno la stessa priorita' (in realta'alcune task sono piu importanti di altre)
32
+
33
+## Scheduling a priorita'
34
+
35
+Ogni processo e' associato a una specifica priorita'
36
+lo scheduler sceglie il processo pronto a priorita' piu'alta
37
+la system call per cambiare priorita' al processo si chiama `nice` (per abbassare la priorita')
38
+
39
+Le priorità possono essere:
40
+
41
+- definite dal sistema operativo
42
+ - vengono utilizzate una o più quantità misurabili per calcolare la priorità di un processo
43
+ - esempio: SJF è un sistema basato su priorità (priorita' piu alta a processi che finiscono prima)
44
+- definite esternamente
45
+ - le priorità non vengono definite dal sistema operativo, ma vengono imposte dal livello utente
46
+
47
+**Tipi di priorita**:
48
+
49
+- Priorità statica:
50
+ - la priorità non cambia durante la vita di un processo
51
+ - problema: processi a bassa priorità possono essere posti in starvation da processi ad alta priorità
52
+- Priorità dinamica
53
+ - la priorità può variare durante la vita di un processo
54
+ - è possibile utilizzare metodologie di priorità dinamica per evitare starvation
55
+
56
+### Priorità basata su aging:
57
+
58
+- incremento graduale della priorita dei processi in attesa
59
+- nessun processo rimarra'in attesa per un tempo indefinito (prima o poi il proc raggiungera'la priorita' massima)
60
+
61
+### Classi di priorita'
62
+
63
+- e' possibile creare diverse classi di processi con caratteristiche sismili e assegnare ad ogni classe specifiche priorita'
64
+- la coda ready viene quindi scomposta in tante "sottocode", una per ogni classe di processi
65
+
66
+Algoritmo:
67
+
68
+- uno scheduler a classi di priorità seleziona il processo da eseguire fra quelli pronti della classe a priorità massima che contiene processi
69
+
70
+### Scheduling Multilivello
71
+
72
+- all'interno di ogni classe di processi, è possibile utilizzare una politica specifica adatta alle caratteristiche della classe
73
+- uno scheduler multilivello cerca prima la classe di priorità massima che ha almeno un processo ready
74
+- sceglie poi il processo da porre in stato running coerentemente con la politica specifica della classe
75
+
76
+Esempio:
77
+Quattro classi di processi (priorità decrescente):
78
+
79
+- processi server (priorità statica)
80
+- processi utente interattivi (round-robin)
81
+- altri processi utente (FIFO)
82
+- il processo vuoto (FIFO banale)
83
+
84
+nell'ultimo livello c'e' il processo vuoto (serve per far aspettare a)
85
+
86
+### Scheduling Real-Time
87
+
88
+- la correttezza dell'esecuzione non dipende solamente dal valore del risultato, ma anche dall'istante temporale nel quale il risultato viene emesso
89
+
90
+Hard real-time
91
+
92
+- le deadline di esecuzione dei programmi non devono essere superate in nessun caso
93
+- sistemi di controllo nei velivoli, centrali nucleari o per la cura intensiva dei malati
94
+
95
+Soft real-time
96
+
97
+- errori occasionali sono tollerabili
98
+- ricostruzione di segnali audio-video, transazioni interattive
99
+
100
+Processi periodici
101
+
102
+- sono periodici i processi che vengono riattivati con una cadenzaregolare (periodo)
103
+- esempi: controllo assetto dei velivoli, basato su rilevazione periodica dei parametri di volo
104
+- Processi aperiodici
105
+- i processi che vengono scatenati da un evento sporadico, ad esempio l'allarme di un rilevatore di pericolo
106
+
107
+Rate Monotonic:
108
+
109
+- è una politica di scheduling, valida alle seguenti condizioni
110
+- ogni processo periodico deve completare entro il suo periodo
111
+- tutti i processi sono indipendenti
112
+- la preemption avviene istantaneamente e senza overhead
113
+- viene assegnata staticamente una priorità a ogni processo
114
+- processi con frequenza più alta (i.e. periodo più corto) hanno prioritàpiù alta
115
+- ad ogni istante, viene eseguito il processo con priorità più alta (facendo preemption se necessario)
116
+
117
+Earliest Deadline First:
118
+
119
+- è una politica di scheduling per processi periodici real-time
120
+- viene scelto di volta in volta il processo che ha la deadline più prossima
121
+- viene detto "a priorità dinamica" perchè la priorità relativa di due processi varia in momenti diversi
122
+
123
+# Modulo 4 gestore risorse e deadlock
124
+
125
+## Risorse
126
+
127
+un sistema di elaborazione e' composto da un insieme di risorse da assegnare ai processi (es. memoria, stampanti, interfaccie di rete...)
128
+
129
+### classi di risorse
130
+
131
+Le risorse della stessa classe sono equivalenti
132
+es. byte di mem, stampanti dello stesso tipo
133
+
134
+Definizioni:
135
+
136
+- le risorse di una classe vengono dette istanze della classe
137
+- il numero di risorse in una classe viene detto molteplicità del tipo di risorsa
138
+
139
+> Nota: Un processo non può richiedere una specifica risorsa, ma solo una risorsa di una specifica classe (es. un proc puo chedere memoria ma non puo specificare quale banco di memoria vuole)
140
+
141
+### Assegnazione delle risorse
142
+
143
+Risorse ad assegnazione statica
144
+
145
+- avviene al momento della creazione del processo e rimane valida fino allaterminazione
146
+- esempi: descrittori di processi, aree di memoria (in alcuni casi)
147
+
148
+Risorse ad assegnazione dinamica
149
+
150
+- i processi
151
+ - richiedono le risorse durante la loro esistenza
152
+ - le utilizzano una volta ottenute
153
+ - le rilasciano quando non più necessarie (eventualmente alla terminazione del processo
154
+- esempi: periferiche di I/O, aree di memoria (in alcuni casi)
155
+
156
+### Tipi di richieste
157
+
158
+Richiesta singola:
159
+
160
+- si riferisce a una singola risorsa di una classe definita
161
+- è il caso normale
162
+
163
+Richiesta multipla
164
+
165
+- si riferisce a una o più classi, e per ogni classe, ad una o più risorse
166
+- deve essere soddisfatta integralmente
167
+
168
+Richiesta bloccante
169
+
170
+- il processo richiedente si sospende se non ottiene immediatamente l'assegnazione
171
+- la richiesta rimane pendente e viene riconsiderata dalla funzione di gestione ad ogni rilascio
172
+
173
+Richiesta non bloccante
174
+
175
+- la mancata assegnazione viene notificata al processo richiedente, senza provocare la sospensione
176
+
177
+Risorse non condivisibili (seriali)
178
+
179
+- una singola risorsa non può essere assegnata a più processi contemporaneamente
180
+- esempi:
181
+ (i processori, le sezioni critiche, le stampanti)
182
+
183
+- Risorse condivisibili
184
+- esempio: (file di sola lettura)
185
+
186
+### Risorse prerilasciabili ("preemptable")
187
+
188
+una risorsa si dice prerilasciabile se la funzione di gestione può sottrarla ad un processo prima che questo l'abbia effettivamente rilasciata
189
+
190
+Meccanismo di gestione:
191
+
192
+- il processo che subisce il prerilascio deve sospendersi
193
+- la risorsa prerilasciata sarà successivamente restituita al processo
194
+
195
+Una risorsa è prerilasciabile:
196
+
197
+- se il suo stato non si modifica durante l'utilizzo
198
+- oppure il suo stato può essere facilmente salvato e ripristinato
199
+
200
+Esempi:
201
+
202
+- processore
203
+- blocchi o partizioni di memoria (nel caso di assegnazione dinamica)
204
+
205
+### Risorse non prerilasciabili
206
+
207
+- la funzione di gestione non può sottrarle al processo al quale sono assegnate
208
+- sono non prerilasciabili le risorse il cui stato non può essere salvato e ripristinato
209
+
210
+Esempi
211
+
212
+- stampanti
213
+- classi di sezioni critiche
214
+- partizioni di memoria (nel caso di gestione statica)
215
+
216
+## Deadlock
217
+
218
+- i deadlock impediscono ai processi di terminare correttamente
219
+- le risorse bloccate in deadlock non possono essere utilizzati da altri processi
220
+
221
+### Condizioni per avere un deadlock
222
+
223
+Mutua esclusione / non condivisibili
224
+
225
+- le risorse coinvolte devono essere non condivisibili (seriali)
226
+
227
+Assenza di prerilascio
228
+
229
+- le risorse coinvolte non possono essere prerilasciate, ovvero devono essere rilasciate volontariamente dai processi che le controllano
230
+
231
+Richieste bloccanti (detta anche "hold and wait")
232
+
233
+- le richieste devono essere bloccanti, e un processo che ha già ottenuto risorse può chiederne ancora
234
+
235
+Attesa circolare
236
+
237
+- esiste una sequenza di processi P0,P1, ..., Pn, tali per cui P0 attende una risorsa controllata da P1, P1 attende una risorsa controllata da P2, ..., e Pn attende una risorsa controllata da P0
238
+
239
+L'insieme di queste condizioni è necessario e sufficiente (devono valere tutte contemporaneamente affinché un deadlock si presenti nel sistema)
240
+
241
+### Grafo di Holt
242
+
243
+Caratteristiche:
244
+
245
+- è un grafo diretto
246
+ - gli archi hanno una direzione
247
+- è un grafo bipartito
248
+ - i nodi sono suddivisi in due sottoinsiemi e non esistono archi che collegano nodi dello stesso sottoinsieme
249
+ - i sottoinsiemi sono risorse e processi
250
+- gli archi risorsa → processo indicano che la risorsa è assegnata al processo
251
+- gli archi processo → risorsa indicano che il processo ha richiesto la risorsa
252
+
253
+Esempio:
254
+![20260305_2026-03-05_16-43-41](assets/imgs/20260305_2026-03-05_16-43-41.png)
255
+
256
+Nel caso di classi contenenti più istanze di una risorsa l'insieme delle risorse è partizionato in classi e gli archi di richiesta sono diretti alla classe e non alla singola risorsa
257
+
258
+Rappresentazione:
259
+
260
+- i processi sono rappresentati da cerchi
261
+- le classi sono rappresentati come contenitori rettangolari
262
+- le risorse come punti all'interno delle classi
263
+
264
+> Nota:
265
+>
266
+> - non si rappresentano grafi di Holt con archi relativi a richieste che possono essere soddisfatte
267
+> - se esiste almeno un'istanza libera della risorsa richiesta, la risorsa viene assegnata
268
+
269
+Esempio
270
+![20260305_2026-03-05_16-46-33](assets/imgs/20260305_2026-03-05_16-46-33.png)
271
+
272
+Nell’implementazione il grafo di Holt viene memorizzato come grafo pesato (con pesi ai nodi risorsa e pesi sugli archi)
273
+
274
+sugli archi:
275
+
276
+- la molteplicità della richiesta (archi processo → classe)
277
+- la molteplicità dell'assegnazione(archi classe → processo)
278
+
279
+all'interno delle classi
280
+
281
+- il numero di risorse non ancora assegnate
282
+
283
+![20260305_2026-03-05_16-47-56](assets/imgs/20260305_2026-03-05_16-47-56.png)
284
+
285
+### Metodi di gestione dei deadlock
286
+
287
+Deadlock detection and recovery:
288
+
289
+- permettere al sistema di entrare in stati di deadlock; utilizzare un algoritmo per rilevare questo stato ed eventualmente eseguire un'azione di recovery
290
+
291
+Deadlock prevention / avoidance:
292
+
293
+- impedire al sistema di entrare in uno stato di deadlock
294
+
295
+### Deadlock detection
296
+
297
+Descrizione
298
+
299
+- mantenere aggiornato il grafo di Holt, registrando su di esso tutte le assegnazioni e le richieste di risorse
300
+- utilizzare il grafo di Holt al fine di riconoscere gli stati di deadlock
301
+
302
+Problema: come riconoscere uno stato di deadlock?
303
+
304
+#### Caso 1 - Una sola risorsa per classe
305
+
306
+**Teorema**
307
+
308
+- se le risorse sono a richiesta bloccante, non condivisibili e non prerilasciabili
309
+- lo stato è di deadlock se e solo se il grafo di Holt contiene un ciclo
310
+
311
+**Dimostrazione**
312
+
313
+- si utilizza una variante del grafo di Holt, detto grafo Wait-For
314
+- si ottiene un grafo wait-for eliminando i nodi di tipo risorsa e collassando gli archi appropriati
315
+- il grafo di Holt contiene un ciclo se e solo se il grafo Wait-for contiene un ciclo
316
+- se il grafo Wait-for contiene un ciclo, abbiamo attesa circolare
317
+
318
+![20260305_2026-03-05_16-54-51](assets/imgs/20260305_2026-03-05_16-54-51.png)
319
+
320
+**Attenzione**:
321
+La presenza di un ciclo nel caso di Holt non è condizione sufficiente per avere deadlock
322
+![20260305_2026-03-05_16-55-27](assets/imgs/20260305_2026-03-05_16-55-27.png)
323
+No deadlock perche' quando r finisce la sua risorsa puo essere data a p o q per permettergli di finire l'esecuzione
324
+
325
+#### Riducibilità di un grafo di Holt
326
+
327
+Definizione
328
+
329
+- un grafo di Holt si dice riducibile se esiste almeno un nodo processo con solo archi entranti
330
+
331
+Riduzione
332
+
333
+- consiste nell'eliminare tutti gli archi di tale nodo e riassegnare le risorse ad altri processi
334
+
335
+Qual è la logica? - eventualmente, un nodo che utilizza una risorsa prima o poi la rilascerà; a quel punto, la risorsa può essere riassegnata
336
+
337
+![20260305_2026-03-05_16-57-35](assets/imgs/20260305_2026-03-05_16-57-35.png)
338
+
339
+#### Deadlock detection con grafo di Holt
340
+
341
+Teorema
342
+
343
+- se le risorse sono a richiesta bloccante, non condivisibili e non prerilasciabili
344
+- lo stato non è di deadlock se e solo se il grafo di Holt è completamente riducibile, i.e. esiste una sequenza di passi di riduzione che elimina tutti gl archi del grafo
345
+
346
+![20260305_2026-03-05_17-02-01](assets/imgs/20260305_2026-03-05_17-02-01.png)
347
+![20260305_2026-03-05_17-02-11](assets/imgs/20260305_2026-03-05_17-02-11.png)
348
+![20260305_2026-03-05_17-02-27](assets/imgs/20260305_2026-03-05_17-02-27.png)
349
+![20260305_2026-03-05_17-02-44](assets/imgs/20260305_2026-03-05_17-02-44.png)
350
+![20260305_2026-03-05_17-02-53](assets/imgs/20260305_2026-03-05_17-02-53.png)
351
+
352
+#### Deadlock detection - Knot
353
+
354
+Definizione
355
+
356
+- dato un nodo n, l'insieme dei nodi raggiungibili da n viene detto insieme di raggiungibilità di n (scritto R(n))
357
+- un knot del grafo G è il sottoinsieme (non banale) di nodi M tale che per ogni n in M, R(n)=M
358
+- in altre parole: partendo da un qualunque nodo di M, si possono raggiungere tutti i nodi di M e nessun nodo all'infuori di esso.
359
+
360
+![20260305_2026-03-05_17-06-10](assets/imgs/20260305_2026-03-05_17-06-10.png)
361
+Teorema
362
+
363
+- dato un grafo di Holt con una sola richiesta sospesa per processo
364
+- se le risorse sono a richiesta bloccante, non condivisibili e non prerilasciabili,
365
+- allora il grafo rappresenta uno stato di deadlock se e solo se esiste un knot
366
+
367
+### Deadlock recovery
368
+
369
+Dopo aver rilevato un deadlock bisogna sistemarlo
370
+La soluzione può essere:
371
+
372
+- manuale
373
+ - l'operatore viene informato e eseguirà alcune azioni che permettano al sistema di proseguire
374
+- automatica
375
+ - il sistema operativo è dotato di meccanismi che permettono di risolvere in modo automatico la situazione, in base ad alcune politiche
376
+
377
+#### Meccanismi per il deadlock recovery
378
+
379
+Terminazione totale
380
+
381
+- tutti i processi coinvolti vengono terminati
382
+
383
+Terminazione parziale
384
+
385
+- viene eliminato un processo alla volta, fino a quando il deadlock non scompare
386
+
387
+Checkpoint/rollback
388
+
389
+- lo stato dei processi viene periodicamente salvato su disco (checkpoint)
390
+- in caso di deadlock, si ripristina (rollback) uno o più processi ad uno stato precedente, fino a quando il deadlock non scompare
391
+
392
+Quindi terminare processi puo essere costoso e puo' lasciare le risorse in uno stato incoerente (es se un proc viene terminato nel mezzo di una sezione critica)
393
+
394
+#### Deadlock prevention / avoidance
395
+
396
+Prevention:
397
+
398
+- per evitare il deadlock si elimina una delle quattro condizioni del deadlock
399
+  il deadlock viene eliminato strutturalmente
400
+
401
+Avoidance
402
+
403
+- prima di assegnare una risorsa ad un processo, si controlla se l'operazione può portare al pericolo di deadlock
404
+- in quest'ultimo caso, l'operazione viene ritardata
405
+
406
+Attaccare la condizione di "Mutua esclusione"
407
+
408
+- permettere la condivisione di risorse
409
+- e.g. spool di stampa, tutti i processi "pensano" di usare contemporaneamente la stampante
410
+
411
+Problemi dello spooling:
412
+
413
+- non sempre è applicabile (ad esempio, descrittori di processi)
414
+
415
+Attaccare la condizione di "Richiesta bloccante"
416
+
417
+- Allocazione totale
418
+ - è possibile richiedere che un processo richiede tutte le risorse all'inizio della computazione
419
+- Problemi
420
+ - non sempre l'insieme di richieste è noto fin dall'inizio
421
+ - si riduce il parallelismo
422
+
423
+Attaccare la condizione di "Assenza di prerilascio"
424
+
425
+- non sempre è possibile
426
+- può richiedere interventi manuali
427
+
428
+Attaccare la condizione di "Attesa Circolare"
429
+
430
+- Allocazione gerarchica
431
+ - alle classi di risorse vengono associati valori di priorità
432
+ - ogni processo in ogni istante può allocare solamente risorse di priorità superiore a quelle che già possiede
433
+ - se un processo vuole allocare una risorsa a priorità inferiore, deve prima rilasciare tutte le risorse con priorità uguale o superiore a quella desiderata
434
+
435
+Allocazione gerarchica e allocazione totale: problemi
436
+
437
+- prevengono il verificarsi di deadlock, ma sono altamente inefficienti
438
+
439
+Nell'allocazione gerarchica:
440
+
441
+- l'indisponibilità di una risorsa ad alta priorità ritarda processi che già detengono risorse ad alta priorità
442
+
443
+Nell'allocazione totale:
444
+
445
+- anche se un processo ha necessità di risorse per poco tempo deve allocarla per tutta la propria esistenza
446
+
447
+#### L'algoritmo del banchiere
448
+
449
+- un algoritmo per evitare lo stallo sviluppato da Dijkstra (1965)
450
+- il nome deriva dal metodo utilizzato da un ipotetico banchiere di provincia che gestisce un gruppo di clienti a cui ha concesso del credito; non tutti i clienti avranno bisogno dello stesso credito simultaneamente
451
+
452
+Descrizione
453
+
454
+- un banchiere desidera condividere un capitale (fisso) con un numero (prefissato) di clienti
455
+ - per Dijkstra l'"unità di misura" erano fiorini olandesi
456
+- ogni cliente specifica in anticipo la sua necessità massima di denaro
457
+ - che ovviamente non deve superare il capitale del banchiere
458
+- i clienti fanno due tipi di transazioni
459
+ - richieste di prestito
460
+ - restituzioni
sistemi/s02/assets/imgs/20260225_2026-02-25_11-59-43.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_11-59-43.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-06-05.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-06-05.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-10-35.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-10-35.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-16-13.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-16-13.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-16-42.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-16-42.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-51-04.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-51-04.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-55-35.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-55-35.png differ
sistemi/s02/assets/imgs/20260225_2026-02-25_12-58-43.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260225_2026-02-25_12-58-43.png differ
sistemi/s02/assets/imgs/20260226_2026-02-26_15-24-44.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260226_2026-02-26_15-24-44.png differ
sistemi/s02/assets/imgs/20260226_2026-02-26_15-28-38.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260226_2026-02-26_15-28-38.png differ
sistemi/s02/assets/imgs/20260226_2026-02-26_15-33-39.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260226_2026-02-26_15-33-39.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_11-44-50.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_11-44-50.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-03-42.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-03-42.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-07-37.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-07-37.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-18-25.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-18-25.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-18-52.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-18-52.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-19-41.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-19-41.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-24-16.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-24-16.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_12-45-33.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_12-45-33.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-01-32.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-01-32.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-02-06.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-02-06.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-02-55.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-02-55.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-03-46.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-03-46.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-12-29.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-12-29.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-18-15.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-18-15.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-19-35.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-19-35.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-20-59.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-20-59.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-24-44.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-24-44.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-25-27.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-25-27.png differ
sistemi/s02/assets/imgs/20260304_2026-03-04_13-25-51.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260304_2026-03-04_13-25-51.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_15-26-01.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_15-26-01.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_16-43-41.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_16-43-41.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_16-46-33.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_16-46-33.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_16-47-56.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_16-47-56.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_16-54-51.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_16-54-51.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_16-55-27.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_16-55-27.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_16-57-35.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_16-57-35.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-01.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-01.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-11.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-11.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-27.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-27.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-44.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-44.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-53.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_17-02-53.png differ
sistemi/s02/assets/imgs/20260305_2026-03-05_17-06-10.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/20260305_2026-03-05_17-06-10.png differ
sistemi/s02/assets/imgs/filesystem_2026-03-19_17-04-57.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/filesystem_2026-03-19_17-04-57.png differ
sistemi/s02/assets/imgs/filesystem_2026-03-19_17-06-20.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/filesystem_2026-03-19_17-06-20.png differ
sistemi/s02/assets/imgs/filesystem_2026-03-19_17-07-34.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/filesystem_2026-03-19_17-07-34.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-32-32.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-32-32.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-33-46.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-33-46.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-34-55.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-34-55.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-36-02.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-36-02.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-38-32.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-38-32.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-40-31.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-40-31.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-49-35.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_11-49-35.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-07-49.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-07-49.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-12-09.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-12-09.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-16-08.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-16-08.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-29-32.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-29-32.png differ
sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-31-42.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_mem_2026-03-18_12-31-42.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-45-25.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-45-25.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-46-12.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-46-12.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-50-42.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-50-42.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-51-09.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-51-09.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-51-41.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-51-41.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-58-26.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_11-58-26.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_12-00-48.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_12-00-48.png differ
sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_12-11-48.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/gestione_risorse_deadlock_2026-03-11_12-11-48.png differ
sistemi/s02/assets/imgs/memoria_2026-03-11_12-35-34.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_2026-03-11_12-35-34.png differ
sistemi/s02/assets/imgs/memoria_2026-03-11_12-37-58.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_2026-03-11_12-37-58.png differ
sistemi/s02/assets/imgs/memoria_2026-03-11_13-01-58.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_2026-03-11_13-01-58.png differ
sistemi/s02/assets/imgs/memoria_2026-03-11_13-02-48.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_2026-03-11_13-02-48.png differ
sistemi/s02/assets/imgs/memoria_2026-03-11_13-33-36.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_2026-03-11_13-33-36.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-21-36.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-21-36.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-22-45.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-22-45.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-24-16.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-24-16.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-25-17.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-18_13-25-17.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_15-45-29.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_15-45-29.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_15-51-39.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_15-51-39.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_15-57-31.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_15-57-31.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_16-09-15.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_16-09-15.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_16-15-25.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_16-15-25.png differ
sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_16-18-00.png
... ...
Binary files /dev/null and b/sistemi/s02/assets/imgs/memoria_secondaria_2026-03-19_16-18-00.png differ
sistemi/s02/filesystem.md
... ...
@@ -0,0 +1,85 @@
1
+---
2
+Title: Filesystem
3
+---
4
+
5
+## Visione utente
6
+
7
+I computer possono usare diversi media per registrare in modo permanente le info (es. hdds, nastri, floppy ecc)
8
+Il file system si occupa di astrarre la complessita' di utilizzo dei diversi media proponendo un interfaccia per i sistemi di memorizzazione:
9
+
10
+- comune
11
+- efficiente
12
+- conveniente da usare
13
+
14
+Dal punto di vista dell'utente un fs e' composto da due elementi: file (unita' logica di memorizzazione) e directory (servono per organizzare i file che compongono un fs)
15
+
16
+### File
17
+
18
+Il concetto di file:
19
+
20
+- e' l'entita' atomica di assegnazione/gestion della mem secondaria
21
+- e'una collezione di info correlate
22
+- fornisce una vista logica uniforme ad info correlate
23
+
24
+Attributi dei file:
25
+
26
+- Nome: stringa di caratteri che permette agli utenti e al so di identificare un particolare file
27
+- Tipo: necessario in alcuni sistemi per indentificare il tipo di file
28
+- Locazione e dimensione: info sul posizionamento del file in mem secondaria
29
+- Data e ora: info relative al tempo di creazione ed ultima modifica del file
30
+- Info sulla proprieta': utenti, gruppi.
31
+- Attributi di protezione: info di accesso per verificare chi e' autorizzato a eseguire op sui file
32
+- Altro: flag, info di locking, ecc
33
+
34
+#### Tipi di file
35
+
36
+A seconda della struttura interna:
37
+
38
+- senza formato (stringa di byte): file testo
39
+- con formato: file di record, file di database, a.out
40
+
41
+A seconda del contenuto:
42
+
43
+- ascii/binario
44
+- sorgente, oggetto
45
+- eseguibile
46
+
47
+Alcuni S.O. supportano e riconoscono diversi tipi di file
48
+Esistono tre tecniche principali per identificare il tipo di un file:
49
+
50
+- meccanismo delle estensioni
51
+- utilizzo di un attributo "tipo" associato al file nella directory
52
+- magic number
53
+
54
+![filesystem_2026-03-19_17-04-57](assets/imgs/filesystem_2026-03-19_17-04-57.png)
55
+
56
+![filesystem_2026-03-19_17-06-20](assets/imgs/filesystem_2026-03-19_17-06-20.png)
57
+
58
+I file possono essere strutturati in molti modi:
59
+
60
+1. seq di byte
61
+2. seq di record logici
62
+3. file indicizzati (struttura ad albero)
63
+
64
+![filesystem_2026-03-19_17-07-34](assets/imgs/filesystem_2026-03-19_17-07-34.png)
65
+
66
+Nota: la struttura piu comune e' la 1. I DB usano strutture 2. La 3. serve per gestire grandi moli di dati.
67
+
68
+I sistemi operativi possono attuare diverse scelte nella gestione della struttura dei file:
69
+
70
+- scelta minimale
71
+ - i file sono considerati semplici stringhe di byte, a parte i file eseguibili il cui formato è dettato dal s.o.
72
+ - e.g., UNIX e MS-DOS
73
+- parte strutturata/parte a scelta dell'utente
74
+ - e.g. Macintosh (resource fork / data fork)
75
+- diversi tipi di file predefiniti
76
+ - e.g., VMS, MVS
77
+ E’ un trade-off tra:
78
+- più formati: codice di sistema più ingombrante, incompatibilità di programmi (accesso a file di formato differente) MA gestione efficiente e non duplicata per i formati speciali
79
+- meno formati: codice di sistema più snello
80
+
81
+#### Metodi di accesso
82
+
83
+- sequenziale (read write)
84
+- ad accesso diretto: read pos, write pos (oppure op di seek)
85
+- indicizzato: read key, write key (tipico dei DB)
sistemi/s02/gestione_mem.md
... ...
@@ -0,0 +1,293 @@
1
+# Modulo 5: Gestione della memoria
2
+
3
+### Algoritmi di rimpiazzamento
4
+
5
+Obiettivi
6
+
7
+- minimizzare il numero di page fault
8
+
9
+Valutazione
10
+
11
+- gli algoritmi vengono valutati esaminando come si comportano quando applicati ad una stringa di riferimenti in memoria
12
+
13
+Le stringhe di riferimenti possono essere generate esaminando il funzionamento di programmi reali o con un generatore di numeri random
14
+
15
+Nota: la stringa di riferimenti può essere limitata ai numeri di pagina, in quanto non siamo interessati agli offset. Esempio:
16
+
17
+- stringa di riferimento completa (in esadecimale):
18
+ - 71,0a,13,25,0a,3f,0c,4f,21,30,00,31,21,1a,2b,03,1a,77,11
19
+- stringa di riferimento delle pagine (in esadecimale, con pagine di 16 byte)
20
+ - 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,1
21
+
22
+![gestione_mem_2026-03-18_11-32-32](assets/imgs/gestione_mem_2026-03-18_11-32-32.png)
23
+
24
+### Algoritmo FIFO
25
+
26
+Descrizione
27
+
28
+- quando c’è necessità di liberare un frame viene individuato come “vittima” il frame che per primo fu caricato in memoria
29
+
30
+Vantaggi
31
+
32
+- semplice, non richiede particolari supporti hardware
33
+
34
+Svantaggi
35
+
36
+- vengono talvolta scaricate pagine che sono sempre utilizzat
37
+
38
+Esempio:
39
+
40
+- numero di frame in memoria: 3
41
+- numero di page fault: 15 (su 20 accessi in memoria)
42
+
43
+![gestione_mem_2026-03-18_11-33-46](assets/imgs/gestione_mem_2026-03-18_11-33-46.png)
44
+
45
+- numero di frame in memoria: 3
46
+- numero di page fault: 9 (su 12 accessi in memoria)
47
+
48
+![gestione_mem_2026-03-18_11-34-55](assets/imgs/gestione_mem_2026-03-18_11-34-55.png)
49
+
50
+- numero di frame in memoria: 4
51
+- numero di page fault: 10! (su 12 accessi in memoria)
52
+- il numero di page fault è aumentato!
53
+
54
+![gestione_mem_2026-03-18_11-36-02](assets/imgs/gestione_mem_2026-03-18_11-36-02.png)
55
+
56
+## Anomalia di Belady
57
+
58
+In alcuni algoritmi di rimpiazzamento non è detto che aumentando il numero di frame il numero di page fault diminuisca (e.g., FIFO). Questo fenomeno indesiderato si chiama Anomalia di Belady
59
+
60
+### Algoritmo MIN - Ottimale
61
+
62
+Descrizione
63
+
64
+- seleziona come pagina vittima una pagina che non sarà più acceduta o la pagina che verrà acceduta nel futuro più lontano
65
+
66
+Considerazioni
67
+
68
+- è ottimale perché fornisce il minimo numero di page fault
69
+- è un algoritmo teorico perché richiederebbe la conoscenza a priori della stringa dei riferimenti futuri del programma
70
+- viene utilizzato a posteriori come paragone per verificare le performance degli algoritmi di rimpiazzamento reali
71
+
72
+Esempio:
73
+
74
+- numero di frame in memoria: 3
75
+- numero di page fault: 9 (su 20 accessi in memoria)
76
+
77
+![gestione_mem_2026-03-18_11-38-32](assets/imgs/gestione_mem_2026-03-18_11-38-32.png)
78
+
79
+### Algoritmo LRU (Least Recently Used)
80
+
81
+Descrizione - seleziona come pagina vittima la pagina che è stata usata meno recentemente nel passato
82
+
83
+Considerazioni
84
+
85
+- è basato sul presupposto che la distanza tra due riferimenti successivi alla stessa pagina non vari eccessivamente
86
+- stima la distanza nel futuro utilizzando la distanza nel passato
87
+
88
+Esempio
89
+
90
+- numero di frame in memoria: 3
91
+- numero di page fault: 12 (su 20 accessi in memoria)
92
+
93
+![gestione_mem_2026-03-18_11-40-31](assets/imgs/gestione_mem_2026-03-18_11-40-31.png)
94
+
95
+#### Implementazione LRU
96
+
97
+Nota: E' necessario uno specifico supporto hardware
98
+
99
+La MMU:
100
+
101
+- deve registrare nella tabella delle pagine un time-stamp quando accede ad una pagina
102
+- il time-stamp può essere implementato come un contatore che viene incrementato ad ogni accesso in memoria
103
+
104
+Nota:
105
+
106
+- bisogna gestire l'overflow dei contatori (wraparound)
107
+- i contatori devono essere memorizzati in memoria e questo richiede accessi addizionali alla memoria
108
+- la tabella deve essere scandita totalmente per trovare la pagina LRU
109
+
110
+Implementazione basata su stack
111
+
112
+- si mantiene uno stack di pagine
113
+- tutte le volte che una pagina viene acceduta, viene rimossa dallo stack (se presente) e posta in cima allo stack stesso
114
+- in questo modo:
115
+ - in cima si trova la pagina utilizzata più di recente
116
+ - in fondo si trova la pagina utilizzata meno di recente
117
+
118
+Nota:
119
+
120
+- l'aggiornamento di uno stack organizzato come double-linked list richiede l'aggiornamento di 6 puntatori
121
+- la pagina LRU viene individuata con un accesso alla memoria
122
+- esistono implementazioni hardware di questo meccanismo
123
+
124
+#### Algoritmi a stack
125
+
126
+Definizione:
127
+Data una stringa di riferimenti `s`, si indichi con $S_t(s,A,m)$ l'insieme delle pagine mantenute in memoria centrale al tempo $t$ dell'algoritmo $A$, data una memoria di $m$ frame relativamente alla stringa $s$. Un algoritmo di rimpiazzamento vien detto "a stack" se per ogni istante $t$ e per ogni stringa $s$ si ha:
128
+$$S_t(s,A,m)\subset S_t(s,A,m+1)$$
129
+
130
+In altre parole
131
+
132
+- se l'insieme delle pagine in memoria con m frame è sempre un sottoinsieme delle pagine in memoria con m+1 frame
133
+- Per ogni stringa per ogni tempo per ogni ampiezza di memoria
134
+
135
+Teorema: un algoritmo a stack non genera casi di Anomalia di Belady
136
+![gestione_mem_2026-03-18_11-49-35](assets/imgs/gestione_mem_2026-03-18_11-49-35.png)
137
+
138
+Teorema: l'algoritmo di LRU è a stack:
139
+Ogni riferimento della stringa dei riferimenti sposta la pagina acceduta in cima allo stack, facendo scorrere le successive come indicato nella figura a lato. L’algoritmo LRU tiene in memoria le m pagine in cima allo stack.
140
+L’algoritmo è a stack: l’insieme delle m pagine in cima allo stack è un sotto insieme delle m+1 pagine in cima allo stack.
141
+
142
+#### Stack degli algoritmi di rimpiazzamento: caso generale
143
+
144
+Ogni riferimento della stringa dei riferimenti sposta la pagina acceduta in cima allo stack.
145
+Le pagine scorrono a seconda della loro importanza.
146
+L’algoritmo tiene in memoria le m pagine in cima allo stack  La relazione d’ordine deve dipendere solo dalla stringa di riferimenti e da t
147
+
148
+![gestione_mem_2026-03-18_12-07-49](assets/imgs/gestione_mem_2026-03-18_12-07-49.png)
149
+
150
+#### Algoritmo LRU - Implementazione
151
+
152
+Mantenere le informazione per LRU è troppo costoso
153
+Poche MMU forniscono il supporto hardware per l'algoritmo LRU, alcuni sistemi non forniscono alcun tipo di supporto, e in tal caso l'algoritmo FIFO deve essere utilizzato.
154
+
155
+Reference bit:
156
+
157
+- alcuni sistemi forniscono supporto sotto forma di reference bit
158
+- tutte le volte che una pagina è acceduta, il reference bit associato alla pagina viene aggiornato a 1
159
+
160
+Come utilizzare il reference bit:
161
+
162
+- inizialmente, tutti i bit sono posti a zero dal s.o.
163
+- durante l'esecuzione dei processi, le pagine in memoria vengono accedute e i reference bit vengono posti a 1
164
+- periodicamente, è possibile osservare quali pagine sono state accedute e quali non osservando i reference bit
165
+
166
+Nota: non conosciamo l'ordine in cui sono state usate le pagine ma possiamo comunque usare queste info per \*\*approssimare un algoritmo LRU
167
+
168
+Approssimare LRU: Additional-Reference-Bit-Algorithm
169
+
170
+- possiamo aumentare le informazioni di ordine "salvando" i reference bit ad intervalli regolari (ad es., ogni 100 ms)
171
+- esempio: manteniamo 8 bit di "storia" per ogni pagina
172
+- il nuovo valore del reference bit viene salvato tramite shift a destra della storia ed inserimento del bit come most signif. bit
173
+- la pagina vittima è quella con valore minore; in caso di parità, si utilizza una disciplina FIFO
174
+
175
+![gestione_mem_2026-03-18_12-12-09](assets/imgs/gestione_mem_2026-03-18_12-12-09.png)
176
+
177
+#### Second-chance algorithm
178
+
179
+Conosciuto anche come algoritmo dell'orologio, corrisponde ad un caso particolare dell'algoritmo precedente, dove la dimensione della storia è uguale a 1
180
+
181
+Descrizione
182
+
183
+- le pagine in memoria vengono gestite come una lista circolare
184
+- a partire dalla posizione successiva all'ultima pagina caricata, si scandisce la lista con la seguente regola
185
+- se la pagina è stata acceduta (reference bit a 1)
186
+ - il reference bit viene messo a 0
187
+- se la pagina non è stata acceduta (reference bit a 0)
188
+ - la pagina selezionata è la vittima
189
+
190
+l'idea è semplice:
191
+
192
+- l'algoritmo seleziona le pagine in modo FIFO
193
+- se però la pagina è stata acceduta, gli si dà una "seconda possibilità" (second chance);
194
+- si cercano pagine successive che non sono state accedute
195
+
196
+Se tutte le pagine sono state accedute, degenera nel meccanismo FIFO
197
+
198
+Implementazione:
199
+
200
+- semplice da implementare
201
+- non richiede capacita' complesse da parte della MMU
202
+
203
+Esempio
204
+![gestione_mem_2026-03-18_12-16-08](assets/imgs/gestione_mem_2026-03-18_12-16-08.png)
205
+
206
+#### Altri algoritmi di rimpiazzamento
207
+
208
+**Least frequently used (LFU)**
209
+
210
+- Si mantiene un contatore di accessi ad una pagina
211
+- La frequenza e' il valore del contatore diviso per il "tempo" di permanenza in memoria (es. il numero di accessi con quella pagina presente)
212
+- la pagina con il val minore viene scelta come vittima
213
+
214
+Motivazioni:
215
+
216
+- una pagina utilizzata spesso dovrebbe avere un contatore molto alto
217
+
218
+Implementazione:
219
+
220
+- puo' essere approssimato tramite reference bit
221
+
222
+Problemi
223
+
224
+- se una pagina viene utilizzata frequentemente all'inizio e poi non viene piu usata verra' rimossa dopo molto tempo.
225
+
226
+## Allocazione
227
+
228
+Algoritmo di allocazione (per memoria virtuale): si intende l'algoritmo utilizzato per scegliere quanti frame assegnare ad ogni singolo processo
229
+
230
+Allocazione locale
231
+
232
+- ogni processo ha un insieme proprio di frame
233
+- poco flessibile
234
+
235
+Allocazione globale
236
+
237
+- tutti i processi possono allocare tutti i frame presenti nel sistema (sono in competizione)
238
+- può portare a trashing
239
+
240
+### Trashing
241
+
242
+Un processo (o un sistema) si dice che è in trashing quando spende più tempo per la paginazione che per l'esecuzione
243
+
244
+Cause:
245
+
246
+- in un sistema con allocazione globale, si ha trashing se i processi tendono a "rubarsi i frame a vicenda".Ovvero non riescono a tenere in memoria i frame utili a breve termine (perchè altri processi chiedono frame liberi) e quindi generano page fault ogni pochi passi di avanzamento
247
+
248
+Esempio:
249
+Esaminiamo un sistema che accetti nuovi processi quando il grado di utilizzazione della CPU è basso, se per qualche motivo gran parte dei processi entrano in page fault:
250
+
251
+- la ready queue si riduce
252
+- il sistema sarebbe indotto ad accettare nuovi processi....
253
+- E' UN ERRORE!
254
+
255
+statisticamente, il sistema:
256
+
257
+- genererà un maggior numero di page fault
258
+- di conseguenza diminuirà il livello della multiprogrammazione
259
+
260
+![gestione_mem_2026-03-18_12-29-32](assets/imgs/gestione_mem_2026-03-18_12-29-32.png)
261
+
262
+#### Working set
263
+
264
+Definizione: si definisce working set di finestra Δ l'insieme delle pagine accedute nei più recenti $\delta$ riferimenti
265
+
266
+Considerazione
267
+
268
+- è una rappresentazione approssimata del concetto di località
269
+- se una pagina non compare in $\delta$ riferimenti successivi in memoria, allora esce dal working set; non è più una pagina su cui si lavora attivamente
270
+
271
+Esempio: $\delta$ = 5
272
+
273
+![gestione_mem_2026-03-18_12-31-42](assets/imgs/gestione_mem_2026-03-18_12-31-42.png)
274
+
275
+Se l'ampiezza della finestra è ben calcolata, il working set è una buona approssimazione dell'insieme delle pagine "utili"... Sommando quindi l'ampiezza di tutti i working set dei processi attivi, questo valore deve essere sempre minore del numero di frame disponibili, altrimenti il sistema è in trashing
276
+
277
+Se si sceglie un set ($\delta$) troppo piccolo:
278
+
279
+- si considera non più utile ciò che in realtà serve
280
+- Si sottovaluta il numero di pagine necessarie per il processo
281
+- Falsi negativi di trashing
282
+
283
+Se si sceglie un set ($\delta$) troppo grande:
284
+
285
+- si considera utile anche ciò che non serve più
286
+- Si sopravaluta il numero di pagine necessarie
287
+- Falsi positivi di trashing
288
+
289
+Come si usa il Working Set:
290
+
291
+- serve per controllare l'allocazione dei frame ai singoli processi
292
+- quando ci sono sufficienti frame disponibili non occupati dai working set dei processi attivi, allora si può attivare un nuovo processo
293
+- se al contrario la somma totale dei working set supera il numero totale dei frame, si può decidere di sospendere l'esecuzione di un processo
sistemi/s02/gestione_risorse_deadlock.md
... ...
@@ -0,0 +1,109 @@
1
+## Algoritmo del banchiere
2
+
3
+- un algoritmo per evitare lo stallo sviluppato da Dijkstra (1965)
4
+- il nome deriva dal metodo utilizzato da un ipotetico banchiere di provincia che gestisce un gruppo di clienti a cui ha concesso del credito; non tutti i clienti avranno bisogno dello stesso credito simultaneamente
5
+
6
+### Descrizione
7
+
8
+- un banchiere desidera condividere un capitale (fisso) con un numero (prefissato) di clienti
9
+ - per Dijkstra l'"unità di misura" erano fiorini olandesi
10
+- ogni cliente specifica in anticipo la sua necessità massima di denaro
11
+ - che ovviamente non deve superare il capitale del banchiere
12
+- i clienti fanno due tipi di transazioni
13
+ - richieste di prestito
14
+ - restituzioni
15
+- il denaro prestato ad ogni cliente non può mai eccedere la necessità massima specificata a priori
16
+- ogni cliente può fare richieste multiple, fino al massimo importo specificato
17
+- una volta che le richieste sono state accolte e il denaro è stato ottenuto deve garantire la restituzione in un tempo finito
18
+
19
+### Metodo di funzionamento
20
+
21
+Il banchiere deve essere in ogni istante in grado di soddisfare tutte le richieste dei clienti, o concedendo immediatamente il prestito oppure comunque facendo loro aspettare la disponibilità del denaro in un tempo finito
22
+
23
+#### Dati
24
+
25
+- N: num clienti
26
+- IC: capitale iniziale
27
+- c_i: limite di credito del cliente i (c_i <=IC)
28
+- n_i = c_i-p_i credito residuo del cliente i
29
+- COH= IC - $\sum_{i=1}^N p_i$ saldo di cassa
30
+
31
+#### Definzione: Stato SAFE
32
+
33
+sia s una permutazione dei valori 1...N
34
+
35
+- Esempio: N=4 s=1,2,3,4,2
36
+- indichiamo con s(i) l'iesmia posizione della sequenza
37
+
38
+si calcoli il vettore avail come segue
39
+
40
+$$
41
+avail[1]= COH
42
+avail[j+1] = avail[j] + p_{s(j)}
43
+$$
44
+
45
+con $j=1...N-1$
46
+
47
+Nota: lo stato UNSAFE è condizione necessaria ma non sufficiente per avere deadlock (i.e., un sistema in uno stato UNSAFE può evolvere senza procurare alcun deadlock)
48
+
49
+![gestione_risorse_deadlock_2026-03-11_11-45-25](assets/imgs/gestione_risorse_deadlock_2026-03-11_11-45-25.png)
50
+
51
+![gestione_risorse_deadlock_2026-03-11_11-46-12](assets/imgs/gestione_risorse_deadlock_2026-03-11_11-46-12.png)
52
+
53
+sembra un deadlock ma il realta' il proc 3 ha ricevuto tutti i "soldi" che doveva ricevere e questo significa che puo darli indietro. La sequenza 3,2,1,4,5 esegue tutti i prestiti a compimento
54
+
55
+#### Regola pratica (per il banchiere a singola valuta)
56
+
57
+lo stato SAFE può essere verificato usando la sequenza che ordina in modo crescente i valori di ni.
58
+nfatti, se esiste una sequenza di verificare la safety di uno stato, sicuramente anche la sequenza che ordina i valori di ni consente di fare altrettanto
59
+![gestione_risorse_deadlock_2026-03-11_11-50-42](assets/imgs/gestione_risorse_deadlock_2026-03-11_11-50-42.png)
60
+
61
+#### Esempio stato unsafe
62
+
63
+![gestione_risorse_deadlock_2026-03-11_11-51-09](assets/imgs/gestione_risorse_deadlock_2026-03-11_11-51-09.png)
64
+
65
+![gestione_risorse_deadlock_2026-03-11_11-51-41](assets/imgs/gestione_risorse_deadlock_2026-03-11_11-51-41.png)
66
+
67
+### Banchiere multivaluta
68
+
69
+#### Dati
70
+
71
+![gestione_risorse_deadlock_2026-03-11_11-58-26](assets/imgs/gestione_risorse_deadlock_2026-03-11_11-58-26.png)
72
+
73
+#### Definizione stato SAFE
74
+
75
+![gestione_risorse_deadlock_2026-03-11_12-00-48](assets/imgs/gestione_risorse_deadlock_2026-03-11_12-00-48.png)
76
+
77
+Problema:
78
+
79
+- la regola di ordinare i processi secondo i valori di ni non è applicabile
80
+- l'ordine può essere in generale diverso fra le diverse valute gestite dal banchiere
81
+
82
+Soluzione:
83
+
84
+- si può creare la sequenza procedendo passo passo aggiungendo un processo a caso fra quelli completamente soddisfacibili
85
+- ovvero, al passo j si sceglie quelli per cui ns(j) ≤ avail[j]
86
+
87
+### Teorema
88
+
89
+Se durante la costruzione della sequenza s si giunge ad un punto in cui nessun processo risulta soddisfacibile, lo stato non è SAFE, i.e. non esiste alcuna sequenza che consenta di soddisfare tutti i processi
90
+
91
+Dimostrazione per assurdo:
92
+
93
+supponiamo che lo stato sia SAFE, ovvero che esista la sequenza che consente di soddisfare tutti i processi
94
+
95
+sia C la sequenza interrotta e C' la sequenza che porta allo stato SAFE
96
+![gestione_risorse_deadlock_2026-03-11_12-11-48](assets/imgs/gestione_risorse_deadlock_2026-03-11_12-11-48.png)
97
+
98
+## ALgoritmo dello struzzo
99
+
100
+nascondere la testa sotto la sabbia, ovvero fare finta che i deadlock non si possano mai verificare
101
+
102
+Motivazioni:
103
+
104
+- dal punto di vista ingegneristico, il costo di evitare i deadlock può essere troppo elevato
105
+
106
+Nota:
107
+
108
+- è la soluzione più adottata nei sistemi Unix
109
+- è usata anche nelle JVM
sistemi/s02/memoria.md
... ...
@@ -0,0 +1,190 @@
1
+# Memoria
2
+
3
+Memory manager: la parte del so che gestisce la mem principale si chiama memory manager
4
+
5
+Compiti di un mem manager: tenere traccia della mem libera e occupata, allocare mem ai processi e deallocarla quando non piu necessaria
6
+Nota: in alcuni casi il mem manager puo gestire anche parte della mem secondaria al fine di emulare mem principale
7
+
8
+Nota: il mem manager e' software (la Memory Manager Unit, MMU e'hw)
9
+
10
+## Binding, loading, linking
11
+
12
+Con il termine binding si indica l'associazione di indirizzi logici di mem (nomi di variabili, laber) ai corrispondenti indirizzi fisici.
13
+
14
+il bindig puo avvenire:
15
+
16
+- durante la compilazione
17
+- durante il caricamento
18
+- durante l'esecuzione
19
+
20
+### Binding durante la compilazione
21
+
22
+Gli indirizzi vengono allocati al momento della compilazione e resteranno gli stessi ad ogni exec del programma. Il codice generato e' chiamato **assoluto**
23
+Es: codice per microcontrollori, kernel, file COM, in MS-DOS
24
+
25
+vantaggi
26
+
27
+- non richiede hardware speciale
28
+- semplice
29
+- molto veloce
30
+
31
+svantaggi
32
+
33
+- non funziona con la multiprogrammazione
34
+
35
+### Binding durante il caricamento
36
+
37
+il codice generato dal compilatore non contiene indirizzi assoluti ma relativi (al PC oppure ad un indirizzo base). Il codice divanta **ricollocabile**
38
+
39
+Durante il caricamento il loader si preoccupa di aggiornare tutti i riferimenti agli indirizzi di memoria coerentemente al punto iniziale di caricamento
40
+
41
+vantaggi
42
+ permette di gestire multiprogrammazione
43
+ non richiede uso di hardware particolare
44
+ svantaggi
45
+ richiede una traduzione degli indirizzi da parte del loader, e quindi
46
+formati particolare dei file eseguibili
47
+![memoria_2026-03-11_12-35-34](assets/imgs/memoria_2026-03-11_12-35-34.png)
48
+
49
+vantaggi
50
+
51
+- permette di gestire multiprogrammazione
52
+- non richiede uso di hardware particolare
53
+
54
+svantaggi
55
+
56
+- richiede una traduzione degli indirizzi da parte del loader, e quindi
57
+- iormati particolare dei file eseguibili
58
+
59
+### Binding durante l'esecuzione
60
+
61
+L'individuazione dell'indirizzo di memoria effettivo viene effettuata durante l'esecuzione da un componente hardware apposito: la memory management unit (MMU) (che non e' il memory manager (MM))
62
+
63
+![memoria_2026-03-11_12-37-58](assets/imgs/memoria_2026-03-11_12-37-58.png)
64
+
65
+#### Indirizzi logici e indirizzi fisici
66
+
67
+Spazio di indirizzamento logico:
68
+
69
+- ogni processo è associato ad uno spazio di indirizzamento logico
70
+- gli indirizzi usati in un processo sono indirizzi logici, ovvero riferimenti a questo spazio di indirizzamento
71
+
72
+Spazio di indirizzamento fisico
73
+
74
+- ad ogni indirizzo logico corrisponde un indirizzo fisico
75
+- la MMU opera come una funzione di traduzione da indirizzi logici a indirizzi fisici
76
+
77
+#### Registro di rilocazione
78
+
79
+Se il valore del registro di rilocazione è R, uno spazio logico 0...Max viene tradotto in uno spazio fisico R...R+MAX
80
+
81
+esempio: nei processori Intel 80x86, esistono 4 registri base per il calcolo degli indirizzi (CS, DS, SS, ES)
82
+![memoria_2026-03-11_13-01-58](assets/imgs/memoria_2026-03-11_13-01-58.png)
83
+
84
+#### Registro di rilocazione e limite
85
+
86
+Il registro limite viene utilizzato per implementare meccanismi di protezione della memoria
87
+![memoria_2026-03-11_13-02-48](assets/imgs/memoria_2026-03-11_13-02-48.png)
88
+
89
+Viene controllato che l'indirizzo 897 sia minore o uguale al reg del reg limite (1000) se e'cosi allora va avanti.
90
+
91
+### Loading dinamico
92
+
93
+Consente di poter caricare alcune routine di libreria solo quando vengono richiamate
94
+
95
+Come viene implementato?
96
+
97
+- tutte le routine a caricamento dinamico risiedono su un disco (codice rilocabile), quando servono vengono caricate
98
+- le routine poco utili (e.g., casi di errore rari...) non vengono caricate in memoria al caricamento dell'applicazione
99
+
100
+Nota:
101
+
102
+- spetta al programmatore sfruttare questa possibilità
103
+- il sistema operativo fornisce semplicemente una libreria che implementa le funzioni di caricamento dinamico
104
+
105
+### Linking dinamico
106
+
107
+Linking statico:
108
+
109
+- se il linker collega e risolve tutti i riferimenti dei programmi...
110
+- le routine di libreria vengono copiate in ogni programma che le usa (e.g. printf in tutti i programmi C)
111
+
112
+Linking dinamico:
113
+
114
+- è possibile posticipare il linking delle routine di libreria al momento del primo riferimento durante l'esecuzione
115
+- consente di avere eseguibili più compatti
116
+- le librerie vengono implementate come codice reentrant:
117
+- esiste una sola istanza della libreria in memoria e tutti i processi eseguono il codice di questa istanza
118
+
119
+Vantaggi
120
+
121
+- risparmio di memoria
122
+- consente l'aggiornamento automatico delle versioni delle librerie
123
+- le librerie aggiornate sono caricate alla successiva attivazione dei programmi
124
+
125
+Svantaggi
126
+
127
+- può causare problemi di "versioning"
128
+- occorre aggiornare le versioni solo se non sono incompatibili
129
+- cambiamento numero di revisione e non di release
130
+
131
+Nota: dlopen: consente di caricare librerie dinamiche a run time. E’ il metodo per implementare plug-in
132
+
133
+## Allocazione contigua
134
+
135
+L'allocazione e' una delle funzioni principali del gestore di memoria
136
+Consiste nel reperire e assegnare uno spazio di mem fisica a:
137
+
138
+- un prog che viene attivato
139
+- per soddisfare ulteriori richieste effettuate dai prog durante la loro exec
140
+
141
+Allocazione contigua:
142
+
143
+- tutto lo spazio assegnato ad un processa deve essere formato da celle consecutive
144
+
145
+Allocazione non contigua:
146
+
147
+- è possibile assegnare a un processo aree di memorie separate
148
+
149
+Nota:
150
+
151
+- la MMU deve essere in grado di gestire la conversione degli indirizzi in modo coerente
152
+- esempio: la MMU basata su rilocazione gestisce solo allocazione contigua
153
+
154
+Allocazione Statica:
155
+
156
+- un processo deve mantenere la propria aerea di memoria dal caricamento alla terminazione
157
+- non è possibile rilocare il processo durante l'esecuzione
158
+
159
+Allicazione Dinamica:
160
+
161
+- durante l'esecuzione, un processo può essere spostato all'interno della memoria
162
+
163
+### Allocazione a partizioni fisse
164
+
165
+La memoria disponibile (quella non occupata dal s.o.) viene suddivisa in partizioni. Ogni processo viene caricato in una delle partizioni libere che ha dimensione sufficiente a contenerlo
166
+
167
+Caratteristiche
168
+
169
+- statica e contigua
170
+- vantaggi: molto semplice
171
+- svantaggi: spreco di memoria, grado di parallelismo limitato dal numero di partizioni
172
+
173
+![memoria_2026-03-11_13-33-36](assets/imgs/memoria_2026-03-11_13-33-36.png)
174
+
175
+**Gestione memoria**:
176
+
177
+- è possibile utilizzare una coda per partizione, oppure una coda comune per tutte le partizioni
178
+
179
+**Sistemi monoprogrammati**:
180
+
181
+- esiste una sola partizione, dove viene caricato un unico programma utente
182
+- esempio:
183
+ - MS-DOS free-DOS
184
+ - sistemi embedded
185
+
186
+## Paginazione
187
+
188
+## Segmentazione
189
+
190
+## Memoria virtuale
sistemi/s02/memoria_secondaria.md
... ...
@@ -0,0 +1,231 @@
1
+# Gestione I/O e mem secondaria
2
+
3
+## Dispositivi a blocchi / caratteri
4
+
5
+I dati vengono letti o scritti a blocchi (512-1024 byte)
6
+Raw IO (op di read, write e seek per blocchi)
7
+Accesso tramite filesystem (op di read write e seek su file), il diver fornisce solo accesso raw
8
+Accesso tramite memory-mapped I/O (il contenuto di un file viene mappato in mem, l'accesso avviene tramite istruzioni di load/store del processore)
9
+
10
+Interfaccia di comunicazione a caratteri
11
+
12
+- i dati vengono letti/scritti un carattere alla volta
13
+- raw I/O
14
+ - operazioni di get/put di un singolo carattere
15
+- bufferizzazione
16
+ - lettura/scrittura di “una linea alla volta”
17
+
18
+## Tecniche di gestione dei dispositivi di I/O
19
+
20
+- buffering
21
+- caching
22
+- spooling
23
+- I/O scheduling
24
+
25
+Tre motivazioni per il buffering
26
+ per gestire una differenza di velocità tra il produttore e il
27
+consumatore di un certo flusso di dati
28
+ per gestire la differenza di dimensioni nell'unità di trasferimento
29
+ per implementare la “semantica di copia” delle operazioni di I/O
30
+
31
+Caching
32
+ mantiene una copia in memoria primaria di informazioni che si
33
+trovano in memoria secondaria
34
+ è differente dal buffering
35
+ nel buffer si trova l'unica istanza di un'informazione
36
+ la cache mantiene la copia di un'informazione
37
+
38
+Spool
39
+ è un buffer che mantiene output per un dispositivo che non può
40
+accettare flussi di dati distinti
41
+ ad esempio, stampanti
42
+
43
+## SSD
44
+
45
+Caratterisstiche principali:
46
+
47
+- Non hanno fragilità meccaniche
48
+- Consumano meno energia dei dischi rotazionali
49
+- Hanno un numero massimo di cicli di scrittura
50
+- Velocità lettura > velocità scrittura
51
+- Si legge a blocchi, si scrive a “banchi” (molti blocchi insieme)
52
+- Accesso uniforme su tutto lo spazio di memoria
53
+
54
+## Dischi
55
+
56
+un disco è composto da un insieme di piatti, suddivisi in tracce, le quali sono suddivise in settori
57
+
58
+I dischi sono caratterizzati da tre parametri fondamentali:
59
+
60
+- $r$: la velocità di rotazione, espressa in rpm (revolutions per minute)
61
+- $T_s$: il tempo di seek, ovvero il tempo medio necessario affinchè la testina si sposti sulla traccia desiderata
62
+- $V_r$: la velocità di trasferimento, espressa in byte al secondo
63
+
64
+Il tempo di accesso:
65
+
66
+- è il tempo necessario per leggere un settore del disco, composto da tempo di seek, ritardo rotazionale e tempo di trasferimento
67
+
68
+Ritardo rotazionale:
69
+
70
+- il tempo medio necessario affinchè il settore desiderato arrivi sotto la testina
71
+- è uguale a $1 / 2r$
72
+
73
+Transfer time:
74
+
75
+- dipende dalla quantità di dati b da leggere (supponendo che siano contigui sulla stessa traccia) è uguale a $b/V$
76
+
77
+## Disk Scheduling
78
+
79
+Gestione software dei dischi
80
+
81
+- il gestore del disco può avere numerose richieste pendenti, da parte dei vari processi presenti nel sistema
82
+- il sistema sarà più efficiente se le richieste pendenti verranno evase seguendo un ordine che minimizza il numero di operazioni che richiedono molto tempo (e.g. seek)
83
+
84
+Valori tipici
85
+
86
+- tempo di seek: 8-10 ms
87
+- velocità rotazionale: 5400, 7200, 10000 rpm
88
+
89
+### FCFS
90
+
91
+First Come, First Served (altrimenti detta FIFO)
92
+è una politica di gestione fair, non minimizza il numero di seek, non può mai generare starvation
93
+![memoria_secondaria_2026-03-18_13-21-36](assets/imgs/memoria_secondaria_2026-03-18_13-21-36.png)
94
+
95
+### SSTF
96
+
97
+Shortest Seek Time First, seleziona la richieste che prevede il minor spostamento della testina dalla posizione corrente. Nel caso di equidistanza, la direzione viene scelta casualmente. Può provocare starvation
98
+
99
+![memoria_secondaria_2026-03-18_13-22-45](assets/imgs/memoria_secondaria_2026-03-18_13-22-45.png)
100
+
101
+### LOOK
102
+
103
+Detto anche algoritmo dell'ascensore
104
+Ad ogni istante, la testina è associata ad una direzione, la testina si sposta di richiesta in richiesta, seguendo la direzione scelta. Quando si raggiunge l'ultima richiesta nella direzione scelta, la direzione viene invertita e si eseguono le richieste nella direzione opposta
105
+
106
+Caratteristiche
107
+
108
+- è efficiente
109
+- il tempo medio di accesso al disco non è omogeneo; sono privilegiate le tracce centrali
110
+- è esente da starvation (parzialmente)
111
+
112
+![memoria_secondaria_2026-03-18_13-24-16](assets/imgs/memoria_secondaria_2026-03-18_13-24-16.png)
113
+
114
+### C-LOOK
115
+
116
+Ha lo stesso principio di funzionamento del metodo LOOK, ma la scansione del disco avviene in una sola direzione. Quando si raggiunge l'ultima richiesta in una direzione, la testina si sposta direttamente alla prima richiesta.
117
+
118
+![memoria_secondaria_2026-03-18_13-25-17](assets/imgs/memoria_secondaria_2026-03-18_13-25-17.png)
119
+
120
+#### LOOK e C-LOOK
121
+
122
+Problema
123
+E' possibile che il braccio della testina non si muova per un periodo considerevole di tempo (e.g., se un certo numero di processi continua a leggere sullo stesso cilindro)
124
+
125
+Soluzione
126
+La coda delle richieste può essere suddivisa in due sottocode separate. Mentre il disk scheduler sta soddisfacendo le richieste di una coda, le richieste che arrivano vengono inserite nell'altra. Quando tutte le richieste della prima coda sono state esaurite, si scambiano le due code.
127
+
128
+### RAID
129
+
130
+Problema
131
+
132
+- la velocità dei processori cresce secondo la legge di Moore, la velocità dei dispositivi di memoria secondaria molto più lentamente.
133
+
134
+Considerazioni
135
+
136
+- per aumentare la velocità di un componente, una delle possibilità è quella di utilizzare il parallelismo, l'idea è quella di utilizzare un array di dischi indipendenti, che possano gestire più richieste di I/O in parallelo. Dobbiamo però garantire che i dati letti in parallelo risiedano su dischi indipendenti
137
+
138
+RAID: Redundant Array of Independent Disks
139
+
140
+Standard per l'uso di piu dischi in parallelo, consiste in 7 schemi diversi (0-6) che rappresentano le diverse architetture di distribuzione dei dati.
141
+
142
+Caratteristiche comuni ai sette schiemi:
143
+
144
+- un array di dischi viene visto dal so come un solo singolo disco logico
145
+- dati distribuiti tra i vari dischi dell'array
146
+- la capacita' ridondante dei dischi puo essere usata per mem informazioni di parita' che garantiscono il recovery dei dati in caso di guasti.
147
+
148
+Nota sui guasti: usare piu dischi contemporaneamente aumenta la prob di guasto. RAID offre meccanismi di parita' per contrastare questo problema
149
+
150
+#### RAID 0 (striping)
151
+
152
+No meccanismi di ridondanza.
153
+I dati vengono distribuiti tra i vari dischi.
154
+Vantaggi:
155
+
156
+- se due richieste di I/O riguardano blocchi indipendenti di dati, c'è la possibilità che i blocchi siano su dischi differenti
157
+- le due richieste possono essere servite in parallelo
158
+
159
+\*_Striping_:
160
+
161
+- il sistema RAID viene visto come un disco logico
162
+- i dati vengono suddivisi in strip
163
+- strip consecutivi sono distribuiti su dischi diversi (aumento performance)
164
+
165
+![memoria_secondaria_2026-03-19_15-45-29](assets/imgs/memoria_secondaria_2026-03-19_15-45-29.png)
166
+
167
+**Performance**:
168
+
169
+- per grandi trasferimenti di dati
170
+- per un gran numero di richieste indipendenti: efficiente in particolare se la quantità di dati richiesta è paragonabile alla dimensione degli strip
171
+
172
+Ridondanza: nulla
173
+
174
+#### RAID 1 (mirroring)
175
+
176
+Differisce dagli schemi (1-6) per come la ridondanza e'gestita, ovvero duplicando tutti i dati su due insiemi indipendenti di dischi.
177
+Il sistema e' basato su striping ma uno strip viene scritto su due dischi diversi
178
+Il costo per unita' di mem raddoppia
179
+![memoria_secondaria_2026-03-19_15-51-39](assets/imgs/memoria_secondaria_2026-03-19_15-51-39.png)
180
+
181
+**Performance**:
182
+
183
+- Una richiesta di lettura puo essere servita da uno qualsiasi dei dischi che ospitano il dato
184
+- una richiesta di scrittura deve essre servita da tutti i dischi che ospitano il dato (dipende dal disco con tempo di seek maggiore)
185
+
186
+**Ridondanza**:
187
+
188
+- il recovery e'molto semplice: se un disco si guasta i dati sono accessibili dall'altro disco. E' necessario sostituire il disco guasto e fare una copia del disco funzionante
189
+
190
+#### RAID 4
191
+
192
+Si usa il meccanismo di data striping con strip relativamente grandi
193
+Strip di parita':
194
+
195
+- viene calcolato uno strip di parita' a partire dagli stri di dati corrispondenti, calcolato bit per bit
196
+- lo strip di parita' viene posto sul disco di parita'
197
+
198
+![memoria_secondaria_2026-03-19_15-57-31](assets/imgs/memoria_secondaria_2026-03-19_15-57-31.png)
199
+
200
+**Lettura (in assenza di guasti)**
201
+
202
+- si individua lo strip corrispondente e si effettua la lettura dello strip
203
+
204
+**Lettura (in presenza di guasti)**
205
+
206
+- si individua lo strip corrispondente; se il disco corrispondente è guasto, si effettua la lettura di tutti gli strip rimasti e tramite il disco di parità di ottiene lo strip mancante
207
+
208
+**Scrittura (in assenza di guasti)**
209
+
210
+- quanti strip devono essere coinvolti?
211
+- a prima vista, si direbbe tutti (lo strip dati da scrivere, tutti gli altri strip da leggere, lo strip di parità in scrittura)
212
+
213
+![memoria_secondaria_2026-03-19_16-09-15](assets/imgs/memoria_secondaria_2026-03-19_16-09-15.png)
214
+
215
+#### RAID 5
216
+
217
+Come RAID 4 ma i blocchi di parita' sono sparsi tra i vari dischi
218
+Il vantaggio e'che non esiste un disco di parita' che diventa un bottleneck
219
+![memoria_secondaria_2026-03-19_16-15-25](assets/imgs/memoria_secondaria_2026-03-19_16-15-25.png)
220
+
221
+#### RAID 6
222
+
223
+Come RAID 5 ma si usano due strip di parita' invece di uno
224
+il vantaggio è che non esiste un disco di parità che diventa un bottleneck
225
+
226
+![memoria_secondaria_2026-03-19_16-18-00](assets/imgs/memoria_secondaria_2026-03-19_16-18-00.png)
227
+
228
+#### RAID 6
229
+
230
+Come RAID 5, ma si utilizzano due strip di parità invece di uno
231
+Aumenta l'affidabilità (è necessario il guasto di tre dischi affinché i dati non siano recuperabili)
sistemi/s02/traccia_studio.md
... ...
@@ -0,0 +1,163 @@
1
+SEZIONE 1: domande piu' frequenti: (da
2
+https://www.notion.so/Sistemi-Operativi-parte-generale-f0d316b793d84a5bbb83874f2361faef
3
+)
4
+
5
+Q: Dimostrare che se un algoritmo di rimpiazzamento è a stack allora non può soffrire dell’anomalia di Belady.
6
+ R: in slide 5: memoria
7
+
8
+Q: Come si calcola la lunghezza massima di un file in un file system di tipo UNIX?
9
+ R: in slide 7: filesystem
10
+
11
+Q: Nello scheduler di tipo Shortest Remaining TIme First (versione preemptive di STF: Shortest time first), il tempo residuo può diventare negativo. Perché?
12
+ R: in slide 3: scheduling. la formula (addizione) nelle slide e' usata per stimare il tempo, ma la formula {tempo rimanente = tempo previsto meno tempo rilevato} e' quella per ordinare i processi (diversa da quella per stimare i tempi). quest'ultima puo' ritornare un numero negativo
13
+
14
+Q: L'algoritmo del banchiere dato uno stato di allocazione delle risorse restituisce un valore binario: safe o non safe. In quali casi il sistema operativo esegue l'algoritmo del banchiere? Cosa succede se il risultato è safe e cosa se il risultato è non-safe?
15
+ R: in slide 4: risorse
16
+
17
+Q: perché l'invenzione degli interrupt ha reso i sistemi operativi più efficienti?
18
+ R: ha eliminato il polling (controllare continuamente le periferiche).
19
+ ha reso possibile il multitasking grazie alla preemption: la fine del time slice e' dato da un interrupt, che causa il OS di prendere il controllo della CPU e spostare il processo in attesa di I/O nello stato "ready" che, appena la CPU si libera, puo' riprendere.
20
+
21
+Q: Quali eventi causano la valutazione dell'algoritmo del banchiere? Cosa si fa se lo stato risulta unsafe e cosa invece se è safe?*
22
+ R: quando un processo chiede risorse, quando inizia e, eventualmente, anche quando finisce, per valutare se un altro puo' iniziare
23
+
24
+Q: L'algoritmo di rimpiazzamento second chance (detto anche dell'orologio) è a stack? Perché viene preferito a LRU?
25
+ R: non e' a stack poiche' e' basato su quello fifo. viene preferito in quanto piu' facile da implementare: richiede solo un reference bit per pagina, che puo' essere implementata via hardware
26
+
27
+Q: per risolvere un problema di trashing è necessario terminare forzatamente dei processi o è sufficiente bloccare l'esecuzione di qualche processo e riattivarli successivamente? Perché?
28
+ R: e' necessario terminarli perche' i processi sospesi non liberano la memoria principale, quindi continueranno ad esserci page faults
29
+
30
+Q: in quali casi entra in funzione il paginatore in un sistema di memoria virtuale e quando viene richiamato l'algoritmo di rimpiazzamento?
31
+ R: l'MMU viene chiamato quando ci sono page faults e quando bisogna tradurre indirizzi virtuali in indirizzi fisici. l'algoritmo di rimpiazzamento viene chiamato quando c'e' un page fault ma non c'e' nessun frame libero
32
+
33
+Q: Il calcolo del working set dipende dall'algoritmo di rimpiazzamento utilizzato? Perché?
34
+ R: no: il working set consiste delle pagine utilizzate durante la finestra di tempo. alcuni algoritmi usano il working set, sostituendo le pagine che non vi appartengono, gli altri non lo usano
35
+
36
+Q: perché per realizzare un servizio di memoria virtuale l'algoritmo di rimpiazzamento LRU è difficile da implementare?
37
+ R: il tracking dell'uso delle pagine comporta overhead (ogni accesso in memoria richiede l'update di una data structure), bisogna gestire l'overflow dei contatori (wraparound), la tabella deve essere scandita totalmente per trovare la pagina LRU. tutto questo comporta accessi addizionali in memoria.
38
+
39
+Q: Come si calcola la lunghezza massima di un file che si può memorizzare su un file system di tipo ext2?
40
+ R: Max File Size=(Numero di puntatori diretti+Numero di puntatori indiretti singoli+Numero di puntatori indiretti doppi+Numero di puntatori indiretti tripli)×Dimensione del blocco
41
+
42
+Q: Fornire un elenco di incongruenze che possono venir rilevate dal fsck (file system check) applicato a file
43
+system di tipo UNIX (e.g. ext2, bffs). Per ogni tipo di incongruenza indicare come viene riscontrata e con quali
44
+operazioni il fsck può ripristinare la coerenza.
45
+ R: - Blocchi Liberi Contati in Modo Errato (Corrupted Free Block Count): fsck calcola il numero effettivo di blocchi liberi nel file system sommando tutti i blocchi non allocati. Questo valore viene poi confrontato con il contatore dei blocchi liberi memorizzato nel superblocco del file system. Se i due valori non corrispondono, c'è un'incongruenza. ripristino: fsck corregge il contatore dei blocchi liberi nel superblocco, impostandolo sul valore calcolato.
46
+ - Inconsistenze negli Inode come il caso di Inode con Conteggio dei Link Errato (Bad Link Count in Inode). Ogni inode contiene un contatore del numero di hard link che puntano ad esso. fsck scandisce tutte le directory per contare quanti riferimenti (link) effettivi esistono per ciascun inode e confronta questo conteggio con il valore memorizzato nell'inode. ripristino: aggiorna il contatore al numero effettivo di riferimenti.
47
+ - Blocchi Duplicati. Due o più inode puntano allo stesso blocco di dati. Questo significa che una modifica a un "file" influenzerà anche un altro "file" inaspettatamente, o che i dati di un blocco sono logicamente parte di più file. fsck rileva che un blocco è referenziato da più inode. Chiederà all'utente come procedere: Copiare il blocco duplicato in una nuova posizione o svuotare uno degli inode coinvolti, rendendo il file di fatto "vuoto" o troncato o rimuovere uno degli inode coinvolti.
48
+ - Blocchi Invalidi o Fuori Limite (Invalid Blocks or Out-of-Bounds Blocks). Un inode punta a un blocco di dati che è fuori dai limiti del file system (ad esempio, un blocco con un numero maggiore della dimensione totale del file system) o a un blocco che non dovrebbe essere allocato (es. blocco 0). ripristino: fsck contrassegna l'inode come danneggiato e tenta di rimuovere il riferimento al blocco invalido. Questo può portare alla troncamento del file o alla sua eliminazione se il blocco invalido era critico.
49
+ - Inconsistenze nelle Bitmap. I file system UNIX utilizzano bitmap per tenere traccia dei blocchi liberi (bitmap dei blocchi) e degli inode liberi (bitmap degli inode): Blocco Marcato come Libero ma in Uso: fsck rileva che un blocco è referenziato da un inode (quindi è in uso), ma la bitmap dei blocchi liberi lo indica come libero. ripristino: fsck aggiorna la bitmap dei blocchi, marcando il blocco come in uso; Blocco Marcato come in Uso ma Libero: fsck rileva che un blocco non è referenziato da alcun inode (quindi è libero), ma la bitmap dei blocchi liberi lo indica come in uso. ripristino: fsck aggiorna la bitmap dei blocchi, marcando il blocco come libero. Questo può recuperare spazio su disco; Inode Marcato come Libero ma in Uso; Inode Marcato come in Uso ma Libero
50
+
51
+___
52
+
53
+SEZIONE 2: argomenti che si prestano a esercizi (algoritmi...):
54
+
55
+ - algoritmi di scheduling, 3 - scheduling, p. 45, TDM
56
+ - condizioni di deadlock e grafo di Holt, 4 - risorse, p. 14
57
+ - algoritmo del banchiere, 4 - risorse, p. 44
58
+ - paginazione, segmentazione e frammentazione, 5 - memoria, p. 23
59
+ - allocazione dinamica di memoria, 5 - memoria, p. 23, TDM
60
+ - algoritmi di rimpiazzamento, 5 - memoria, p. 69, TDM
61
+ - disk scheduling, 6 - secondaria, p. 15, TDM
62
+ - raid, 6 - secondaria, p. 25
63
+ - allocazione, 7 - filesystem, p. 29, TDM
64
+ - gestione spazio libero, 7 - filesystem, p. 43, TDM
65
+___
66
+
67
+SEZIONE 3: TDM
68
+
69
+ - algoritmi di scheduling
70
+ First Come, First Served -> Shortest Job First/Shortest Next CPU Burst First -> SJF approssimato non preemptive/preemptive
71
+ -> Round Robin
72
+ -> Round Robin (altre implementazioni)
73
+ -> con priorita' statica/dinamica
74
+ -> con aging
75
+ -> con classi di priorita'
76
+ -> Multilivello -> Real-Time hard/soft
77
+
78
+ - algoritmi di rimpiazzamento
79
+ Fifo -> MIN -> Least Recently Used -> a Stack -> Reference bit -> Additional Reference Bit Algorithm -> Second-chance (dell'orologio) -> Least Frequently Used
80
+
81
+ - disk scheduling
82
+ First Come, First Served -> Shortest Seek Time First -> LOOK (dell'ascensore) -> C-LOOK -> LOOK con sottocode
83
+
84
+ - allocazione
85
+ contigua -> concatenata -> FAT ->
86
+ -> indicizzata
87
+ -> i. (altre implementazioni)
88
+ -> con concatenazione di blocchi indice
89
+ -> con indice multilivello
90
+ -> Unix
91
+ -> miglioramenti
92
+ -> pre-caricamento
93
+ -> combinazione contigua (file piccoli) e indicizzata (grandi) (real world example: ext4)
94
+
95
+ - gestione spazio libero
96
+ Mappa di bit -> Lista concatenata -> Lista concatenata di blocchi
97
+
98
+___
99
+
100
+SEZIONE 4: domande per ripassare tutta la teoria:
101
+
102
+in slide 1: arch-hw
103
+Q: cos'e' il DMA?
104
+Q: in che modo si possono gestire interrupt multipli?
105
+Q: perche' esiste la modalita' kernel e quella utente? cosa sono le syscall?
106
+
107
+in slide 2: arch-sw
108
+Q: di cosa e' responsabile l'OS nei confronti della memoria principale?
109
+Q: di cosa e' responsabile l'OS nei confronti della memoria secondaria?
110
+Q: di cosa e' responsabile l'OS nei confronti del filesystem?
111
+Q: come possono essere suddivisi gli os in base alla loro struttura? perche' gli os hanno strutture diverse? quali sono i vantaggi dei diversi approcci? quale modello segue UNIX?
112
+Q: quali sono i tipi di kernel? quale problema risolvono i microkernel?
113
+Q: quali funzionalita' offre un microkernel? su cosa e' basata la comunicazione?
114
+
115
+in slide 3: scheduling
116
+Q: cos'e' il PCB? quali informazioni contiene?
117
+Q: cos'e' lo schedule?
118
+Q: cos'e' un context switching? in quali fasi consiste?
119
+Q: modelli di multithreading. qual e' il migliore?
120
+Q: scheduler non-preemptive e preemptive. qual e' il vantaggio di quello non-preemptive? quale viene utilizzato oggi?
121
+Q: throughtput, turnaround
122
+Q: memorizza algoritmi (p. 46)
123
+
124
+in slide 4: risorse
125
+Q: 2 metodi per deadlock detection
126
+Q: 4 metodi di deadlock prevention
127
+Q: teorema dell'algoritmo del banchiere. dimostrazione (da memorizzare)
128
+
129
+in slide 5: memoria
130
+Q: cos'e' il binding? quando puo' avvenire?
131
+Q: frammentazione interna e esterna. come risolvere la f. esterna?
132
+Q: quali tipi di allocazione dinamica ci sono?
133
+Q: nell'allocazione dinamica, quanti tipi di selezione del blocco libero ci sono?
134
+Q: in cosa consiste la paginazione?
135
+Q: cos'e' il tlb?
136
+Q: cos'e' la segmentazione?
137
+Q: quali algoritmi di rimpiazzamento ci sono?
138
+Q: cos'e' il supporto tramite reference bit?
139
+Q: cos'e' l'algoritmo di allocazione?
140
+Q: cos'e' il trashing? e il working set?
141
+
142
+in slide 6: secondaria
143
+Q: parametri dei dischi
144
+Q: algoritmi di gestione dei dischi
145
+Q: RAID: acronimo? tipi?
146
+Q: dimostrare la scrittura di RAID 4 necessita del coinvolgimento di soli 3 strip
147
+Q: cos'e' RAID 10? e RAID 01? e RAID 50?
148
+
149
+in slide 7: filesystem
150
+Q: che cos'e' l'MBR?
151
+Q: che cos'e' il superblock?
152
+Q: tipi di allocazione di memoria ci sono per i file?
153
+Q: tipi di gestione dello spazio libero?
154
+Q: come funzionano le directories? qual e' il contenuto delle directory entries?
155
+Q: com'e' gestito il problema della lunghezza dei nomi dei file?
156
+Q: cos'e' fsck?
157
+ R: una utility unix per verificare se le directory puntano a inode illegali, per "curare" incoerenza dovuta al caching
158
+Q: come funzionano i log?
159
+
160
+in slide 8: sicurezza (materiale2324)
161
+Q: che cos'e' il salt?
162
+Q: che cos'e' l'ACL?
163
+Q: che cos'e' la capability?