76a519dc3ebdd2257e90f1ea94221fea32fdb637
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 | + |
|
| 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 | + |
|
| 23 | + |
|
| 24 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 87 | + |
|
| 88 | + |
|
| 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 | + |
|
| 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 | +  |
|
| 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 | + |
|
| 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 | +  |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 317 | + |
|
| 318 | + |
|
| 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 | + |
|
| 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 | + |
|
| 352 | + |
|
| 353 | +#### Esercizio: |
|
| 354 | + |
|
| 355 | + |
|
| 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 | + |
|
| 393 | + |
|
| 394 | + |
|
| 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 | + |
|
| 103 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | +  |
|
| 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 | +  |
|
| 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 | + |
|
| 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 | + |
|
| 19 | + |
|
| 20 | +imma dx: virtualizzazione di sistema |
|
| 21 | +immagine a sx: virtualizzazione a liv di processo |
|
| 22 | + |
|
| 23 | + |
|
| 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 | + |
|
| 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 | +  |
|
| 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 | + |
|
| 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 | + |
|
| 162 | + |
|
| 163 | +utte le volte che un processo entra nel sistema, viene posto in una delle code gestite dallo scheduler |
|
| 164 | + |
|
| 165 | + |
|
| 166 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 282 | + |
|
| 283 | +#### Many-to-Many Multithreading |
|
| 284 | + |
|
| 285 | +Riassume i benefici di entrambe le architetture |
|
| 286 | +Supportato da Solaris, IRIX, Digital Unix |
|
| 287 | + |
|
| 288 | + |
|
| 289 | +## Scheduling |
|
| 290 | + |
|
| 291 | +Per rapp uno schedule si usano i diagrammi di Gantt |
|
| 292 | + |
|
| 293 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | +  |
|
| 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 | +  |
|
| 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 | +  |
|
| 420 | + |
|
| 421 | +Media esponenziale |
|
| 422 | + |
|
| 423 | +- svolgendo la formula di ricorrenza, si ottiene da cui il nome media esponenziale |
|
| 424 | +  |
|
| 425 | + |
|
| 426 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 319 | + |
|
| 320 | +**Attenzione**: |
|
| 321 | +La presenza di un ciclo nel caso di Holt non è condizione sufficiente per avere deadlock |
|
| 322 | + |
|
| 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 | + |
|
| 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 | + |
|
| 347 | + |
|
| 348 | + |
|
| 349 | + |
|
| 350 | + |
|
| 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 | + |
|
| 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 | + |
|
| 55 | + |
|
| 56 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 44 | + |
|
| 45 | +- numero di frame in memoria: 3 |
|
| 46 | +- numero di page fault: 9 (su 12 accessi in memoria) |
|
| 47 | + |
|
| 48 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 50 | + |
|
| 51 | + |
|
| 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 | + |
|
| 60 | + |
|
| 61 | +#### Esempio stato unsafe |
|
| 62 | + |
|
| 63 | + |
|
| 64 | + |
|
| 65 | + |
|
| 66 | + |
|
| 67 | +### Banchiere multivaluta |
|
| 68 | + |
|
| 69 | +#### Dati |
|
| 70 | + |
|
| 71 | + |
|
| 72 | + |
|
| 73 | +#### Definizione stato SAFE |
|
| 74 | + |
|
| 75 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 83 | + |
|
| 84 | +#### Registro di rilocazione e limite |
|
| 85 | + |
|
| 86 | +Il registro limite viene utilizzato per implementare meccanismi di protezione della memoria |
|
| 87 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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 | + |
|
| 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? |