Introduzione al sistema operativo
Sistema operativo: Insieme di programmi con lo scopo di gestire in modo ottimale le risorse del calcolatore e facilitare l’uso a programmatori e ad utenti finali l’utilizzo della macchina sottostante.
Differenza tra software base e applicativo
- Software di base: Particolari software che hanno il compito di gestire risorse del sistema, facilitare l’uso delle stesse ai programmatori, abilitare l’uso delle risorse e delle sue componenti ad un utente (esempi: SO, DBMS, compilatori).
- Software applicativi: Applicazioni con le esigenze di assolvere determinati compiti per gli utenti finali (esempi: word, posta elettronica).
Concetti importanti
- Tempo di turnaround: Intervallo di tempo che intercorre tra l’istante di tempo in cui si sottopone un processo e l’istante di tempo in cui termina l’esecuzione dello stesso.
- CPU time: Quantità di tempo utilizzato dalla CPU per eseguire un determinato processo.
- Throughput: Numero di processi eseguiti in un intervallo di tempo T.
- Response time: Intervallo di tempo che intercorre tra l’istante di tempo in cui si sottopone un processo e l’istante di tempo in cui si ottiene una prima risposta dal sistema.
- Multiprogrammazione: Coesistenza temporanea di più processi in memoria centrale, ottimizzando l’uso della CPU adottando meccanismi che consentono di svincolarla con dispositivi di I/O.
- Interrupt: Segnale elettrico inviato da un dispositivo esterno al microprocessore (precisamente al controller). L’interrupt consente al processore di interrompere le attività in corso e di eseguirne altre.
Componenti di un sistema operativo
Il sistema operativo, oltre a porsi come interfaccia tra hardware e software applicativi, fornisce diverse funzioni che lo contraddistinguono, ognuna delle quali è svolta da un particolare componente.
- Processes manager: Si occupa della gestione dei processi, come la loro creazione e cancellazione, sospensione e risveglio e della loro sincronizzazione.
- Memory manager: Si occupa della gestione della memoria sia fisica che virtuale, ossia permette di reperire informazioni salvate o in memoria centrale o su disco.
- File system: Componente che si preoccupa di memorizzare e recuperare informazioni opportunamente strutturate su un dispositivo di memorizzazione secondario.
- I/O services: Si occupa di predisporre le comunicazioni tra dispositivi di input output.
- Communication: Gestisce le comunicazioni tra processi, programmi di dati condivisi.
- Error manager: Gestisce eventuali errori nelle diverse funzioni svolte.
- Protezione e sicurezza: Il SO deve difendersi da una serie di abusi volontari o involontari che possono intaccare il sistema (esempio: programmi che accedono a porzioni di memoria riservata).
Modalità di esecuzione di un processo
Un modo per proteggere le informazioni è la modalità di esecuzione di un processo:
- Kernel mode: Il codice di esecuzione ha accesso all’intero Instruction Set Architecture dell’hardware. Può accedere a qualunque dispositivo e far riferimento a qualsiasi indirizzo in memoria. Errori in questa modalità possono causare il blocco del sistema. Il sistema operativo, ossia il kernel, è l’unica risorsa che opera in modalità kernel.
- User mode: Il processo in esecuzione non ha alcuna possibilità di accedere direttamente in alcun modo con l’hardware sottostante se non attraverso delle syscall (chiamate di sistema).
System call
Funzioni implementate nel SO che possono essere usate da processi, come delle procedure. L’indirizzo della syscall è presente in una tabella del kernel, ed eseguendo la particolare chiamata l’esecuzione viene cambiata in modalità Kernel. Ogni system call è definita da:
- Un numero che identifica la sua istruzione.
- L’insieme di parametri in ingresso.
Microkernel
È un kernel di sistema operativo che contiene solo i servizi indispensabili per il funzionamento dell’intero sistema:
- Gestore processi
- Meccanismo di comunicazione tra processi
- Gestore messaggi
Vantaggi: Kernel molto contenuto, di facile manutenzione.
Svantaggi: Prestazioni.
Processi
Con il termine processo denotiamo l’esecuzione di un programma; i processi sono tra loro scorrelati, ossia le risorse di ciascun processo sono private.
Sistema mono-programmato
Viene eseguito un processo alla volta, non viene eseguito un nuovo processo finché quello in esecuzione non è terminato.
Sistema multi-programmato
Presenza contemporanea di più processi, deve essere introdotto un meccanismo che consente di cambiare l’esecuzione con un altro processo.
Context-switch
Sospensione di un processo in esecuzione, a favore di un altro processo che verrà eseguito a quello precedente. Quando viene effettuato un context-switch vengono salvate tutte le informazioni sufficienti in modo tale da ripristinare il processo precedente nello stato in cui era prima di essere sospeso.
Mode-switch
Transazione da user a kernel mode durante l’esecuzione del processo (esempio quando si effettua una chiamata di sistema). Durante queste transizioni il kernel salva le informazioni necessarie per riprendere l’esecuzione al momento in cui è stato sospeso. Tempo mode-switch << Tempo context-switch.
Informazioni di un processo
Per identificare un processo:
- Identificatore del processo
- Identificatore processo padre
- Identificatore dell’utente che ha generato il processo
Per identificare lo stato del processo:
- Ricordare registri processore
- PC, EFLAGS e Stack Pointer (associato al processo)
- Variabili di stato (flag interrupt, execution mode)
Per identificare il control information:
- Process state: running, ready, waiting, halted
- Priorità scheduling
- Informazioni per l’algoritmo di scheduling (permanenza nel Sistema, tempo CPU)
- Identificativo di cui l’evento è in attesa
- Campi strutture dati e variabili comunicazione tra processi, ed eventuali privilegi concessi
- Gestione della memoria: tabella pagine o segmenti
- Risorse utilizzate: file creati e/o aperti
Un processo è un’attività che deve essere creata, cambia nel tempo e alla fine termina.
Creazione del processo
Viene creato a seguito di una richiesta esplicita da parte dell’utente oppure da richiesta di un altro processo (esempio: fork()), oppure ancora durante l’inizializzazione del sistema.
Terminazione del processo
Le condizioni che fanno terminare il processo possono essere:
- Terminazione normale
- Scadenza del tempo di permanenza nel sistema
- Memoria non disponibile
- Violazione di protezioni
- Errori durante l’esecuzione
Schema degli stati del processo
Esecuzione dell’Interrupt:
- Interrupt controller segnala l’occorrenza di un interrupt, e passa il numero dello stesso (vettore)
- Il processore usa il vettore dell’interrupt per decidere quale handler attivare
- Il processore interrompe il processo corrente, PROC, e decide quale attivare
- Il processore salta a interrupt handler
- Quando l’interrupt è stato gestito, lo stato di PROC viene ripristinato e viene ripresa l’esecuzione da cui era stato sospeso
Comando fork()
Il comando fork() crea una copia del processo chiamante. Al termine dell’esecuzione dell’istruzione saranno in esecuzione due processi: il processo chiamante e un processo figlio da lui generato. Il processo figlio eredita dal padre una copia esatta di:
- Codice, stack, heap, program counter, variabili globali e file descriptor
Riceve invece un nuovo:
- PID, time, signals, file locks
Fork() restituisce:
- -1 in caso di errore
- 0 al processo figlio
- Il PID del figlio al processo padre
Scheduling dei processi
Scheduler: Processo di sistema che si occupa di:
- Gestire tutti i processi: selezionare quale processo eseguire in stato di ready, terminazione, sospensione, interruzione.
- Gestione di quanto tempo lasciare eseguire un determinato processo
- Evitare sprechi di tempo di CPU durante I/O
Criteri adottati per scegliere il processo da eseguire:
- Da quanto tempo il processo è stato caricato
- Quanto tempo di CPU ha usato recentemente il processo
- Quanto è grande il processo
- Quanto è importante
Caratteristiche di uno scheduler ideale:
- Minimizzare latenze di tempo di risposta
- Massimizzare il throughput
- Massimizzare l’uso delle risorse, mantenendo sempre tutti i dispositivi occupati
- Imparzialità tra i processi, nessuno dei quali deve rimanere bloccato
Modalità di utilizzo dello scheduler
- User oriented: Tempo di risposta ottimale, migliorare tempo che intercorre tra avvio del processo e del suo primo output.
- System oriented: Uso efficiente delle risorse del sistema.
Tipologie di algoritmi utilizzati
Gli algoritmi che vengono utilizzati dagli scheduler si dividono in due grosse categorie:
- Preemptive: Algoritmi che prevedono la possibilità di sospendere momentaneamente i processi in esecuzione per eseguirne altri.
- Non-preemptive: Un processo in esecuzione mantiene l’uso della CPU sino al naturale completamento dello stesso, sua terminazione.
Lo scheduling può avvenire quando viene effettuata una particolare transizione di stati dei processi:
- Da running a waiting (es: I/O richiesta)
- Da running a ready
- Da waiting a ready (es: I/O completato)
- Terminato
Algoritmi di scheduling
- FCFS: First Come First Service
- SJF: Shortest Job First
- RR: Round Robin
Algoritmo FCFS (First Come First Service)
Algoritmo non-preemptive, di facile implementazione, con average time molto variabile, generalmente non ottimizzato: dipendente dai tempi di esecuzione dei processi in coda (da non usare in sistemi interattivi).
Algoritmo SJF (Shortest Job First)
Algoritmo che presuppone la conoscenza del tempo di esecuzione di ciascun processo, ciascuno dei quali ha uguale importanza. La CPU viene assegnata con il tempo di esecuzione minore. Nella versione preemptive: Shortest Remaining Time Next, all’arrivo di un nuovo processo si rivaluta l’ordine di esecuzione e la scelta corrente garantendo il minor tempo di attesa.
Algoritmo RR (Round Robin)
Scheduling circolare, di tipo preemptive, in cui ad ogni processo di esecuzione viene affidato un tempo di esecuzione per la CPU detto quanto. Terminato il quanto, il processo se non ha terminato la sua esecuzione, viene rimesso in coda.
Dimensione del quanto:
- Quanto di tempo troppo breve: scarsa efficienza CPU
- Quanto di tempo troppo lungo: RR diventa un FCFS
Diverse tipologie di scheduling
Scheduling con priorità: La priorità assegnata a un processo varia nel tempo in funzione della sua permanenza nel sistema e del tempo di CPU consumato.
Scheduling a code multiple:
- A due code separate:
- Foreground (processi che interagiscono con l’utente, spesso in attesa di input)
- Background (processi eseguiti indipendentemente dall’interazione con l’utente)
- A due algoritmi separati:
- Foreground: RR
- Background: FCFS
Sistemi real time
La correttezza del sistema non dipende solo dai risultati dei singoli processi, ma anche dagli istanti di tempo in cui questi risultati sono prodotti. I processi reagiscono ad eventi esterni, e devono essere gestiti in tempo debito.
Concetto di determinismo: Ogni operazione deve essere svolta in un lasso di tempo predeterminato. L’intervallo di tempo di risposta ad un interrupt deve essere superiormente limitato.
- Context switch molto veloce
- Dimensione del sistema contenuto
- Velocità di risposta ad interrupt esterni
- Multitasking con interprocess communication (semafori, signals ed eventi)
- Files in grado di memorizzare grosse quantità di dati ad alta velocità
Threads
Ogni processo è costituito da un unico thread of control che determina le possibili sequenze di esecuzione delle istruzioni (control flow: ordine in cui sono eseguite le istruzioni del processo, fissato l’input). Nell’ambito del control flow le istruzioni sono eseguite sequenzialmente.
Un processo può essere:
- Single threaded: Equivalente alla nozione di processo
- Multiple threaded: All’interno dello stesso processo coesistono più thread of control che possono essere eseguiti in parallelo, ossia sovrapposti nel tempo (ogni componente chiamata thread).
Cosa condividono i thread
Ogni thread può accedere a ciascun indirizzo all’interno dello spazio di indirizzamento del processo a cui appartiene. I thread all’interno del processo condividono:
- Process ID
- Spazio degli indirizzi, codice (istruzioni) e dati non locali
- Segnali e signals handlers
Cosa NON condividono i thread
- Thread ID
- L’insieme dei registri, compresi ProgramCounter e StackPointer
- Stack variabili locali e record attivazione
- Maschera signal
Perché usare i threads
- Migliorano le prestazioni di un sistema (tempi risposta ottimizzati, miglior sfruttamento risorse)
- Rendono più semplice la parallelizzazione di applicazioni
- Migliorano la struttura del programma
- Le creazioni e la distruzione dei threads sono generalmente più efficienti rispetto alla gestione di processi separati
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
-
Appunti di Sistemi operativi
-
Real Time Sistemi operativi
-
Appunti Sistemi Operativi