Sistema operativo
Un sistema operativo è un programma che funziona da mediatore (interfaccia) tra l’utente e l’hardware del computer
• L’OS serve principalmente ad organizzare e allocare le risorse, a controllare l’esecuzione dei programmi dell’utente e le operazioni delle periferiche I/O
• L’OS per evolversi deve adattarsi ai miglioramenti hardware e ai nuovi tipi di hardware, deve offrire nuove servizi e necessita una nuova interfaccia.
Il kernel è un programma che funziona sempre. La Shell una volta risiedeva nel kernel, ma ora è solo un utility esterna.
Nei sistemi remoti l’operatore utilizzava grandi macchine controllate da una console, doveva programmarlo usando nastri cartacei o schede perforate dato che nel computer non vi erano supporti che leggevano dischi. I software usati erano Assemblers, librerie di comuni subroutines, drivers delle periferiche, compilatori e collegatori (software per collegare tra loro parti e dati di un programma)
Il batch , sistema utile per raggruppare una serie di comandi per evitare la loro ripetitiva digitazione, utilizzava linguaggi high-level e nastri magnetici. Per creare un batch l’utente doveva presentare la procedura, scritta su schede o nastri, all’operatore del computer che colloca il batch di numerose informazioni nella periferica input; quindi un speciale programma, il dispositivo di controllo, gestisce l’esecuzione di ciascuno dei programmi nel batch.
Uniprogramming fino ad ora
• Le operazioni I/O sono estremamente lente, in confronto all’esecuzione delle informazioni.
• Un programma contenente anche poche operazioni I/O, spende la maggior parte del suo tempo aspettando queste
• La CPU viene usata poco quando nella memoria è presente solo un programma
Multiprogramming :
• Nella memoria sono tenuti contemporaneamente più jobs e la CPU è multiplexata tra loro
• Se la memoria può tenere dei programmi, la CPU può switchare a un altro anche quando il programma sta aspettando un I/O da completare
• Il multiprogramming permette di eseguire un altro programma mentre un programma deve aspettare la periferica I/O
Time Sharing System (TSS):
• TSS é un Multiprogramming interattivo, in quanto permette al Batch del Multiprogramming di occuparsi di più jobs interattivi
• Più utenti accedono simultaneamente al sistema attraverso dei terminali
• Il tempo del processore è ripartito tra gli utenti
• Infatti poiché il tempo di reazione umano è lento (un utente in media ha bisogno di 2 secondi di time processing per minuto), si è permesso a molti utenti di usare il sistema senza un notevole ritardo di risposta del computer
• Per utilizzare il sistema tramite il TSS si deve creare una connessione on-line tra utente e sistema. Quando il sistema operativo finisce l’esecuzione di un comando, ne cerca un altro dal keyboard dell’utente.
Real-Time Systems (RTS):
• Gli RTS sono sistemi che hanno bisogno di aderire alle deadline, i.e., time constraints
• La correttezza della computazione dipende non solo dal risultato logico, ma anche dal tempo in cui i risultati sono formulati
Architettura del sistema operativo
Gestione del processo:
• Un processo è un programma in esecuzione.
• Un processo deve allocare risorse: CPU time, memoria, periferiche I/O
• Il sistema operativo è responsabile della creazione, eliminazione, sincronizzazione e comunicazione dei processi.
Gestione della memoria:
• L’OS decide quale processo caricare nella memoria e si segna quale punto della memoria è correntemente usato e da chi.
• Con la Memoria Virtuale parte di programmi e dati vengono tenuti in blocchi di dati nell’hard disk
Gestione dei Files:
• Un file è una collezione di informazioni collegate definite dal suo creatore. Comunemente i files rappresentano programmi e dati
Gestione dell’I/O:
L’OS permette di caricare i driver delle periferiche per aumentare le performance dell’I/O
L’OS permette nei computer moderni inoltre di gestire unità esterne, come lettori o hard disk
Networking
I processori nell’OS sono collegati attraverso una comunicazione network, che usano un protocollo. In questo modo incrementano le caratteristiche del sistema (tempo, gestione dati,.)
Il Command – Interpreter System è il programma che legge ed esegue comandi dati all’OS (DOS o Shell)
La protezione del sistema controlla l’accesso da programmi, processi e le risorse sia del sistema sia dell’utente.
L’accounting si tiene aggiornato sui documenti usati e preferiti dall’utente
Struttura del Sistema Operativo
• Monolitico (non diviso in moduli) MS-DOS : scritto per offrire maggiori funzionalità nel minor spazio UNIX: limitato alle funzionalità hardware e costituito dai programmi del sistema e dal kernel (consiste di qualsiasi cosa al di sotto dell’interfaccia call-system e al di sopra dell’hardware fisico e provvede al sistema, schedulazione della CPU, gestione della memoria e altre funzioni dell’OS)
• Impostazione su livelli: l’OS è diviso in un certo numero di livelli, ciascuno costruito in cima al livello minore. Il livello minore (livello 0) è l’hardware; quello maggiore (Livello N) è l’interfaccia utente.
• Organizzazione con Microkernel : movimento tanto funzionale tanto possibile dal kernel nello spazio dell’ “utente”. Gestisce la memoria principale, l’I/O, l’IPC (Inter Process Communication). Consente maggiore affidabilità (aspetto modulare, semplicità di aggiungere services e possibilità di testare i mcrokernel) e portabilità
La Virtual Machine:
• Elabora l’hardware e il kernel dell’OS come se fossero tutti hardware.
I processi
Un processo include tre segmenti:
• il programma: codice/testo
• i dati: variabili del programma
• stack: per le chiamate di procedura e passaggio di parametri
Process Control Block (PCB):
• Informazione associata ad ogni processo
• PCB è l’insieme dei dati che necessita l’OS per il controllo del processo
• informazione di locazione del processo (indica in quale indirizzo è inserita l’immagine del processo)
• informazione di identificazione del processo (PID, identificatore del processo; UID, identificatore dell’utente; PPID identificatore del processo che crea un altro processo)
• informazione di stato del processo (PSW, program status word)
• informazione di controllo del processo (lo stato, la priorità del processo e il motivo per cui sta aspettando)
Gli stati del processo:
• Running State: il processo é in esecuzione
• Ready State : il processo é pronto per essere eseguito
• Blocked / Waiting State: il processo viene interrotto a causa di qualche evento
• New State : l’OS preparato il processo per l’esecuzione (PID, tabelle per gestione del processo, inizializzazione della PCB) non lo esegue ancora, perché le risorse sono limitate
• Exit / Terminated State: il processo terminato viene spostato in questo stato e quando non è più necessario e viene eliminato
Passaggi di stato:
• Ready => Runing : al momento opportuno, il dispatcher seleziona un nuovo processo da eseguire
• Running => Ready : il processo ha finito il suo tempo di esecuzione o il processo viene interrotto perché ve ne è un altro di maggior priorità nello Ready State
• Running => Blocked : il processo richiede qualcosa per il quale deve aspettare (ad es. a causa di periferiche ancora non avviate, attesa di un risultato di I/O, .)
• Blocked => Ready : si verifica l’evento che il processo stava aspettando
I processi creati da altri processi vengono eseguiti insieme ai processi “genitori” e quest’ultimi devono aspettare che i processi “figli” terminino.
L’OS può far terminare un processo sia per motivi di hardware (memoria insufficiente, errore I/O, ) sia per motivi legati al processo stesso (istruzioni non valide, processi genitori che chiedono di terminare i processi figli, processi padri che terminano causando anche il termine dei processi figli,.)
Schedulers
Long-term sheduler (o scheduler di jobs):
• seleziona il processo da inserire nella coda del Ready State
• viene utilizzato in pochissime occasioni (+ lento)
• controlla il livello del multiprogramming
Medium-term sheduler (o scheduler di emergenza):
• seleziona il job/processo da swappare fuori
Short-term scheduler (o scheduler della CPU):
• seleziona il processo da eseguire in seguito e distribuisce la CPU
• viene utilizzato molto frequentemente (+ veloce)
Swapping : Tutti i processi devono essere nella memoria principale, ma ciò provoco un deterioramento della performance del sistema, quindi l’OS sospende qualche processo spostandoli in un primo momento fuori dal disco per poi farli ritornare indietro.
Ready => Running (CPU) => Blocked Suspend (Swap out) => Ready Suspend (Swap in) => Ready (nessun processo nella memoria)=>.
Task e Threads
Voci di un task:
• indirizzo di spazio che tiene l’immagine del processo
• variabili globali
• accesso protetto ai file, I/O e altre risorse
Voci di un thread:
• stato di esecuzione (running, ready, …)
• program counter, register set
• stack di esecuzione
Caratteristiche dei thread:
• ha un stato/contesto di esecuzione
• il contesto del thread è salvato quando non é in esecuzione
• ha l’accesso allo spazio di indirizzo alla memoria e alle risorse del suo task
• Tre stati chiave: running, ready, blocked
• Il termine di un task, termina tutti i threads all’interno del task
Single threading : quando l’OS non riconosce il concetto di thread
Multithreading : quando l’OS supporta multipli threads di esecuzione all’interno di un singolo processo
MS – DOS => un processo per utente e un thread
Il primo UNIX => multipli processi per utente, ma un thread per processo
Solaris e Windows NT => multipli threads
Benefici dei threads :
• Considerando un applicazione che consiste di più parti indipendenti che non hanno bisogno di essere eseguiti in sequenza, quando un thread é bloccato aspettando un I/O, l’esecuzione può passare a un altro thread della stesso applicazione.
• Poiché i threads all’interno di uno stesso processo dividono memoria e files, ciascuno può interagire con ciascun altro senza usare il kernel
• I threads permettono attività parallele all’interno di un singolo spazio di indirizzo
• Per creare ed eliminare un thread si impiega meno tempo di un processo
• Lo switch tra due threads é più veloce che tra due processi
• La comunicazione e la sincronizzazione tra threads é molto veloce
Un programma deve essere portato dentro la memoria principale e collocato all’interno di un processo che lo rappresenta, per essere in seguito eseguito.
Memory menagement é il task portato fuori dall’OS e dall’hardware per ospitare” multipli processi nella memoria principale.
I processi dell’utente passano attraverso numerosi steps prima di essere in grado di eseguirli. Questo processo multi – step del programma richiede utility appropriate e genera il modulo richiesto a ciascun step
Moduli d’oggetto : inizialmente ciascun modulo di oggetto ha un suo spazio di indirizzo. Tutti gli indirizzi sono relativi all’inizio del modulo
Collegamenti statici : il linker usa tabelle nel modulo d’oggetto per collegare moduli in un singolo spazio di indirizzo lineare
Collegamenti dinamici : il collegamento dei moduli esterni é fatto dopo la creazione del modulo caricato (exe)
Quando la dimensione del programma é più grande rispetto alla quantità di memoria allocata per questo, ci sono due soluzioni: overlays e linking dynamic
• Overlays : prende in memoria solatanto la overlay (quelle istruzioni e dati che ci sono). Le overlays possono essere usate solo per programmi che si adattano a questo modello (es. compilatori, programmi multi-passing)
• Dynamic Linking : utile quando una grande quantità di codice é necesasria per handle infrequently occurring cases.
Requisiti della memory menagement:
Se solo pochi processi possono essere tenuti nella memoria principale, nella maggior parte di tempo tutti i processi devono aspettare un I/O e la CPU deve essere idle.
Perciò la memoria ha bisogno di essere allocata efficientemente in modo tale da trasportare tanti processi quanto più possibile. Ha bisogno quindi un supporto aggiuntivo per:
• Rilocazione : il programmatore non può sapere dove il programma sarà inserito nella memoria quando sarà eseguito, quindi i riferimenti della memoria fisica non possono essere sempre fissati da un processo. Questo problema viene risolto distinguendo indirizzi logici (riferimenti alla locazione di memoria indipendenti dalla organizzazione fisica della memoria) da indirizzi fisici (locazione fisica nella memoria principale). I compilatori infatti producono un codice in cui tutti i riferimenti sono indirizzi logici.
Il relative address (indirizzo relativo) é un esempio di indirizzo logico in cui l’indirizzo é espresso come una locazione relativa a un certo punto conosciuto nel programma (come l’inizio).
Protezione : i processi non sono capaci di spostare il riferimento alla locazione della memoria in un altro processo senza un permesso