Sistemi operativi Università di Bologna
Appunti lezione + slide + libro
- Introduzione
- Richiami architettura
- Organizzazione S.O.
- Processi
- Thread
- CPU Scheduling
- Concorrenza e comunicazione
- Memory management
- Memoria virtuale
- File system
- Crittografia e sicurezza
2022/2023
Introduzione
Componenti del sistema informatico
1. Componenti hardware: al livello più basso troviamo risorse fisiche informatiche di base assemblate (CPU, memoria, dispositivi I/O).
2. Sistema operativo: al livello sopra, programma che funge da intermediario tra utente e hardware, controlla e coordina utilizzo dell’hardware tra vari programmi applicativi per vari utenti.
Obiettivi:
- Eseguire programmi utente e risolvere problemi degli utenti
- Rendere sistema informatico più facile da usare
- Utilizzare hardware in modo efficiente
Il sistema operativo agisce come una macchina astratta/virtuale per facilitare ai livelli superiori l’accesso alla nostra macchina. Fornisce un'interfaccia ai livelli superiori che hanno una visione astratta della nostra macchina, la stessa visione per ogni macchina anche se sono macchine fisicamente diverse.
Le memorie di massa diverse implicano modi diversi e istruzioni di iterazioni diverse, e il programma dovrebbe essere cosciente di questo per effettuare la visualizzazione in ogni tipo di terminale. Renderebbe il compito della scrittura del programma troppo difficile, e questi programmi perderebbero la possibilità di portabilità importante. Il sistema operativo permette di accedere all’hardware secondo modalità standard stabilite.
API = insieme di operazioni system call primitive ma non sono linguaggio macchina.
Il sistema operativo deve anche gestire risorse hardware: se ci sono attività che vogliono girare nella macchina, hanno bisogno di risorse e per girare devono essere in memoria centrale e occorre avere controllo del processore (risorsa hardware più importante della macchina). Se gira è perché il processore esegue operazioni.
Il sistema operativo deve ottimizzare l'uso delle risorse, soprattutto quelle più importanti. Ottimizzare significa assicurarsi che se due attività girano non si ostacolano o danneggiano l'una con l’altra: un programma non deve occupare le stesse celle di memoria dell’altro programma e non deve leggere celle di memoria dell’altro programma (sicurezza) a meno che non sia previsto.
Un aspetto importante del sistema operativo è la gestione delle attività e la convenienza d’uso, ovvero rendere facile agli utenti o programmi di livello superiore l’utilizzo della macchina, aspetto importante soprattutto in macchine piccole.
Altro aspetto del S.O.: è un programma che non termina mai, devono girare sempre. S.O. non sono sempre esistiti, prima c’erano macchine enormi con interruttori e switch e l'utilizzatore doveva settare a mano ogni switch per decidere configurazioni di memoria interna da cui partire e poi macchina eseguiva. I sistemi operativi sono nati per facilitare l’uso. Un po’ di memoria viene utilizzata per S.O. per aiutare utenti.
3. Programmi applicativi: definisce modi in cui le risorse del sistema vengono usate per risolvere problemi informatici degli utenti (compilatori, sistemi di database, videogiochi).
4. Utenti: persone, macchine, altri computer.
Definizioni del sistema operativo
➢ Allocatore di risorse: gestisce e alloca le risorse.
➢ Programma di controllo: controlla l'esecuzione dei programmi utente e operazioni dei dispositivi I/O.
➢ Kernel: l'unico programma sempre in esecuzione.
Multiprogrammed batch systems
Diversi lavori vengono mantenuti nella memoria principale contemporaneamente. La CPU è multiplexata tra di loro. Invece, il layout di memoria per un sistema batch semplice ha solo S.O. e user program area.
S.O. necessari per eseguire più attività nello stesso momento o una sola unità di calcolo: quindi, in ogni istante, unica istruzione eseguita ma ci sono un po’ di istruzioni di un programma, un po’ di un altro programma. Il processore era inattivo la maggior parte del tempo: spreco di tempo, quindi multiprogrammazione sfrutta il fatto che il processore è veloce e usa i periodi in cui il processore non fa nulla per fare altre attività.
Funzionalità del S.O. necessarie per la multiprogrammazione:
- Routine di I/O fornita dal sistema.
- Gestione della memoria: il sistema deve allocare la memoria a diversi lavori.
- Pianificazione della CPU: il sistema deve scegliere tra diversi lavori pronti a eseguire.
- Allocazione dei dispositivi.
Con l'interattività arriva l'esigenza di responsive, ovvero reattività della macchina. Quando un utente lancia un comando, la macchina deve eseguirlo subito. Per soddisfare questa richiesta si deve fare un passo oltre la multiprogrammazione, perché se ho attività di calcolo intenso che usa tanto processore e magari questa attività ha un bug ed entra in loop, il S.O. non riesce più ad interrompere perché tanto vede che il processore è in funzione. Invece, grazie al time sharing, si accetta un cambio di contesto quindi cambio tra attività non solo quando un’attività ha finito di usare il processore, ma anche quando questa è stata sul processore oltre ad un certo tempo. Quando entra nel processore parte un timer e se il processo è ancora in esecuzione quando termina il timer, invia un messaggio al S.O. che blocca il processo in esecuzione e ne fa partire un’altra.
Time sharing system
Sistemi di condivisione del tempo: calcolo interattivo.
Personal computer systems
Sistemi personali informatici:
- Personal computer = sistema informatico dedicato a un singolo utente.
- Dispositivi I/O: tastiere, mouse, schermi, piccole stampanti.
- Comodità e reattività dell'utente.
- Può adottare la tecnologia sviluppata per sistemi operativi più grandi, spesso gli individui hanno il solo uso del computer e non hanno bisogno di un utilizzo avanzato delle funzioni di protezione della CPU.
Sistemi paralleli
Nei sistemi multiprocessore o strettamente connessi, abbiamo più di un processore (CPU) che condividono la stessa memoria centrale e di massa, canali di comunicazione all’interno del calcolatore (bus) e timer dei cicli di macchina (clock). Questa situazione complica il lavoro del S.O. che deve decidere su quali di questi processori far girare vari processi, controllare questi processi e far sì che i processori siano tenuti occupati il più possibile.
Inoltre, il S.O. deve gestire più processori che usano la stessa memoria perché potrebbe esserci problema quando più processori usano le stesse celle di memoria o condividono strutture dati. Tightly coupled system (sistema strettamente accoppiato): i processori condividono la memoria e la comunicazione avviene solitamente attraverso la memoria condivisa.
Vantaggi sistemi paralleli:
- Maggiore produttività (throughput): aumentando il numero di unità d’elaborazione è possibile svolgere un lavoro maggiore in meno tempo (ma non vuol dire che n CPU aumentano velocità di n volte, aumenta in misura minore).
- Economico: se più programmi devono operare sullo stesso insieme di dati, è economicamente più conveniente registrarli in dischi condivisi da tutte le unità d’elaborazione, piuttosto che avere più calcolatori con i rispettivi dischi locali e più copie degli stessi dati.
- Maggiore affidabilità: se c’è guasto di alcune CPU non si blocca il sistema, semplicemente rallenta perché ciascuna delle unità d’elaborazione rimanenti assume su di sé parte del lavoro che svolgevano le unità d’elaborazione guaste, quindi l'intero sistema non si ferma, ma funziona a una velocità ridotta. Degradazione controllata = capacità di continuare a offrire un servizio proporzionalmente commisurato, per qualità, ai dispositivi ancora in funzione. Degradazione controllata dei sistemi fail-soft = sistemi progettati in modo da degradare progressivamente le prestazioni, salvaguardando per quanto possibile l’esecuzione delle operazioni più importanti, a fronte di avarie o malfunzionamenti di parti del sistema.
Altri sistemi vanno oltre la degradazione controllata e vengono definiti sistemi tolleranti ai guasti (fault-tolerant) perché, nonostante subiscano danneggiamento di un singolo componente, continuano ugualmente a funzionare. La resistenza ai guasti necessita di un meccanismo per il riconoscimento del danno, la sua diagnosi e, se è possibile, la riparazione.
I sistemi multiprocessore attualmente in uso sono di due tipi:
1. Multielaborazione asimmetrica: nei sistemi estremamente grandi solitamente si impiega la (Asymmetric multiprocessing, AMP): a ogni processore è assegnato un compito specifico e si ha un’unità d’elaborazione (processore) principale che controlla il sistema, mentre le altre attendono istruzioni da questa unità principale oppure hanno compiti predefiniti. Questo schema definisce una relazione gerarchica: unità d’elaborazione principale organizza e assegna il lavoro alle unità d’elaborazione secondarie. Processori di diverso tipo: primo processore ed altri più piccoli e meno potenti che seguono attività di quello principale.
2. Multielaborazione simmetrica: nei S.O. più comuni/moderni si ricorre alla (Symmetric multiprocessing, SMP), in cui ogni processore è abilitato al compimento di tutte le operazioni del sistema. I processori sono sullo stesso piano di parità, non vi è subordinazione gerarchica. Processori di stesso tipo struttura di tipo simmetrico.
Sistemi real time
Altra categoria di macchine: sistemi integrati funzionano quasi sempre con l’obbligo di rispettare vincoli di tempo definiti con precisione: l'elaborazione deve avvenire entro questi limiti, altrimenti il sistema va in crisi.
Le prestazioni di un sistema real-time sono soddisfacenti solo se esso genera il risultato corretto rispettando precise scadenze. Un sistema operativo real time è spesso utilizzato come dispositivo di controllo in un'applicazione dedicata come controllo di esperimenti scientifici, sistemi di immagini mediche, sistemi di controllo industriale e alcuni sistemi di visualizzazione.
Esempio: per lo streaming è necessario che flusso di immagine sia continuo senza interruzioni. Esempio: sensori del robot devono reagire in un certo modo in un certo lasso di tempo, non dopo che ha urtato o creato già danni. Il fatto che vi siano vincoli temporali che devono essere rispettati porta al S.O. un nuovo problema.
Distinguiamo sistemi:
– Hard real time system (sistema rigido in tempo reale)
- Memoria secondaria limitata o assente, dati archiviati nella memoria a breve termine o memoria di sola lettura (ROM)
- Conflitti con sistemi di multiproprietà, non supportati da sistemi operativi generici.
– Soft real time system (sistema soft in tempo reale)
- Utilità limitata nel controllo industriale o nella robotica
- Utile nelle applicazioni (multimedia, realtà virtuale) che richiedono funzionalità avanzate del sistema operativo.
Sistemi distribuiti
Sistema distribuito = insieme di elaboratori collocati a distanza con caratteristiche spesso eterogenee, interconnessi da una rete di calcolatori per consentire agli utenti l’accesso alle varie risorse dei singoli sistemi. L’accesso a una risorsa condivisa aumenta: la velocità di calcolo, la funzionalità, la disponibilità dei dati e il grado di affidabilità.
I sistemi distribuiti si basano sulle reti (= canale di comunicazione tra due o più sistemi) per realizzare le proprie funzioni: sfruttano capacità di comunicazione per cooperare nella soluzione dei problemi di calcolo e per fornire agli utenti un ricco insieme di funzioni. Distribuiscono il calcolo tra diversi processori fisici.
Le reti differiscono tra loro per:
- Protocolli usati: più diffuso protocollo di comunicazione è TCP/IP
- Distanze tra i nodi; reti si classificano secondo la distanza tra nodi: LAN (rete locale) comprende nodi all’interno della stessa stanza/piano/edificio, WAN (rete geografica) gruppi di edifici/città/territorio stato o regione.
- Mezzo attraverso il quale avviene la comunicazione.
Affinché un sistema operativo possa gestire un protocollo di rete è necessaria la presenza di un dispositivo d’interfaccia. Sistema loosely coupled: ogni processore ha la propria memoria locale. I processori comunicano tra loro attraverso varie linee di comunicazione, come bus ad alta velocità o linee telefoniche.
Vantaggi dei sistemi distribuiti:
- Condivisione delle risorse
- Accelerazione del calcolo/condivisione del carico
- Affidabilità
- Comunicazioni
Struttura interna dei calcolatori (richiami architettura)
Funzionamento del sistema di calcolo: un moderno calcolatore d’uso generale è composto da una CPU e da un certo numero di controllori di dispositivi connessi attraverso un canale di comunicazione comune (bus) che permette l’accesso alla memoria condivisa dal sistema. Un evento è di solito segnalato da un’interruzione dell’attuale sequenza d’esecuzione della CPU, che può essere causata da:
1. Interrupt dispositivo fisico: segnale d’interruzione (interrupt) = segnali che i controllori dei dispositivi e altri elementi dell’architettura possono inviare alla CPU, di solito attraverso il bus di sistema. Ogni volta che riceve un segnale d’interruzione, la CPU interrompe l’elaborazione corrente e trasferisce immediatamente l’esecuzione a una locazione fissa della memoria.
2. Exception programma: segnale di eccezione (trap) può essere causata da un programma in esecuzione a seguito di un evento eccezionale, riconosciuto tramite l’architettura della CPU (esempio: divisione per zero o un accesso alla memoria non valido) oppure a seguito di una richiesta specifica effettuata da un programma utente per ottenere l’esecuzione di un servizio del S.O., attraverso una speciale istruzione detta system call (chiamata di sistema o chiamata supervisore (supervisor call, SVC)).
Interrupt
Funzioni comuni degli interrupt:
- Gli interrupt trasferiscono il controllo alla routine del servizio di interrupt generalmente, attraverso il vettore di interruzione, che contiene indirizzi di tutte le routine di servizio.
- L'architettura degli interrupt deve salvare l'indirizzo dell'interrupt istruzione.
- Gli interrupt in arrivo sono disabilitati mentre è in corso un altro interrupt elaborato per prevenire un interrupt perso.
- Un trap è un interrupt generato dal software causato da un errore o una richiesta dell'utente.
- Un sistema operativo è guidato da interrupt.
Gestione degli interrupt
Il S.O. preserva lo stato della CPU memorizzando registri e il contatore del programma. Determina quale tipo di interrupt si è verificato:
- Polling
- Sistema di interrupt vettoriale
Segmenti di codice separati determinano l'azione da eseguire per ogni tipo di interruzione.
Struttura I/O
Parte del codice di un S.O. è dedicata alla gestione dell’I/O. Un calcolatore generale è composto da CPU e controllori connessi mediante bus. Inoltre:
- I dispositivi I/O e la CPU possono essere eseguiti contemporaneamente per operare in modo concorrente contendendosi i cicli di accesso alla memoria: la sincronizzazione degli accessi alla memoria è garantita dalla presenza di un controllore di memoria.
- Ciascun controller di dispositivo è responsabile/si occupa di un particolare tipo di dispositivo e può gestire uno o più dispositivi ad esso connessi.
- Ogni controller dispone di una propria memoria interna di transito detta buffer locale e di insieme di registri specializzati.
- La CPU sposta i dati dalla/alla memoria principale ai/dai buffer locali. Il controller è responsabile del trasferimento dati tra i dispositivi periferici ad esso connessi e il proprio buffer.
- I S.O. in genere possiedono, per ogni controller, un driver del dispositivo che si coordina con il controller e funge da interfaccia uniforme con il resto del sistema.
Per avviare l'operazione di I/O il driver del dispositivo carica i registri interessati all’interno del controllore che esamina i contenuti di questi registri per scegliere l’azione da intraprendere. Il controller inizia a trasferire dati dal dispositivo al proprio buffer e, terminato il trasferimento, il controller del dispositivo informa il driver di aver finito l’operazione tramite un’interruzione. Il driver passa il controllo alla CPU restituendo i dati o le informazioni di stato.
Dopo l'avvio dell'I/O, il controllo ritorna al programma utente solo dopo il completamento dell’I/O:
- L'istruzione WAIT rende la CPU inattiva fino al prossimo interrupt.
- WAIT LOOP (ciclo di attesa): contesa per l'accesso alla memoria.
- È in sospeso al massimo una richiesta di I/O alla volta: no elaborazione simultanea di I/O.
Dopo l'avvio dell'I/O, il controllo ritorna al programma utente senza attendere il completamento dell'I/O. System call Chiamata di sistema: richiesta al S.O. di autorizzare l'utente a compiere operazioni a esso riservate per conto del programma utente per attendere il completamento dell'I/O. È gestita dalla CPU come un’interruzione.
Tabella device-status: contiene la voce per ciascun dispositivo I/O, indicando il tipo, l'indirizzo e lo stato.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.