Sistemi operativi Un Sistema Operativo (abbreviato come SO o OS dall’inglese Operating System) è quella componente software di un computer responsabile della gestione e coordinamento di tutte le attività e la condivisione delle risorse hw/sw di un computer. Uno dei suoi scopi principali è quello di gestire l’interazione tra l’uomo e la macchina nascondendo i dettagli delle operazioni hardware. Utente Applicazioni Hardware Sistemi Operativi Prof. Paolo Michelini Primi sistemi operativi Monitor: il primo tipo di sistema operativo mai implementato su un computer con un’interfaccia interattiva minima per impartire i comandi. Permette solo di scrivere in memoria il programma da eseguire e di lanciarlo. Spesso i suoi comandi sono semplici chiamate dirette a sottoprogrammi in linguaggio macchina. Si limita a inizializzare il sistema ed a rimanere poi in attesa di comandi, cedendo il controllo completo della macchina ai programmi che vengono lanciati. Interprete: è un interprete di comandi o di un semplice linguaggio di programmazione che funge da interfaccia utente (shell). Con questa interfaccia è possibile creare delle liste di comandi interpretati ed eseguiti lasciando libero l’interprete di eseguire altri comandi (comandi batch). DOS (Disk Operating Systems): un computer diventa molto più utile ed efficace se dotato di una memoria di massa e di un software (file system) che permetta di organizzare e gestire i dati sui mezzi di memorizzazione secondo una struttura ben precisa. I sistemi operativi che risiedevano su disco e capaci di gestire un file system sono detti genericamente Disk Operating Systems, cioè DOS appunto. Il più famoso è il MS-DOS della Microsoft, oggi non più in uso ed evolutosi negli anni nelle varie versioni di Windows, fino alla attuale Windows 7. Sistemi Operativi Prof. Paolo Michelini Principali componenti di un sistema operativo Un generico sistema operativo moderno si compone di: Il kernel Un gestore di file system Uno scheduler Un gestore di memoria Un'interfaccia utente (shell o GUI) Sistemi Operativi Prof. Paolo Michelini Kernel Il kernel è il nucleo di un sistema operativo. Si tratta di un software che offre a) le funzioni fondamentali ai moduli che compongono il sistema operativo e ai programmi in esecuzione sul computer (chiamati processi o task) e b) un'interfaccia uniforme verso l'hardware tale da nascondere la complessità di accesso e gestione dello stesso. Sistemi Operativi Microkernel: il kernel implementa soltanto un numero molto ristretto di funzioni, delegando il resto ad altre parti. Il vantaggio di un sistema operativo microkernel è la semplicità del suo kernel e la possibilità di cambiare facilmente i moduli e che se un modulo crolla non crolla tutto il sistema; lo svantaggio è l'interazione più complessa e costosa fra il kernel e le altre componenti del S.O. stesso, che spesso rallenta il sistema. Kernel monolitico (tradizionale): integra dentro di sé la gestione della memoria, dei processi e dei file su disco, nonché il software necessari per il controllo di tutte le periferiche collegate (driver). Questo tipo di kernel è più complesso da progettare, mantenere ed aggiornare, ma è anche più veloce ed efficiente. Kernel modulari (evoluzione dei monolitici): mantengono al loro interno i moduli fondamentali di gestione (memoria, processi e file su disco), ma separano alcune funzioni non essenziali in moduli a sé stanti, da caricare in memoria solo in caso di effettivo uso della funzione o periferica di loro competenza. Prof. Paolo Michelini File System Il File System si occupa del modo in cui i file sono immagazzinati e organizzati su un dispositivo di archiviazione, come un hard-disk o un CD-ROM. Esistono molti tipi di file system, creati per diversi sistemi operativi, per diverse unità di memorizzazione e per diversi usi. Si possono identificare due grandi classi di file system: file system per unità locali, destinate ad organizzare fisicamente i dati su un disco, e i file system distribuiti, nati per condividere i dati fra più computer collegati attraverso una rete, superando le differenze fra sistemi operativi e filesystem locali delle varie macchine. Esempi di Filesystem per unita’ locali: Ext3, JFS (Linux) FAT, FAT32, NTFS (Windows) HFS+ (Mac OSX) Filesystem distribuiti Sistemi Operativi NFS (Network File Sysyem) AFS (Andrew File System) Prof. Paolo Michelini Scheduler - multitasking Lo scheduler è il componente fondamentale dei sistemi operativi multitasking, cioè quelli in grado di eseguire più processi/task contemporaneamente. Se, ad esempio, viene chiesto al sistema di eseguire contemporaneamente due processi A e B, la CPU eseguirà per qualche istante il processo A, poi per qualche istante il processo B, poi tornerà ad eseguire il processo A e così via. In questo modo abbiamo la sensazione che i processi siano eseguiti allo stesso tempo in parallelo. Lo scheduler si occupa di gestire lo stato dei processi come, ad esempio, fare avanzare un processo interrompendone temporaneamente un altro (ad esempio per una richiesta di I/O), realizzando così un cambiamento di contesto (context switch). Al cambio di task il sistema operativo è costretto a salvare tutti o quasi i registri della CPU e ricaricarli con quelli salvati dal task che subentra. Esistono vari algoritmi di scheduling che permettono di scegliere nella maniera più efficiente possibile quale task far proseguire. Sistemi Operativi Prof. Paolo Michelini Tipologie di multitasking Esistono sostanzialmente due modi di implementare il multitasking: cooperative (cooperativo) e preemptive (con prelazione). Nel primo, non più utilizzato, sono i programmi che cedono spontaneamente il controllo al sistema non appena hanno terminato la singola operazione in corso (es: Windows 3.1); nel secondo è lo scheduler che ferma i programmi allo scadere del quanto di tempo assegnato e trasferisce il controllo dall'uno all'altro (adottato dalla maggior parte dei sistemi operativi moderni) Il preemptive multitasking necessita di CPU che implementino in hardware sia i livelli di privilegio per l'esecuzione del codice, sia una logica specifica per il cambio di task (context switch) eseguito dallo scheduler . Al cambio di task il sistema operativo è costretto a salvare tutti o quasi i registri della CPU e ricaricarli con quelli salvati dal task che subentra, perdendo molto tempo. A fronte di queste maggiori richieste, il preemptive multitasking offre una sicurezza del sistema molto maggiore rispetto al cooperative ed una (virtuale) immunità ai crash di tutto il sistema causati da errori nei singoli programmi in esecuzione. Sistemi Operativi Prof. Paolo Michelini Gestore della memoria Il gestore di memoria è la componente del sistema operativo che si occupa di gestire ed assegnare la memoria ai processi che ne fanno richiesta. La gestione della memoria è necessaria per tenere traccia di quanta memoria è impegnata e di quanta invece è disponibile per soddisfare nuove richieste: in mancanza di un sistema di gestione, si avrebbe prima o poi il caso di processi che ne sovrascrivono altri, con gli ovvi inconvenienti. Un altro buon motivo per registrare la memoria usata dai vari processi è il fatto che in caso di errori gravi i processi possono andare in crash e non essere più in grado di comunicare al sistema che la memoria che occupano può essere liberata: in questo caso è compito del gestore di memoria, dopo la terminazione anomala del processo, marcare come libere le zone di memoria possedute dal processo "defunto", rendendole disponibili per nuove allocazioni. Per poter gestire i programmi, divenuti processi, è necessario che tutti gli indirizzi definiti in essi siano calcolati in forma relativa alla prima istruzione del programma (come se il programma dovesse essere caricato a partire dall’indirizzo 0 di memoria centrale.) Al momento del caricamento, che può essere eseguito in qualsiasi zona libera della memoria, gli indirizzi relativi verranno sommati al primo indirizzo di effettivo caricamento, diventando così assoluti: INDIRIZZO ASSOLUTO = INDIRIZZO RELATIVO + INDIRIZZO DI PARTENZA Sistemi Operativi Prof. Paolo Michelini Memoria virtuale Dovendo ospitare in memoria centrale più programmi nello stesso tempo, i sistemi multitask hanno bisogno di più memoria rispetto a quelli monotask. Per far ciò si può utilizzare un'architettura a memoria virtuale, capace di simulare uno spazio di memoria centrale maggiore di quello fisicamente presente In questo caso, il gestore della memoria si occupa anche di mappare (INDIRIZZARE) la memoria virtuale offerta ai programmi sulla memoria fisica e sui dischi rigidi del sistema, copiando da memoria a disco rigido e viceversa le parti di memoria necessarie di volta in volta ai programmi, senza che i programmi stessi o gli utenti debbano preoccuparsi di nulla. Questa operazione è normalmente gestita via hardware tramite una MMU, (Memory Management Unit), generalmente integrata all'interno della CPU. Sistemi Operativi Prof. Paolo Michelini Interfaccia utente Interfaccia utente: si tratta di un programma che permette all'utente di interagire con il computer. Esistono sostanzialmente due famiglie di interfacce utente: interfaccia a linea di comando e interfacce grafiche (GUI = Graphic User Interface) L'interfaccia a linea di comando (shell o terminale) è l'ambiente di lavoro attraverso il quale è possibile impartire al computer comandi e richiedere l'esecuzione di programmi in modo puramente testuale (es: DOS) Con le GUI l'interazione con il computer non avviene più in modo testuale, ma operando su icone e finestre che permettono di fare operazioni complesse con un clic del mouse (es: GNOME e KDE nei sistemi Unix e Unix-like, Finder in Mac OS e Windows Explorer nei sistemi Microsoft Windows) Sistemi Operativi Prof. Paolo Michelini Sistemi operativi multiutente Sistema multiutente: se un computer può far girare più programmi contemporaneamente, allora può anche accettare comandi da più utenti contemporaneamente. I problemi di sicurezza di questi sistemi si risolvono assegnando un account univoco per ogni utente, assegnando un proprietario ai file ed ai programmi con un sistema di permessi per l'accesso ad essi e prevedendo una gerarchia di utenti (cioè di account). Così facendo, il sistema rifiuterà tutti i comandi potenzialmente "pericolosi" e li accetterà soltanto se impartiti da un utente in cima alla gerarchia, cioè l'amministratore del sistema (generalmente l'account root nei sistemi Unix, Administrator nei sistemi Windows). Sistemi Operativi Prof. Paolo Michelini Sistemi operativi real-time Sistema operativo real-time: è un particolare tipo di sistema operativo in grado di garantire una risposta entro un dato tempo limite (millisecondi o microsecondi) a qualunque evento esterno. Non hanno memoria virtuale Per gestire le periferiche, i sistemi real-time usano spesso, al posto degli interrupt, il così detto polling (verifica ciclica di tutte le unità di input/output), meno efficiente, ma deterministico I sistemi real-time sono normalmente utilizzati in ambito industriale dove è necessario ottenere una risposta dal sistema in un tempo massimo prefissato. Sistemi Operativi Prof. Paolo Michelini Sistemi operativi distribuiti Tra le varie ipotesi d'uso di un sistema operativo c'è anche la possibilità di sistemi distribuiti in rete. In tal caso la computazione viene distribuita tra più computer collegati in rete tra loro. In questo modo le risorse e il carico computazionale vengono condivise e bilanciate, si ottiene una maggiore affidabilità e i costi sono più contenuti nella scalabilità. Una configurazione funzionalmente simmetrica permette che tutte le macchine componenti abbiano lo stesso ruolo nel funzionamento del sistema e lo stesso grado di autonomia. Una approssimazione pratica di questa configurazione è il clustering. Sistemi Operativi Prof. Paolo Michelini