Il sistema operativo è il software di base che gestisce i dispositivi hardware del computer e l'esecuzione dei software applicativi. Senza il sistema operativo l'hardware sarebbe inutilizzabile e i programmi ineseguibili. Già nel 1500 Leonardo da Vinci aveva pensato a cambiare il rullo che con le proprie camme muoveva il telaio. Ad ogni rullo corrispondeva una trama diversa. Se immaginiamo il rullo come un programma, allora l’interruzione della lavorazione, la rimozione del rullo, la sua sostituzione con un altro rullo e il riavvio della macchina corrisponde esattamente a ciò che fa migliaia di volte al secondo un sistema operativo. Il sistema operativo ha il compito di frapporsi sistematicamente tra la macchina e l’utilizzatore della stessa per assolvere a tutte le elaborazione essenziali a rendere fruibili, al secondo, le risorse fisiche della prima mediante: la gestione delle risorse hardware, la gestione del colloquio tra l'utilizzatore e la macchina fisica, l'esecuzione di altri software applicativi. Per capire il ruolo del sistema operativo occorre pensare che, essendo un programma, potremmo creare sistemi operativi diversi per la stessa macchina (quindi per lo stesso hardware) e che ognuno potrebbe rispondere a gestioni ed a virtualizzazioni dell’hardware assai diverse. In questo caso ciò che vedrebbe l’utente non sarebbe la macchina, uguale, sotto di sé ma ciò che il sistema operativo gli offre nel suo processo di virtualizzazione delle risorse fisiche e della loro gestione. Per questo motivo il sistema operativo deve essere caricato in memoria centrale, prima di ogni altro software; generalmente viene caricato dal disco fisso (hard disk), ma può essere caricato anche da floppy disk, da Cd, o direttamente dal Firmware che lo contiene . Il sistema operativo è un programma costruito a strati: con i primi , quelli più bassi, si occupa di gestire e comandare direttamente le risorse hardware. Gli strati successivi, quelli più alti, colloquiano con l’utente attraverso standard di scambi comunicativi “più umani” per poi tradurre i comandi ricevuti dall’utente agli strati più bassi. Un programma che voglia accedere ad una risorsa hardware non deve interagire con la periferica stessa, bensì è sufficiente che invii la richiesta nel giusto modo al sistema operativo affinché sia poi quest’ultimo a portare avanti la richiesta ottimizzando l’utilizzo delle risorse fisiche in funzione delle richieste che gli pervengono da parte di tutti i processi attivi nella macchina. Le componenti principali di un sistema operativo sono: Kernel. Il Kernel è lo strato più basso, il primo a venire caricato, contiene le funzioni di base necessarie e sufficienti a far funzionare tutte le altre componenti del sistema operativo e a schedulare i processi. Gestione della memoria. La memoria fisica deve essere gestita in modo tale da essere condivisa tra più programmi concorrenti per i quali deve registrare i dati temporanei ed ospitarne il codice. Input / Output. Gestisce le periferiche del computer (processi di input/output da e verso le periferiche collegate al sistema come l’hard disk, CD-ROM, memorie di massa di diversa tecnologia, stampanti, scanner, etc…) File System. Il File System è il sistema di gestione e di accesso alle memorie di massa del computer (hard disk, periferiche). Una volta risolto l’accesso alle periferiche, il file system risponde al problema della ricerca dei dati in tali memorie. Shell. Lo shell è il programma che gestisce il colloquio (interfaccia) con l’utente e che ne interpreta i comandi espressi secondo la sintassi utilizzata nel processo di virtualizzazione. Multiutenza. Gestione di più utenti concorrenti. Kernel Il Kernel contiene l’insieme di funzionalità che effettuano la prima virtualizzazione della macchina fisica e si può dire che il Kernel sia l’unico strato software che “vede” quest’ultima. Ogni strato successivo potrà vedere ancora la macchina fisica, ma certamente si avvarrà della virtualizzazione effettuata dal Kernel. Ci sono due correnti di pensiero predominanti: quella che ritiene più vantaggioso sviluppare un Kernel ricco di funzionalità per ottimizzare il funzionamento della macchina ed il suo processo di virtualizzazione, detto Kernel Monolitico, e quella che ritiene più vantaggioso lo sviluppo di un micro Kernel con le funzionalità minime necessarie demandando ogni altra virtualizzazione a strati successivi che siano quindi staccati dalla macchina fisica e agiscano sulla macchina creata dal micro Kernel. Modello ONION SKIN Le richieste dei processi, che portano avanti le richieste dell’utente, giungono al sistema operativo e da questo sono gestite rispettando le politiche pensate per ottimizzare l’utilizzo delle risorse. Il modello "onion skin" (buccia di cipolla) rappresenta il sistema operativo come una successione di strati che rivestono l’hardware della macchina. Ogni livello è visto come una virtualizzazione della macchina fisica capace di utilizzare sia la macchina fisica stessa che ogni funzionalità “virtuale” aggiunta dagli strati sottostanti del sistema operativo. Ovviamente il primo strato sfrutta solo l’hardware, mentre l’ultimo strato può sfruttare già molte funzioni inesistenti nella macchina fisica e che sono state rese disponibili dai moduli del sistema operativo appartenenti agli strati sottostanti. Ogni strato è denominato modulo ed è una collezione di routines (procedure) che gestiscono e comandano i meccanismi fisici necessari per risolvere problemi di tipo logico e quindi per costruire una macchina che non c’è. Questo processo si chiama processo di virtualizzazione. Interprete File System Periferiche Memoria Centrale Kernel L’utente vede questa macchina (quella virtualizzata dal S.O.) e non quella vera, contenuta sotto tutti gli strati.