Sistemi Operativi
Cos’è un sistema operativo e cosa deve fare?
Il Sistema Operativo possiamo definirlo come un:
Interfaccia, cioè un programma che agisce da intermediario tra noi
utenti e l’hardware di un computer (all’inizio senza il SO era difficile
interagire con il dispositivo).
Allocatore di Risorse, gestisce e assegna le risorse così da non avere
conflitti tra i vari programmi che le richiedono.
Controllore, controlla l’esecuzione dei programmi in modo da prevenire
errori e proteggere hardware e software.
Non sempre sui pc è in esecuzione tutto il codice del Sistema Operativo, molte
volte viene caricata solo una parte che viene chiamata Kernel (tutto il resto è
un insieme di programmi di sistema e\o applicativi)
All’accensione o al riavvio del nostro pc viene caricato un primo programma
che carica il programma di bootstrap, un programma (memorizzato in una
ROM o in una EPROM) che inizializza lo stato del sistema, spostando il codice
del Kernel del SO (se serve altro viene caricato) da un certo indirizzo del disco
alla RAM (infatti il SO è conservato sul disco, quando viene eseguito viene
caricato in RAM), e ne avvia l’esecuzione. Il SO viene caricato nella RAM perché
è molto veloce.
Nascita dei Sistemi Operativi
Sistemi Mainframe: Computer di grandi dimensioni che inizialmente non
avevano Sistemi Operativi, venivano programmati tramite spinotti. Su questi
computer si caricava un programma alla volta, e operavano in sequenza.
Il problema di questi pc era il tempo che intercorreva tra la fine di un
programma (Job), e l’altro. Si implementò quindi l’Automatic job sequencing,
cioè il trasferimento automatico del controllo da un job all’altro.
Nasce così il primo SO chiamato Monitor Residente
Monitor = controllo
Residente = sempre in esecuzione
In un sistema Batch Semplice, in memoria centrale sono presenti solo il SO e
il programma.
In un sistema Batch Multi programmato, in memoria centrale abbiamo il SO
e diversi job. Ogni programma viene eseguito a pezzi e la CPU passa da
programma a programma. In questo tipo di sistema se un programma richiede
un’operazione di input o output, il SO aspetta fino ad un certo tempo dopodiché
esegue un altro programma.
Come fa a riconoscere le operazioni di I/O il SO?
Per eseguire le operazioni di I/O, vengono inviate delle richieste al SO .
Per la multiprogrammazione un SO deve:
Routine di I/O -> fornite dal sistema
Memory management -> il sistema deve allocare la memoria ai job
CPU scheduling -> il sistema deve scegliere tra più job pronti ad essere
eseguiti attraverso delle strategie.
Allocazione dei devices ai job, quando si esegue un programma e gli
viene assegnato un dispositivo di I/O questa assegnazione deve essere
esclusiva.
Sistemi Time-Sharing
Sistemi multiprogrammati, la CPU è assegnata di volta in volta ai diversi
programmi che sono tenuti in programma. Un programma caricato (dal disco
alla memoria e viceversa) e in esecuzione è detto processo.
In questi tipi di sistemi accade che un programma può essere interrotto perché
finisce la sua quantità di tempo, anche se dobbiamo fare altre operazioni.
I moderni sistemi di calcolo sono costituiti da:
Controllori = piccole CPU che gestiscono i dispositivi del computer a
livello hardware
Driver = Delle interfacce del sistema operativo, i driver sono dei
componenti software e fanno parte del SO
Nei sistemi moderni i dispositivi di I/O e CPU lavorano insieme, perché tutti i
controller sono delle piccole CPU e possiedono delle piccole memorie RAM.
Quando un processo deve fare un’operazione di I/O, viene messo in sleeping e
abbiamo la CPU libera per poter “accogliere” un nuovo processo. I controller e
la CPU possono eseguire operazioni in parallelo.
In un’operazione di output —> il dato si muove da una memoria centrale (RAM)
al buffer locale. In uni operazione di input —> il dato si muove dal buffer locale
alla RAM.
Il controller di ogni dispositivo deve informare la CPU che ha completato le
operazioni con un segnale asincrono chiamato Interrupt.
I sistemi operativi sono guidati dagli interrupt, perché tutti le interazioni tra le
diverse componenti sono guidati da questi. Quando arriva il segnale, il controllo
passa alla routine di servizio, che può essere hardware o software. Questo
avviene perché al vettore degli interrupt è associato un indirizzo, cioè ad ogni
interrupt è associato l’indirizzo della routine. Ogni produttore di CPU
programma gli interrupt e ne lascia alcuni liberi che possono essere
programmati da chi implementa il SO. Ogni dispositivo continua a lavorare
normalmente, quando arriva l’interrupt viene completata l’operazione e va a
servire l’interrupt. Ricordiamo che gli interrupt vengono serviti uno alla volta.
Trap = un interrupt che segnala l’errore avvenuto in un programma.
Signal = anche in questo caso facciamo riferimento agli interrupt software.
Ci sono due modi per gestire l’I\O:
Sincrono: Dopo che è stata avviata un’operazione di I\O, il controllo
ritorna al programma utente soltanto dopo il completamento
dell’operazione di I\O.
In questa modalità abbiamo l’istruzione wait che sospende il processo
fino a quando non arriva un interrupt che dice che l’operazione di I/O è
stata completata.
Asincrono: Dopo che è stata avviata l’operazione di I\O, il controllo torna
al programma utente senza attendere il completamento delle operazioni
di I\O. In questo caso abbiamo bisogno:
System Call, richiesta al sistema operativo per attendere il
completamento dell’operazione di I\O;
Tabella di stato dei dispositivi, contiene elementi per ogni
dispositivo di I\O che indica il suo tipo, indirizzo della routine
e lo stato del dispositivo, il sistema operativo accede alla
tabella per determinare lo stato del dispositivo e modificare
la sua descrizione.
Per ottimizzare e velocizzare il PC si è introdotto sulla scheda madre un
componente hardware che è il DMA, un componente che gestisce gli interrupt
meno importanti.
Il DMA:
Trasferisce file con una velocità simile a quelle della memoria
Riceve degli interrupt intermedi dovuti all’invio di dati a blocco.
La CPU gestisce solo gli interrupt di fine blocco.
In un PC ci sono:
Memoria centrale (RAM), celle di memoria accessibili direttamente
dalla CPU
Memoria secondaria, in grado di memorizzare grandi quantità di dati.
Questo tipo di memoria è persistente. In passato realizzata tramite dei
dischi magnetici, la superficie dei dischi è diviso in tracce, a loro volte
suddiviso in settori. In ogni disco abbiamo un controller per determinare
l’interazione tra il dispositivo e il computer. Oggi si usano le SSD, che
sono dei banchi di memoria, che hanno una serie di vantaggi
Per questo abbiamo una struttura di questo tipo:
registri: memoria più veloce e più piccola in un computer, si trovano
dentro la CPU e servono ad eseguire le operazioni
cache: è una memoria più piccola della RAM e più veloce e serve a
velocizzare l’esecuzione
memoria centrale RAM
disco RAM: integra dispositivi hardware, si copia tutto quello che si
trova in RAM anche nel disco, per rendere affidabili i dati in caso di
guasti
dischi magnetici: dispositivo fisico
dischi ottici: nastri magnetici: dispositivo fisico utilizzato per il
backup. Sono nastri a tutti gli effetti
Catching: copia dei dati in memorie più veloci, la memoria centrale può essere
vista come una cache per la memoria secondaria.
Principio importante realizzato a diversi livelli di un computer
L’informazione in uso è copiata temporaneamente da memoria più lente
a memorie più veloci (cache).
La cache viene interrogata per verificare se contiene l’informazione di
interesse:
In caso positivo, l’informazione è acceduta direttamente dalla
o cache
Altrimenti, i dati vengono copiati nella cache e acceduti da lì
o
La cache è più piccola della memoria principale
La gestione delle cache è un importante problema progettuale nei
o SO.
Dimensione della cache e politiche di sostituzione.
o
Protezione Hardware
Per proteggere l’hardware:
Funzionamento Dual-Mode
Protezione dell’I\O
Protezione della Memoria
Protezione della CPU
Protezione Dual-Mode
Quando si esegue un programma, questo si può trovare “in uno dei due modi
possibili”:
modalità utente —> può eseguire certe istruzioni, accedere a certe
•
risorse, ma non può eseguirle o accedere a tutte. Quindi restringe le
libertà dei programmi per evitare che queste facciano danni al SO o
all’hardware.
• modalità monitor —> sta eseguendo delle operazioni privilegiate, può
accedere a quasi tutte le risorse. Il SO ha dunque maggiore libertà.
Per indicare il modo corrente si usa un Bit di modo:
0 -> monitor (si richiedono delle operazioni nel sistema)
1 -> utente
Si passa dalla modalità utente alla modalità monitor solo quando esegue delle
routine del S.O.
Attenzione: Le istruzioni privilegiate possono essere eseguite soltanto
nel modo monitor.
Protezione dell’I/O
Tutte le operazioni di I/O sono privilegiate.
Se le operazioni di I/O venissero eseguite in modalità utente, un programma
utente potrebbe ottenere il controllo del computer in modo monitor. Per questo
usiamo le System Call, che sono come dei metodi di sistema che nel mio
programma posso richiamare quando voglio.
Protezione della memoria
Se è presente un solo programma quello che succede è che si può prende tutta
la memoria che rimane libera dal sistema operativo. Con più programmi,
bisogna avere varie aree di memoria per i molteplici programmi e ogni
programma deve modificare o leggere dalla sua area di memoria, perché se va
nelle altre aree di memoria sorgono dei problemi.
Per evitare questi problemi si usano due registri:
• base —> mi dice dove inizia la memoria di un programma e dove
finisce, quindi l’area della RAM associata al programma.
• limite —> mi dice quanto è grande la memoria - all’infuori
dell’intervallo l’area di memoria deve essere protetta.
I due registrano controllano che quando si accede all’area di memoria si possa
effettivamente accedere all’interno dello spazio. Questo oggi lo fa direttamente
l’hardware.
Usare quei due registri, vuol dire seguire un algoritmo. Quando dalla CPU parte
l’indirizzo per andare a prendere una variabile in memoria bisogna controllare:
• l’indirizzo del dato
• se si trova nella base
• se rispetta il limite
• solo se rispetta queste condizioni può accedere alla memoria
Protezione Hardware
Quando il sistema operativo è in esecuzione in modo monitor può accedere a
tutte le celle di memoria. Per evitare che un programma possa cambiare i valori
dei registri base e limite, queste operazioni vengono eseguite solo dal sistema
operativo in modalità monitor
Protezione CPU
È fondamentale che un processo non occupi tutto il tempo della CPU, perciò si
setta un Timer. Ad ogni processo viene associato un tempo massimo, quando il
tempo finisce, verrà inviato un interrupt per sospendere il processo. Il Timer
viene decrementato ad ogni tick di clock.
Il caricamento del Timer è un’istruzione privilegiata, quindi, è il SO che decide il
valore del timer.
Anni fa, studiando i processori hanno rilevato delle anomalie nella protezione,
infatti sono sorti due problemi:
Meltdown -> Durante l’esecuzione di un programma, per velocizzare il
processo, la CPU mentre controllava i privilegi di memoria, leggeva e
salvava i dati in memoria. Se l’istruzione non aveva i privilegi corretti, i
dati finivano comunque nelle cache e potevano essere estratti attraverso
degli attacchi al sistema.
Spectre -> Per velocizzare i processi, gli sviluppatori caricavano
entrambi i rami (if ed else) in memoria. Solo dopo aver verificato la
condizione si sceglieva se prendere l’if o l’else, ma i dati rimanevano
comunque nella cache. Venivano creati dei programmi in grado di
estrarre questi dati.
Struttura dei Sistemi Operativi
Gestione dei processi
Gestione della memoria principale
Gestione file
Gestione I/O
Gestione memoria secondaria
Accesso alla Rete
Sistema di protezione
Interprete dei comandi
1. Gestione dei processi
Un processo di elaborazione è un programma dell’utente o del SO in
esecuzione.
Un processo ha bisogno di un certo numero di risorse per svolgere il suo
compito.
Il Kernel del SO è responsabile della:
Creazione e terminazione il processo
Sospensione e ripristino il processo
Sincronizzazione e Comunicazione tra i vari processi
Gestione dello stallo, più processi in esecuzione possono andare in stallo
in attesa di un qualcosa che non arriva
2. Gestione della memoria centrale
La memoria centrale è costituita da una matrice di word (dati o istruzioni). Ogni
programma per essere eseguito deve essere caricato sulla RAM, perché il disco
è molto più lento.
Il SO che si occupa della gestione della memoria principale è responsabile di:
Tenere traccia di quali parti della memoria sono correntemente utilizzate
e da chi
Decidere quali processi caricare quando la memoria si rende disponibile
Allocare e deallocare lo spazio in memoria
3. Gestione dei File (File System)
Il file è un’unità logica di informazione (che può avere tante o poche
informazioni) conservato sul disco. Per aprire un file il SO prima lo cerca nel
disco, e poi lo carica in memoria.
Il SO è responsabile della creazione e cancellazione file o directory (insieme di
file)
4. Gestione dell’I/O
Il sistema I/O che fa parte del SO, gestisce tutte le operazioni tra la CPU e le
periferiche.
I tre elementi fondamentali sono:
sistema buffer-caching: ogni dispositivo di I/O deve avere una sua
cache, perché i dati devono essere salvati nella memoria (tipo la tastiera
quando clicchiamo invio).
driver: componente software dei dispositivi I/O. Possono essere aggiunti
dopo la creazione del sistema operativo. I driver vengono collegati al SO
SO: usato come interfaccia per i driver esistenti o quelli che saranno
aggiunti in seguito, è l’unica parte che si può aggiungere dopo
l’installazione del s.o.
5. Gestione della memoria secondaria
Oggi la memoria secondaria è fatta principalmente da dischi (l’altra
tecnologia sono i nastri, che si usano in casi particolari di backup)
Il SO si occupa di:
Allocazione della memoria
Gestione della memoria libera
Scheduling del disco: Quando più programmi in esecuzione
effettuano richiesta di accesso al disco contemporaneamente, il disco
accoda le richieste e vengono servite una per volta.
6. Accesso alla Rete
7. Sistema di protezione: Oltre alla protezione hardware, il SO aggiunge
altre protezioni software, come la protezione sui file. Oggi questa
sicurezza riguarda più la rete
8. Interprete dei comandi: Il SO cattura il comando (per esempio un
click), controlla la correttezza ed esegue l’operazione.
System Call (Chiamate al sistema)
Chiamata = invocazione di un metodo offerto dal SO in un qualsiasi linguaggio
Servono al programmatore per utilizzare le funzioni del SO all’interno di un
programma, come delle librerie esterne (per esempio la creazione di un file,
operazioni in memoria e.c.c.).
Vengono chiamate API tutte le System Call messe a disposizioni da Windows.
Le system call vengono invocate da un programma utente (programma scritto
da un programmatore), in seguito si passa ad una fase di controllo dove il mio
programma viene interrotto e cambia il bit di modo.
I parametri tra il programma utente e il SO vengono passati tramite:
1. Passaggio dei parametri in registri -> il nome del file che voglio
creare viene messo in un registro specifico dal quale la system call lo
deve prelevare
2. Tabella memoria centrale -> area riservata nella RAM dove avvengono
passaggi dei parametri
3. Push/Pop -> si basa sullo stack, che è riservato al passaggio dei
parametri tra SO e programmi
Le system call del SO riguardano le diverse funzionalità del sistema, come:
Controllo dei processi;
Gestione dei file;
Gestione dei dispositivi di I\O,
Informazioni sul sistema
Comunicazioni
Tutte le routine di sistema sono basate sulle System Call.
Progettazione dei Sistema Operativi
Per gli utenti, il SO dovrebbe essere conveniente da usare, facile da
apprendere, affidabile, sicuro e veloce.
Per chi sviluppa il sistema, il SO deve essere facile da progettare e manutenere,
flessibile, affidabile, libero di errori ed efficiente.
Per questo prima della progettazione vengono definiti prima le politiche e poi i
meccanismi (cioè come implementarlo)
All’inizio i SO erano sviluppati in assembler, oggi l’approccio è cambiato, la
parte che interagisce con l’hardware è scritta in assembler mentre la parte più
alta sono sviluppati con linguaggi ad alto livello, aumentando così la portabilità
del SO.
Esempi di SO
MS-DOS
è un s.o. utilizzato all’inizio degli anni 80 di tipo mono programmato.
I programmi che girano sul DOS:
girano su programmi offerti da MS-DOS
o fanno invocazioni
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.
-
Sistemi Operativi
-
Sistemi operativi - Appunti teoria
-
Soluzione teoria Sistemi operativi
-
Teoria di Sistemi operativi